← 기술 블로그 목록으로 돌아가기
#950 • System Performance & MITRE ATT&CK Persistence Defense Architecture

부팅 10초 단축과 악성 지속성(Persistence) 0초 차단: ZeliStartup의 HKCU·HKLM 4대 시작프로그램 순회와 비파괴적 레지스트리 거버넌스 아키텍처

"컴퓨터실 PC 40대를 켤 때마다 메신저·게임 런처·정체불명의 백그라운드 프로세스가 동시 실행되어 수업 시작이 5분씩 지연된 적이 있으십니까?" CCleaner 등 외부 유틸리티의 관리자 권한(UAC) 장벽과 영구 삭제 위험을 원천 차단하는 Zero-Install 온디바이스 시작프로그램 거버넌스 엔진, HKCU와 HKLM 레지스트리의 Run 키 듀얼 로드, SecurityException 샌드박싱을 통한 읽기 전용 안전 탐색, 사용자 및 공용 시작 폴더(.lnk, .exe, .bat, .cmd) 4대 경로 통합 스캔, startup_disabled.txt 기반의 비파괴적(Non-destructive) 가역 복원 토글 파이프라인, 그리고 스마트 인자 정제와 explorer.exe /select 위치 추적 아키텍처 백서.

"초·중·고 정보 수업 종이 울리고 학생들이 전원 버튼을 누르면, 바탕화면이 뜨자마자 카카오톡, 디스코드, 게임 자동 패처, 정체 모를 보안 프로그램, 불법 애드웨어가 서로 먼저 실행되겠다고 하드디스크와 CPU를 100% 점유합니다. 담당 교사는 윈도우 작업 관리자를 열어보지만 시작 폴더 항목은 비어 있고, 레지스트리(regedit)를 직접 건드리자니 잘못 지워 윈도우가 부팅되지 않을까 두렵습니다. CCleaner 같은 프로그램을 깔자니 관리자 권한(UAC)이 막히고 유료 라이선스 단속 대상이 됩니다. ZeliStartup은 단 1바이트의 외부 바이너리 없이, 4대 시작프로그램 경로를 0초 만에 분석하고 언제든 100% 되돌릴 수 있는 안전한 비파괴적 거버넌스를 제공합니다."

1. 학교 실습실과 군부대 PC의 부팅 지연 잔혹사: "왜 PC를 켜는 데 3분이나 걸리는가?"

수많은 사용자가 번갈아 사용하는 공용 PC와 보안 폐쇄망 단말기는 시간이 지날수록 부팅 시간이 기하급수적으로 늘어납니다:

2. 사이버 침해 사고의 온상: 악성코드와 애드웨어의 핵심 공격 벡터 '지속성(MITRE ATT&CK T1547.001)'

부팅 지연은 단순한 속도 문제에 그치지 않습니다. 사이버 보안 관점에서 시작프로그램은 해커들이 가장 선호하는 지속성(Persistence) 유지 통로입니다.

글로벌 사이버 보안 프레임워크인 MITRE ATT&CK의 T1547.001 (Boot or Logon Autostart Execution: Registry Run Keys / Startup Folder) 기법에 명시되어 있듯이, 악성코드·코인 채굴기(Cryptojacker)·트로이목마는 재부팅 후에도 살아남기 위해 반드시 시작 레지스트리 키나 시작 프로그램 폴더에 바로가기(.lnk)를 은밀하게 삽입합니다.

flowchart TD subgraph ATTACK["⚠️ MITRE ATT&CK T1547.001 지속성(Persistence) 공격 벡터"] MAL["악성코드 / 애드웨어 침투"] --> R1["HKCU Run 레지스트리 은닉"] MAL --> R2["HKLM Run 레지스트리 은닉"] MAL --> S1["사용자 시작 폴더 (.lnk 은닉)"] MAL --> S2["공용 시작 폴더 (.bat / .cmd 은닉)"] end subgraph ENGINE["🛡️ ZeliStartup 온디바이스 4계층 거버넌스 엔진"] direction TB R1 & R2 & S1 & S2 --> SCAN["통합 순회 & 확장자 정밀 식별 (.exe, .lnk, .bat, .cmd)"] SCAN --> PARSE["실제 실행 파일 경로 추출 (인자/따옴표 제거)"] PARSE --> SAFE["비파괴적 비활성화 (startup_disabled.txt 원자적 캐싱)"] SAFE --> LOC["explorer.exe /select 실제 파일 위치 즉각 검증"] end classDef attack fill:#3b0764,stroke:#a855f7,stroke-width:2px,color:#f3e8ff; classDef engine fill:#0f172a,stroke:#6366f1,stroke-width:2px,color:#c7d2fe; class ATTACK attack; class ENGINE engine;

