#44u61l5f GameGuard 에대한간단한분석. By Dual5651 (http://dualpage.muz.ro) 요약 : 이문서는분석자의입장에서 GameGuard의동작을모니터링한것에대한것입니다. 실제 GameGuard의동작방식과는다소차이가있을수있습니다. 이문서에등장하는모든등록상표에대한저작권은해당저작권자에게있습니다.
1. Execution sequence 첫번째로 GameGuard 의실행순서는다음과같습니다. 00000011 오전 10:10:03 Type : Create 00000012 오전 10:10:03 Parent ID : 0xA78 00000013 오전 10:10:03 Process ID : 0x848 00000014 오전 10:10:03 EPROCESS : 0x82E45DA0 00000015 오전 10:10:03 Process Name : Loader.exe 대게, 게임을실행시키기전, Loader 가먼저실행된다. 00000016 오전 10:10:04 Type : Create 00000017 오전 10:10:04 Parent ID : 0x848 Loader.exe 00000018 오전 10:10:04 Process ID : 0x6B8 00000019 오전 10:10:04 EPROCESS : 0x83FC4DA0 00000020 오전 10:10:04 Process Name : game.exe game.exe 이 Loader 에의해실행된것을볼수있다. 00000021 오전 10:10:04 Type : Destroy 00000022 오전 10:10:04 Parent ID : 0xA78 00000023 오전 10:10:04 Process ID : 0x848 00000024 오전 10:10:04 EPROCESS : 0x82E45DA0 00000025 오전 10:10:04 Process Name : Loader.exe Game.exe 를실행시킨후, Loader.exe 는파괴된다. 00000034 오전 10:10:05 Type : Create 00000035 오전 10:10:05 Parent ID : 0x6B8 game.exe 00000036 오전 10:10:05 Process ID : 0x1C4 00000037 오전 10:10:05 EPROCESS : 0x819BBB28 00000038 오전 10:10:05 Process Name : GameGuard.des GameGuard.des 의역할은보호를수행하기위한초기화작업등을수행하는 것으로보인다. Game.exe 에의해실행된다.
00000039 오전 10:10:08 Type : Create 00000040 오전 10:10:08 Parent ID : 0x6B8 game.exe 00000041 오전 10:10:08 Process ID : 0x4A4 00000042 오전 10:10:08 EPROCESS : 0x829D0DA0 00000043 오전 10:10:08 Process Name : GameMon.des gamemon.des 은실제적인감시자의역활로보인다. ( 많은프로세스에접근을시도한다.) 이파일이메모리에로드될쯤해서 SDT Restore과정이수행되어진다. (SDT Restore 0.2에기반을둔것이아닌, 0.1에기반을둔것으로보인다.) 00000044 오전 10:10:16 Type : Destroy 00000045 오전 10:10:16 Parent ID : 0x6B8 game.exe 00000046 오전 10:10:16 Process ID : 0x1C4 00000047 오전 10:10:16 EPROCESS : 0x819BBB28 00000048 오전 10:10:16 Process Name : GameGuard.des 초기화작업을마치고, gamemon.des 가실행된후, GameGuard.des 는파괴된다. 사용자가 game.exe의종료를요구하면, 다음과같은순서에따라파괴되게된다. 00000292 오전 10:11:02 Type : Destroy 00000293 오전 10:11:02 Parent ID : 0x848 00000294 오전 10:11:02 Process ID : 0x6B8 00000295 오전 10:11:02 EPROCESS : 0x83FC4DA0 00000296 오전 10:11:02 Process Name : game.exe 게임이먼저사용자의요구에따라파괴된다. 00000297 오전 10:11:09 Type : Destroy 00000298 오전 10:11:09 Parent ID : 0x6B8 game.exe 00000299 오전 10:11:09 Process ID : 0x4A4 00000300 오전 10:11:09 EPROCESS : 0x829D0DA0 00000301 오전 10:11:09 Process Name : GameMon.des 다른프로세스에 Injection하여둔, npggnt.des를모두 unload 하고, 사용하였던 Device Driver를 unload한후, GameMon.des 도파괴된다.
2. Hook Chain GameGuard 는다음과같은 Hooking 을시도한다. 2.1 User Level GameGuard 는모든프로세스에 npggnt.des 를 Injection 시키는데, 이파일은다음과같은 Hooking 을시도한다. + [0x7C930000] ntdll.dll - target : 0x458AA5D0 ( npggnt.des), func : NtLoadDriver - target : 0x458AA720 ( npggnt.des), func : NtOpenProcess - target : 0x458AA020 ( npggnt.des), func : NtProtectVirtualMemory - target : 0x458AD6A0 ( npggnt.des), func : NtQuerySystemInformatio - target : 0x458AA270 ( npggnt.des), func : NtReadVirtualMemory - target : 0x458AB9D0 ( npggnt.des), func : NtSuspendProcess - target : 0x458AB5A0 ( npggnt.des), func : NtSuspendThread - target : 0x458AB860 ( npggnt.des), func : NtTerminateProcess - target : 0x458AB6F0 ( npggnt.des), func : NtTerminateThread - target : 0x458AA430 ( npggnt.des), func : NtWriteVirtualMemory - target : 0x458AD6A0 ( npggnt.des), func : RtlGetNativeSystemInfor - target : 0x458AA5D0 ( npggnt.des), func : ZwLoadDriver - target : 0x458AA720 ( npggnt.des), func : ZwOpenProcess - target : 0x458AA020 ( npggnt.des), func : ZwProtectVirtualMemory - target : 0x458AD6A0 ( npggnt.des), func : ZwQuerySystemInformatio - target : 0x458AA270 ( npggnt.des), func : ZwReadVirtualMemory - target : 0x458AB9D0 ( npggnt.des), func : ZwSuspendProcess - target : 0x458AB5A0 ( npggnt.des), func : ZwSuspendThread - target : 0x458AB860 ( npggnt.des), func : ZwTerminateProcess - target : 0x458AB6F0 ( npggnt.des), func : ZwTerminateThread - target : 0x458AA430 ( npggnt.des), func : ZwWriteVirtualMemory + [0x7C800000] kernel32.dll - target : 0x458A70E0 ( npggnt.des), func : CreateProcessInternalW - target : 0x458AAB80 ( npggnt.des), func : DebugActiveProcess - target : 0x458AACA0 ( npggnt.des), func : DeviceIoControl - target : 0x458ABB10 ( npggnt.des), func : GetProcAddress
- target : 0x458AAFA0 ( npggnt.des), func : LoadLibraryExW - target : 0x458AD0B0 ( npggnt.des), func : MapViewOfFile - target : 0x458AD310 ( npggnt.des), func : MapViewOfFileEx - target : 0x458ABC50 ( npggnt.des), func : MoveFileW - target : 0x458AA970 ( npggnt.des), func : OpenProcess - target : 0x458A8F80 ( npggnt.des), func : ReadProcessMemory - target : 0x458A96D0 ( npggnt.des), func : VirtualProtect - target : 0x458A9DB0 ( npggnt.des), func : VirtualProtectEx - target : 0x458A9240 ( npggnt.des), func : WriteProcessMemory + [0x77F50000] ADVAPI32.dll - target : 0x458AB4D0 ( npggnt.des), func : CreateProcessWithLogonW + [0x77E20000] GDI32.dll - target : 0x458ABE40 ( npggnt.des), func : GetPixel + [0x77CF0000] USER32.dll - target : 0x458AC080 ( npggnt.des), func : GetWindowThreadProcessI - target : 0x458A7FE0 ( npggnt.des), func : PostMessageA - target : 0x458A8350 ( npggnt.des), func : PostMessageW - target : 0x458A7410 ( npggnt.des), func : SendInput - target : 0x458A87F0 ( npggnt.des), func : SendMessageA - target : 0x458A8A10 ( npggnt.des), func : SendMessageW - target : 0x458A8A40 ( npggnt.des), func : SetCursorPos - target : 0x458A8BA0 ( npggnt.des), func : SetWindowsHookExA - target : 0x458A8DF0 ( npggnt.des), func : SetWindowsHookExW - target : 0x458A78B0 ( npggnt.des), func : keybd_event - target : 0x458A7D70 ( npggnt.des), func : mouse_event + [0x762B0000] WINSTA.dll - target : 0x458AD570 ( npggnt.des), func : WinStationTerminateProc * - 주로 Macro를차단할목적이나, game.exe,gamemode.des 로의접근을차단하는것에목적을둔 Hook들로보인다. 2.2 Kernel Level GameGuard가사용하는 sys파일은 dump_wmimmc.sys 라고알려져있으며, 다음과같은 SSDT Hooking을시도를합니다. service number : 31 + related nt function list_
- NtConnectPort - ZwConnectPort - redirected address : 0x848B2560 service number : 122 + related nt function list_ - NtOpenProcess - ZwOpenProcess - redirected address : 0xF7A6C682 service number : 128 service number : 137 + related nt function list_ - NtProtectVirtualMemory - ZwProtectVirtualMemory - redirected address : 0xF7A6C7FA service number : 186 + related nt function list_ - NtReadVirtualMemory - ZwReadVirtualMemory - redirected address : 0xF7A6C702 service number : 277
+ related nt function list_ - NtWriteVirtualMemory - ZwWriteVirtualMemory - redirected address : 0xF7A6C77E * 주로 game.exe 로의접근을차단하기위한 hook 으로보인다. service number : 502 + related function list - SendInput - redirected address : 0xF7A6C962 * KeServiceDescriptorShadow 의 SendInput 을 Hook 하여 Macro 를 차단하려는시도를하는것으로보인다. 또 ntoskrnl.exe 의 export table 에서다음과같은함수의 Hooking 을시도한다. module name : ntoskrnl.exe - base address : 0x804D9000 - entry point address : 0x806AE2BE - module full path : \WINDOWS\system32\ntoskrnl.exe + hooked function list + hooked function name : KeAttachProcess - hook type : opcode patching - redirected address : 0xF79A513E - hook module information_ : not found. + hooked function name : KeStackAttachProcess - hook type : opcode patching - redirected address : 0xF79A5038 - hook module information_ : not found.
* 보호하는 Process 로의메모리공간전환을근본적으로차단하고자 설치한 Hook 으로보인다. 3. Miscellaneous GameMon.des 는 C:\MyDocuments\Local Settings\Temp 에다음과같은파일들을생성한다. np5a.tmp np5b.tmp np5c.tmp np5d.tmp np5e.tmp np5f.tmp np60.tmp np61.tmp 위파일들은각각내용은다르며, PE포맷을가진실행파일이다. ggscan.des 라는파일은 GameMon.des 에만로드된다. Game.exe 내에도 npggnt.des 는설치되나, Hooking 의범위에서는 제외되는것으로보인다. npsc.des 라는파일은 game.exe 에만로드된다.