안녕하세요 헬마입니다.
이번에 꽤나 힘든 디버깅 사례가 있었네요,
회사 솔루션으로 OS 전역 인젝션을 madCodeHook 을 통해 진행하고 있었습니다. 그런데, 며칠 전에 느닷없이 OS 업데이트 후에 재부팅하면 일정 시간 후에 PC 가 멈추더라라는 장애 접수가 들어왔지요.
DLL 에서 수행하는 후킹이 문제인가 해서 후킹을 빼보기도 하고, DllMain 에서 하지 않고 별도 스레드에서 수행해 보기도 하고, 아예 빈 DLL 에 OutputDebugString 으로 1 하나만 찍어보기도 했는데 일정 시간이 지나면 멈추더라고요.
더욱 신기한 건 똑같은 madCodeHook 과 HOOKING 을 사용하는 회사의 다른 솔루션은 멈추지 않았다는 겁니다. ㅠㅠ
주말 동안 줄단위로 코드 바꿔보면서 찾아낸 건 허무하게도 DLL 의 문제가 아니었습니다.
윈도 8 이래로 OS 에 UWP Sandbox APP 들이 추가되기 시작했고, madCodeHook 도 이러한 앱들에 인젝션을 지원하기 시작했습니다.
INJECT_METRO_APP 이라는 옵션을 켜면 인젝션을 수행해 주고, 아니면 해주지 않습니다.
그리고 기억에 의하면 윈도 10 부터는 이러한 Sandbox APP 에 인젝션되려면 NTFS 에 특수한 파일 권한이 있어야 되도록 변경되었습니다. "ALL APPLICATION PACKAGES" 와 "ALL RESTRITED PACKAGES" 라는 두 개의 권한이 후킹될 DLL 에 있어야 하도록 변경되었습니다. 없으면 인젝션이 거부되고요.
그래서 기존 솔루션은 INJECT_METRO_APP 이 켜져있더라고 권한이 없어서 Sandbox APP 에는 인젝션이 되지 않는 채로 쭉 ~~ 지내고 있었는데, 이번에 동작이 변경되었나봅니다. Sandbox App 에 인젝션 되려는데, 권한이 없으면 무한 대기하면서 멈춥니다.
특히나, 고약한 게 INJECT_METRO_APP 을 꺼도 madCodeHook 이 metro app 이라고 판정하지 않지만 실제로는 sandbox app 인 프로세스가 있는지 여전히 멈추더라고요. 즉, 이제는 시스템 전역 인젝션을 하려면 무조건 해당 권한을 부여해야 합니다.
이상 장애 후기였습니다. ㅠㅠ
P.S : MS 는 제발 갑자기 잠수함 패치 하지 말아 줘 ㅠㅠ