메모장에서는 한글이 잘 써지는데 어떤 프로그램에서는 한/영 키를 눌러도 영문만 나온다. 이런 증상을 검색하다 보면 거의 반드시 ctfmon.exe 라는 이름을 만난다. 작업 관리자에는 "CTF 로더"라는 설명으로 떠 있고, 이름만 봐서는 무엇을 하는지 짐작이 안 된다. 그래서인지 "ctfmon 바이러스", "ctfmon 꺼도 되나" 같은 검색어도 함께 올라온다.
68KB 짜리 작은 파일 하나
이 PC 에서 ctfmon.exe 는 하나만 떠 있었다. 일반 권한 PowerShell 에서 Get-CimInstance Win32_Process 로 물었더니 부모 프로세스 번호는 나왔지만 실행 경로와 명령줄은 빈 값이었다. 내 세션에서 돌고 있는데도 다른 계정이 띄운 프로세스라서 그렇다. 그 이유는 아래에서 부모를 따라가면 나온다. 파일 쪽은 C:\Windows\System32\ctfmon.exe 를 직접 확인했다.
Get-Item C:\Windows\System32\ctfmon.exe | Select-Object Length, @{n='Desc';e={$_.VersionInfo.FileDescription}}
Get-AuthenticodeSignature C:\Windows\System32\ctfmon.exe | Select-Object Status
크기는 69,632바이트, 파일 설명은 "CTF Loader", 버전은 10.0.26100.9949 이고 서명자는 Microsoft Windows 로 유효했다. 확인한 시점의 메모리는 작업 집합 19.9MB, 개인 메모리 8.0MB 였고, 부팅 뒤 약 14시간 동안 쓴 CPU 시간은 모두 합쳐 9.5초였다. 핸들은 653개, 스레드는 16개였다. 평소에는 이 정도로 조용한 프로세스다.
누가 띄우나: 서비스와 예약 작업
부모 프로세스 번호를 따라가 보니 svchost.exe 였고, 그 안에서 도는 서비스는 하나뿐이었다.
> tasklist /svc /fi "PID eq 4556"
svchost.exe 4556 TextInputManagementService
Text Input Management Service 다. 시작 유형은 자동이고, 명령줄은 svchost.exe -k LocalSystemNetworkRestricted -p 였다. 서비스 설명에는 "텍스트 입력, 표현 입력, 터치 키보드, 필기, IME를 사용 설정합니다."라고 적혀 있다. LocalSystem 계정으로 도는 이 서비스가 사용자 세션에 ctfmon.exe 를 띄워 주기 때문에, 일반 권한으로는 경로와 명령줄이 보이지 않았던 것으로 보인다.
시각도 맞아떨어졌다. 이 PC 는 23시 07분 06초에 부팅했고, 탐색기(explorer.exe)가 07분 27초, ctfmon.exe 가 07분 35초에 시작했다. 로그인하고 바탕 화면이 뜬 직후에 따라 올라온 셈이다.
검색해 보면 예약 작업 MsCtfMonitor 가 ctfmon 을 띄운다는 설명도 많다. 이 PC 에도 작업 스케줄러의 \Microsoft\Windows\TextServicesFramework\ 아래에 MsCtfMonitor 가 "준비" 상태로 있었다. 트리거는 로그온, 실행 대상은 Users 그룹의 일반 권한이었고, 동작은 실행 파일이 아니라 COM 처리기였다. 그 CLSID 를 레지스트리에서 찾아보니 MsCtfMonitor.dll(설명 "MsCtfMonitor task handler")이었다. 다만 이번에 확인한 ctfmon.exe 의 부모는 예약 작업이 아니라 위의 서비스였다. 지금 빌드에서는 서비스가 띄우고, 예약 작업은 로그온 때 텍스트 서비스 쪽을 지켜보는 역할로 남아 있는 것으로 보인다.
한글 입력기와는 어떻게 이어지나
CTF 는 지금의 텍스트 서비스 프레임워크(TSF)의 옛 이름으로 알려져 있다. TSF 는 키보드, 입력기(IME), 필기, 음성 같은 입력 방식을 앱과 이어 주는 틀이다. 한글 입력기도 이 틀 위에 "텍스트 입력 프로세서(TIP)"로 등록되어 있다.
(Get-ChildItem HKLM:\SOFTWARE\Microsoft\CTF\TIP).Count
이 PC 에는 TIP 항목이 21개 등록되어 있었다. 그중 언어 코드 0x00000412(한국어) 프로필의 설명은 "Microsoft IME", 아이콘 파일은 C:\Windows\System32\IME\IMEKR\imkrtip.dll 이었다. 사용자 쪽 HKCU\Keyboard Layout\Preload 에도 00000412 하나만 있었다. 한국어 입력기 하나만 쓰는 평범한 구성이다.
ctfmon.exe 는 이 입력기를 직접 돌리는 프로그램이라기보다, 각 앱이 TSF 를 쓸 수 있게 연결을 관리하는 쪽으로 보면 된다. 한/영 전환 상태, 작업 표시줄의 "가/A" 표시, 앱이 바뀔 때 입력 상태를 넘겨주는 일이 여기에 걸려 있다. 같은 서비스와 관련된 TextInputHost.exe 도 떠 있었는데(작업 집합 33.6MB), 이것은 터치 키보드와 이모지 패널(Windows 키 + 마침표) 화면을 맡는 프로세스로 알려져 있다.
끄면 한글이 안 써지는 이유와, 안 써질 때 볼 것
ctfmon.exe 를 작업 관리자에서 끝내면 이미 열려 있던 일부 앱에서 한/영 전환이 먹지 않거나 언어 표시가 사라지는 증상이 생기는 것으로 알려져 있다. 앱과 입력기 사이의 연결을 관리하는 쪽이 사라졌기 때문이다. Text Input Management Service 를 사용 안 함으로 바꾸는 방법도 인터넷에 돌지만, 그러면 IME 와 터치 키보드가 함께 영향을 받는다. 얻는 것은 메모리 몇 MB 이고 잃는 것은 한글 입력이다. 끄지 않는 편이 맞다.
반대로 한글이 갑자기 안 써질 때는 ctfmon 이 떠 있는지부터 본다.
Get-Process ctfmon -ErrorAction SilentlyContinue | Select-Object Id, StartTime
아무것도 나오지 않으면 로그아웃했다가 다시 로그인하는 것이 가장 깔끔하다. 떠 있는데도 특정 프로그램에서만 한글이 안 된다면 그 프로그램 쪽 문제일 가능성이 크다. 관리자 권한으로 띄운 프로그램, 오래된 게임이나 원격 화면 창처럼 입력을 따로 처리하는 프로그램에서 이런 일이 자주 보고된다. 다른 앱에서는 잘 되는지 비교해 보면 범위가 좁혀진다.
가짜를 구별하는 기준은 앞 편들과 같다. 경로가 C:\Windows\System32 이고 서명이 Microsoft Windows 로 유효한지 본다. 작업 관리자의 세부 정보 탭에서 열 머리글을 오른쪽 클릭해 "명령줄" 열을 추가하면 경로를 바로 볼 수 있는데, 일반 권한에서는 이 PC 처럼 비어 보일 수 있다. 그럴 때는 항목을 오른쪽 클릭해 "파일 위치 열기"를 누르거나 위의 Get-AuthenticodeSignature 를 쓰면 된다. 사용자 폴더나 AppData 아래에서 같은 이름이 보이면 그건 Windows 의 것이 아니다.
다음 편은 작업 관리자에 이름은 있는데 실행 파일은 없는 프로세스들이다. Memory Compression, Secure System, Registry, 그리고 늘 맨 위에 있는 System 과 System Idle Process 를 본다.