3. 4대 시작프로그램 경로 통합 검색 아키텍처: 레지스트리 2계층과 특수 시작 폴더 2계층

Windows 운영체제에서 시스템 부팅 및 사용자 로그인 시 프로그램을 구동시키는 공식 경로는 크게 4군데로 나뉩니다. 기존 도구들은 이 중 일부만 보여주거나 경로가 파편화되어 종합적인 진단이 어려웠습니다.

ZeliStartup은 단일 뷰포트에서 Windows의 4대 시작 지점을 완전히 동기화하여 수집합니다:

  1. HKCU 레지스트리: HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Run (현재 로그인된 사용자 전용 시작 항목)
  2. HKLM 레지스트리: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run (모든 사용자에게 공통 적용되는 시스템 전체 시작 항목)
  3. 사용자 시작 폴더: Environment.SpecialFolder.Startup (%APPDATA%\Microsoft\Windows\Start Menu\Programs\Startup)
  4. 공용 시작 폴더: Environment.SpecialFolder.CommonStartup (%PROGRAMDATA%\Microsoft\Windows\Start Menu\Programs\Startup)
C# ZeliStartup/Views/ZeliStartupWindow.xaml.cs — 4대 경로 로딩 엔진
private void LoadStartupItems()
{
    _items.Clear();

    // 1) 레지스트리: 현재 사용자 (HKCU) - 편집 및 비활성화 가능
    LoadRegistryRun(
        Registry.CurrentUser,
        @"SOFTWARE\Microsoft\Windows\CurrentVersion\Run",
        Loc.Get("Startup_RegistryUser"));

    // 2) 레지스트리: 전체 시스템 (HKLM) - 읽기 전용 로드 (권한 격리)
    LoadRegistryRun(
        Registry.LocalMachine,
        @"SOFTWARE\Microsoft\Windows\CurrentVersion\Run",
        Loc.Get("Startup_RegistrySystem"));

    // 3) 시작 폴더 (사용자 개인 Startup Folder)
    LoadStartupFolder(
        Environment.GetFolderPath(Environment.SpecialFolder.Startup),
        Loc.Get("Startup_FolderUser"));

    // 4) 공용 시작 폴더 (모든 사용자 Common Startup Folder)
    string commonStartup = Environment.GetFolderPath(Environment.SpecialFolder.CommonStartup);
    if (Directory.Exists(commonStartup))
    {
        LoadStartupFolder(commonStartup, Loc.Get("Startup_FolderCommon"));
    }

    TxtStatus.Text = Loc.Get("Startup_ListLoaded");
    TxtCount.Text = string.Format(Loc.Get("Startup_TotalCount"), _items.Count);
}

4. SecurityException 권한 샌드박싱: UAC 승격 없는 일반 사용자 모드 격리 보호

공교육 및 공공기관 PC에서는 사용자가 시스템 레지스트리(HKLM)를 수정할 권한이 없습니다. 상용 프로그램들이 관리자 권한(UAC)을 요구하며 에러를 뿜거나 실행이 차단되는 이유가 바로 여기에 있습니다.

ZeliStartup은 RegistryKey.OpenSubKey(subKeyPath, writable: false)를 사용하여 HKLM을 순수 읽기 모드로 안전하게 열고, 혹시 모를 권한 예외를 System.Security.SecurityException 샌드박스로 가두어 앱의 중단 없이 부드럽게 순회합니다:

C# ZeliStartup/Views/ZeliStartupWindow.xaml.cs — SecurityException 안전 격리 순회
private void LoadRegistryRun(RegistryKey root, string subKeyPath, string source)
{
    try
    {
        using var key = root.OpenSubKey(subKeyPath, false); // 읽기 모드로 안전하게 오픈
        if (key == null) return;

        foreach (string valueName in key.GetValueNames())
        {
            string command = key.GetValue(valueName)?.ToString() ?? "";
            if (string.IsNullOrWhiteSpace(command)) continue;

            _items.Add(new StartupItem
            {
                Name = valueName,
                Command = command,
                Source = source,
                RegistryPath = $"{(root == Registry.CurrentUser ? "HKCU" : "HKLM")}\\{subKeyPath}",
                RegistryValueName = valueName,
                IsEnabled = true
            });
        }
    }
    catch (System.Security.SecurityException)
    {
        // 일반 사용자 계정 권한 부족 시 조용히 통과 (애플리케이션 크래시 원천 방지)
    }
    catch (Exception ex)
    {
        System.Diagnostics.Debug.WriteLine($"[ZeliStartup] Registry read error: {ex.Message}");
    }
}

