작업 관리자의 "시작 앱" 탭을 열어 낯선 항목을 모두 사용 안 함으로 바꾸고 재부팅했다. 그런데 부팅이 끝나고 세부 정보 탭을 보니 MagicLine4NX.exe, AnySign4PC.exe, I3GProc.exe 가 그대로 떠 있었다. 시작 앱 탭이 보여 주는 것은 프로그램을 띄우는 여러 길 가운데 하나뿐이기 때문이다. 이번 편은 이 PC 의 보안 프로그램들이 어느 길로 올라오는지 한 장으로 정리한 지도다.

네 가지 길

Windows 에서 프로그램이 사용자가 실행하지 않아도 떠 있게 만드는 방법은 크게 네 가지다.

서비스는 services.exe 가 부팅 때 띄우는 프로그램이다. 로그인 전에 시작할 수 있고, 이 PC 의 보안 프로그램 서비스는 모두 최고 권한인 LocalSystem 계정으로 돌고 있었다. Run 키는 레지스트리의 ...\CurrentVersion\Run 에 실행 명령을 적어 두면 사용자가 로그인할 때 실행되는 방식이다. 작업 관리자의 시작 앱 탭이 주로 보여 주는 것이 이것이다. 예약 작업은 작업 스케줄러에 "로그온할 때 실행" 같은 조건을 걸어 두는 방식이고, 커널 드라이버는 Windows 커널 안에서 동작하는 .sys 파일이다. 드라이버는 프로세스가 아니라서 작업 관리자 어디에도 나오지 않는다.

이 PC 에서 연재에 나온 프로그램을 네 길로 나누어 보면 이렇다.

프로그램 서비스 Run 키 예약 작업 커널 드라이버
AhnLab Safe Transaction (1편) SafeTransactionSVC stsess.exe /tray _SafeTransaction 9개 (3개 실행 중)
위즈베라 3종 (4편) WizveraPMSvc delfino.exe, veraport-x64.exe
RAON K (3편) RAON K (사용 안 함) RAONK Task 1.0
nProtect Online Security (10편) nossvc TK 10개 + nos·np 3개 (10개 실행 중)
IPinside LWS Agent (11편) Interezen_service I3GProc.exe
MagicLine4NX (12편) MagicLine4NXSVC MagicLine4NX.exe
AnySign4PC (13편) AnySign4PC Launcher AnySign4PC.exe
CrossEX (14편) CrossEX Live Checker CrossEXService.exe (현재 사용자)
TouchEn nxWeb·nxFirewall (15편) TENXW_Guard, ToucnEn_nxFirewall

표에 없는 9편의 TouchEn nxKey 는 확인한 시점에 네 길 어디에서도 떠 있지 않았다. 대신 크롬·엣지에 "TouchEn PC보안 확장" 1.0.2.6 이 깔려 있고, 레지스트리에 kr.co.raon.touchenex 라는 네이티브 메시징 호스트가 등록되어 있었다. 브라우저 확장이 이 이름을 부르면 브라우저가 PC 의 실행 파일(iniLINE 서명의 CrossEXChrome.exe)을 띄워 주는 방식이다. 다섯 번째 길이라 할 만한데, 브라우저가 필요할 때만 띄우므로 평소에는 떠 있지 않다. 15편의 TENXW_Guard 서비스는 TENXW_SVR.exe 로 돌면서 TEWeb·TEWeb64·TEWebP 를 띄우는 구조였다. 22~25편 번외에서 다룰 프로그램도 같은 방식이었다. 코스콤 SignKorea 는 SignKoreaWD 서비스와 Run 키를, 한국정보인증은 KicaPMSvc 서비스와 Run 키를, 한국전자인증 CrossCert 는 Run 키 세 개를, CoreB2B ExEcm 은 서비스 하나를 쓰고 있었다.

서비스와 Run 키를 둘 다 쓰는 이유

표에서 눈에 띄는 것은 IPinside, MagicLine4NX, AnySign4PC 가 서비스와 Run 키를 함께 쓴다는 점이다. 프로세스의 부모를 따라가면 구조가 보인다.

Get-CimInstance Win32_Process |
    Where-Object Name -match 'MagicLine4NX|AnySign4PC|I3G|nos' |
    ForEach-Object {
        $parent = Get-Process -Id $_.ParentProcessId -ErrorAction SilentlyContinue
        '{0}  <-  {1}' -f $_.Name, $parent.ProcessName
    }

