1. 학교 실습실과 군부대 PC의 부팅 지연 잔혹사: "왜 PC를 켜는 데 3분이나 걸리는가?"
수많은 사용자가 번갈아 사용하는 공용 PC와 보안 폐쇄망 단말기는 시간이 지날수록 부팅 시간이 기하급수적으로 늘어납니다:
- 자동 실행 항목의 무분별한 증식: 다양한 학습용 소프트웨어, 문서 편집기, 원격 제어 도구, 디바이스 드라이버 유틸리티가 설치될 때마다 시스템 시작 시 자동 실행(
Run) 레지스트리에 항목을 강제 등록합니다. - 사용자 세션 시작 시 I/O 병목: Windows 로그인 직후 수십 개의 실행 파일(
.exe)이 동시에 디스크에서 메모리로 로드되면서 스토리지가 포화 상태에 빠지고, 수업 시작 후 5~10분이 허무하게 낭비됩니다. - 관리자 권한 부재로 인한 정비 불가: 학교 PC는 보안을 위해 일반 사용자(
User) 계정으로 제한되어 있어, 학생이나 일반 교사가 윈도우 설정을 임의로 변경하거나 전문 클리너 도구를 설치할 수 없습니다.
2. 사이버 침해 사고의 온상: 악성코드와 애드웨어의 핵심 공격 벡터 '지속성(MITRE ATT&CK T1547.001)'
부팅 지연은 단순한 속도 문제에 그치지 않습니다. 사이버 보안 관점에서 시작프로그램은 해커들이 가장 선호하는 지속성(Persistence) 유지 통로입니다.
글로벌 사이버 보안 프레임워크인 MITRE ATT&CK의 T1547.001 (Boot or Logon Autostart Execution: Registry Run Keys / Startup Folder) 기법에 명시되어 있듯이, 악성코드·코인 채굴기(Cryptojacker)·트로이목마는 재부팅 후에도 살아남기 위해 반드시 시작 레지스트리 키나 시작 프로그램 폴더에 바로가기(.lnk)를 은밀하게 삽입합니다.
3. 4대 시작프로그램 경로 통합 검색 아키텍처: 레지스트리 2계층과 특수 시작 폴더 2계층
Windows 운영체제에서 시스템 부팅 및 사용자 로그인 시 프로그램을 구동시키는 공식 경로는 크게 4군데로 나뉩니다. 기존 도구들은 이 중 일부만 보여주거나 경로가 파편화되어 종합적인 진단이 어려웠습니다.
ZeliStartup은 단일 뷰포트에서 Windows의 4대 시작 지점을 완전히 동기화하여 수집합니다:
- HKCU 레지스트리:
HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Run(현재 로그인된 사용자 전용 시작 항목) - HKLM 레지스트리:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run(모든 사용자에게 공통 적용되는 시스템 전체 시작 항목) - 사용자 시작 폴더:
Environment.SpecialFolder.Startup(%APPDATA%\Microsoft\Windows\Start Menu\Programs\Startup) - 공용 시작 폴더:
Environment.SpecialFolder.CommonStartup(%PROGRAMDATA%\Microsoft\Windows\Start Menu\Programs\Startup)
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 샌드박스로 가두어 앱의 중단 없이 부드럽게 순회합니다:
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)합니다:
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)로 해당 파일을 즉시 하이라이트합니다:
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를 첫날처럼 가볍고 안전하게 유지할 수 있습니다.