5. 비파괴적(Non-destructive) 토글 거버넌스: startup_disabled.txt 원자적 캐싱과 100% 안전 가역 복원

일반적인 최적화 도구의 가장 치명적인 결함은 "비활성화 = 레지스트리 영구 삭제"라는 점입니다. 오디오 드라이버나 터치패드 보정 도구를 실수로 껐다가 다시는 되돌리지 못해 윈도우를 포맷해야 하는 사고가 허다했습니다.

ZeliStartup은 가역적(Reversible) 비파괴 거버넌스 원칙을 준수합니다. 토글 스위치를 끄면, 레지스트리 키를 지우기 직전에 로컬 사용자 앱데이터 폴더(%LOCALAPPDATA%\ZeliDesk\startup_disabled.txt)에 원본 실행 명령어 전체를 원자적으로 기록(Cache)합니다:

sequenceDiagram autonumber actor User as 교사 / 관리자 participant UI as ZeliStartup ToggleSwitch participant Cache as startup_disabled.txt participant Reg as HKCU Run 레지스트리 Note over User,Reg: [비활성화 시나리오 - 비파괴적 분리] User->>UI: 시작프로그램 토글 OFF 클릭 UI->>Cache: SaveDisabledValue("KakaoTalk", "\"C:\\...\\KakaoTalk.exe\"") Cache-->>UI: 원자적 파일 저장 완료 UI->>Reg: DeleteValue("KakaoTalk", false) Reg-->>UI: 레지스트리에서 안전 제거 (부팅 지연 0초 달성) Note over User,Reg: [복원 시나리오 - 100% 원본 복구] User->>UI: 시작프로그램 토글 ON 클릭 UI->>Cache: LoadDisabledValue("KakaoTalk") Cache-->>UI: 캐시된 원본 명령어 문자열 반환 UI->>Reg: SetValue("KakaoTalk", savedCommand) Reg-->>UI: 레지스트리 원상 복구 완료
C# ZeliStartup/Views/ZeliStartupWindow.xaml.cs — 비파괴적 토글 및 원자적 캐싱
private void StartupToggle_Toggled(object sender, RoutedEventArgs e)
{
    if (sender is ToggleSwitch toggle && toggle.Tag is StartupItem item)
    {
        try
        {
            if (!string.IsNullOrEmpty(item.RegistryValueName) && item.Source == Loc.Get("Startup_RegistryUser"))
            {
                using var key = Registry.CurrentUser.OpenSubKey(
                    @"SOFTWARE\Microsoft\Windows\CurrentVersion\Run", true);
                if (key == null) return;

                if (item.IsEnabled)
                {
                    // 1. 복원: 캐시 파일에서 저장해둔 원본 값 다시 쓰기
                    string saved = LoadDisabledValue(item.RegistryValueName);
                    if (!string.IsNullOrEmpty(saved))
                    {
                        key.SetValue(item.RegistryValueName, saved);
                        item.Command = saved;
                        TxtStatus.Text = string.Format(Loc.Get("Startup_Enabled"), item.Name);
                    }
                }
                else
                {
                    // 2. 비활성화: 원본 명령어 안전 보관 후 레지스트리에서 제거
                    SaveDisabledValue(item.RegistryValueName, item.Command);
                    key.DeleteValue(item.RegistryValueName, false);
                    TxtStatus.Text = string.Format(Loc.Get("Startup_Disabled"), item.Name);
                }
            }
        }
        catch (Exception ex)
        {
            TxtStatus.Text = string.Format(Loc.Get("Startup_Error"), ex.Message);
            item.IsEnabled = !item.IsEnabled; // 에러 시 UI 롤백
        }
    }
}

6. 스마트 인자(Argument) 정제와 explorer.exe /select 원터치 파일 위치 하이라이팅

시작프로그램 명령어는 단순한 경로가 아닙니다. "C:\Program Files\App\test.exe" /minimized -autostart와 같이 큰따옴표와 여러 개의 커맨드라인 파라미터가 결합되어 있습니다.