MagicLine4NX.exe 의 부모는 MagicLine4NXServices.exe, AnySign4PC.exe 의 부모는 AnySign4PCLauncher.exe, I3GProc.exe 의 부모는 I3GMainSvc.exe, nosstarter.npe 의 부모는 nossvc.exe 였다. 서비스가 사용자 화면 쪽에서 일할 프로세스를 띄워 주는 구조다. 서비스는 사용자 화면과 분리된 세션에서 돌기 때문에 창이나 트레이 아이콘이 필요한 일은 따로 띄운 프로세스가 맡는다. 같은 실행 파일이 Run 키에도 적혀 있으니, 로그인할 때 Run 키가 한 번 더 띄우는 셈이다. 어느 한쪽이 실패해도 결국 프로세스가 올라오게 이중으로 걸어 둔 것으로 보인다.

그래서 시작 앱 탭에서 끄는 것만으로는 이 세 프로그램이 멈추지 않는다. 서비스가 부팅 때 다시 띄우기 때문이다. 1편의 AhnLab Safe Transaction 처럼 서비스에 복구 설정까지 걸려 있으면, 작업 관리자에서 끝내도 다시 산다. 이 PC 에서 복구 설정이 있던 것은 둘뿐이었다. SafeTransactionSVC 는 5초 뒤 재시작을 세 번, AnySign4PC Launcher 는 60초 뒤 재시작을 한 번 걸어 두었다. 나머지 보안 프로그램 서비스에는 복구 동작이 설정되어 있지 않았다.

sc.exe qfailure "AnySign4PC Launcher"

Run 키는 세 군데에 있다

Run 키를 볼 때는 위치가 세 곳이라는 점을 기억해야 한다. HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Run 은 이 PC 의 모든 사용자, 같은 경로의 WOW6432Node 아래는 32비트 프로그램이 쓰는 자리, HKCU\...\Run 은 지금 로그인한 사용자 몫이다. 이 PC 에서 Veraport 와 AhnLab 은 첫 번째에, Delfino·IPinside·MagicLine4NX·AnySign4PC 같은 32비트 프로그램은 WOW6432Node 에 있었다. CrossEX 만 현재 사용자 쪽에 있었다. 다른 계정으로 로그인하면 CrossEX 는 뜨지 않는다는 뜻이다.

작업 관리자의 시작 앱 탭에서 사용 안 함으로 바꾸면 Run 키의 값은 그대로 두고 별도의 StartupApproved 키에 꺼짐 표시만 남긴다. 프로그램을 업데이트하거나 다시 설치하면 다시 켜질 수 있는 이유다.

예약 작업과 커널 드라이버

예약 작업을 쓰는 보안 프로그램은 이 PC 에서 RAON K 하나였다. RAONK Task 1.0 이 로그온 때 raonk.moni.exe 를 띄운다. 그런데 서비스 목록에도 RAON K 라는 서비스가 사용 안 함 상태로 남아 있었고, 경로는 3편에서 본 ProgramData 가 아닌 C:\Program Files (x86)\RAONWIZ\RAON K\raonk.svc.exe 였다. 예전 버전이 서비스 방식으로 깔렸던 흔적으로 보인다. 프로그램을 지운 뒤 이런 서비스가 남아 있는지 보는 것도 정리의 일부다.

커널 드라이버는 nProtect 와 안랩 두 회사 것이 많았다. nProtect 는 TK 로 시작하는 Tachyon 드라이버 10개와 noskp, nosku, np_ck64s 3개를 합쳐 13개, 안랩은 이름 끝에 _SafeTransaction 이 붙은 9개다. 대부분 시작 유형이 수동이라 서비스가 필요할 때 올리고, TKFWFV 하나만 시작 유형이 System 이라 부팅 초기에 올라온다. 파일 위치도 제각각이었다. TK 드라이버는 C:\Windows\System32, nos 계열은 C:\Windows\SysWOW64, 안랩 것은 자기 설치 폴더에 있었다.

Get-CimInstance Win32_SystemDriver |
    Where-Object { $_.Name -match '^TK|SafeTransaction|^nos|^np_' } |
    Sort-Object Name |
    Format-Table Name, StartMode, State, PathName -AutoSize

드라이버는 직접 지우면 안 된다. 실행 중인 드라이버의 .sys 파일을 지우거나 서비스 항목을 손대면 부팅 문제로 이어질 수 있다. 드라이버는 프로그램의 제거 기능이 걷어 내도록 두고, 제거 뒤 재부팅한 다음 위 명령으로 남은 것이 있는지만 확인한다.

지도를 그려 놓으니 정리할 때 무엇을 봐야 하는지가 분명해졌다. 다음 편은 연재의 마지막으로, 이 네 길과 앞 편의 포트·루트 인증서를 한 번에 뽑아 보는 읽기 전용 PowerShell 스크립트와 지우는 순서를 정리한다.