사용자가 이 프로그램이 진짜 어디에 있는 악성 파일인지 확인하고 싶을 때, ZeliStartup은 정교한 문자열 파싱을 통해 따옴표와 인자를 분리해 내고 실제 바이너리 파일만을 정확히 찾아내어 Windows 탐색기(explorer.exe /select)로 해당 파일을 즉시 하이라이트합니다:

C# ZeliStartup/Views/ZeliStartupWindow.xaml.cs — 스마트 파일 추적기
private void BtnOpenLocation_Click(object sender, RoutedEventArgs e)
{
    if (sender is Button btn && btn.Tag is StartupItem item)
    {
        string path = item.Command?.Trim('"') ?? "";
        // 경로 뒤에 공백 인자(Argument)가 붙어 있는 경우 실행 파일 경로만 분리
        if (path.Contains(' ') && !File.Exists(path))
        {
            path = path.Split(' ')[0].Trim('"');
        }

        try
        {
            if (File.Exists(path))
            {
                // Windows 파일 탐색기에서 해당 파일을 선택(Select) 상태로 열기
                Process.Start(new ProcessStartInfo
                {
                    FileName = "explorer.exe",
                    Arguments = $"/select, \"{path}\"",
                    UseShellExecute = true
                });
            }
            else
            {
                TxtStatus.Text = string.Format(Loc.Get("Startup_FileNotFound"), path);
            }
        }
        catch { }
    }
}

7. 기존 시작프로그램 도구(작업 관리자 vs CCleaner vs Sysinternals Autoruns vs ZeliStartup) 비교 분석

교육망 및 국방 전산망에 최적화된 도구를 선택하기 위해 기존 솔루션들과 비교한 결과는 다음과 같습니다:

비교 항목 Windows 작업 관리자 CCleaner (상용) Sysinternals Autoruns ZeliStartup (온디바이스)
배포 및 설치 방식 OS 내장 MSI 인스톨러 설치 필수 ZIP 압축 해제 Zero-Install 무설치 단일 런타임
관리자 권한(UAC) 요구 일부 필요 설치 및 실행 시 필수 레지스트리 수정 시 필수 일반 사용자 계정에서 0초 동작
비파괴적 가역 복원 단순 사용 안 함 토글 완전 삭제 시 복구 불가 언체크 시 키 이름 변경 startup_disabled.txt 원자적 복원
시작 폴더(.lnk/.bat) 통합 제한적 표시 지원 매우 복잡하게 표시 4대 경로 단일 뷰포트 직관적 통합
파일 위치 원터치 추적 우클릭 메뉴 탐색 미지원 점프 기능 제공 explorer.exe /select 즉각 하이라이트
학교·공공 라이선스 단속 무관 상용 라이선스 단속 고위험 상업적 이용 조건부 허용 완전 무상 보급 / 100% 라이선스 프리

8. 결론: "상용 라이선스 단속과 레지스트리 파손 공포 없는 공교육·국방 전산 자산 최적화"

수업 전 5분을 아끼는 것은 학생들의 집중력을 지키는 일이며, 부팅 시 몰래 실행되는 악성 지속성 프로세스를 0초 만에 식별하는 것은 국가 주요 정보 인프라의 사이버 보안을 수호하는 기본입니다.

ZeliDesk의 ZeliStartup은 외부 의존성 없이 순수 C# WinUI 3 네이티브 기술로 개발되어, 일반 사용자 권한에서도 윈도우 시스템의 핵심 부팅 경로를 안전하고 투명하게 통제합니다. 복잡한 시스템 레지스트리를 두려워할 필요 없이, 누구나 단 한 번의 토글로 PC를 첫날처럼 가볍고 안전하게 유지할 수 있습니다.

← 이전 기술 백서 #951 UI 프리징 없는 100만 파일 고속 스캔과 디스크 용량 거버넌스: ZeliTree의 50ms 틱 디바운스 DirectoryScanner와 비동기 계측 아키텍처 다음 기술 백서 → #949 전산실 40대 PC의 스토리지 고갈과 I/O 크래시 조기 경보: ZeliDisk의 DriveInfo 볼륨 텔레메트리와 예외 격리 아키텍처
🚀 ZeliDesk ZeliStartup 온디바이스 시작프로그램 거버넌스 체험하기
PC 부팅 속도를 10초 단축하고, 숨어 있는 악성 지속성 프로그램을 안전하게 무력화하세요.
72종 유틸리티 전체 둘러보기 →