NP=> nProtect GameGuard (907)
在Ring3,NP的保护很容易破,Hook GetCurrentProcess,然后FreeLibrary(npggNT.des)就行啦。这里先感谢并向堕落天才学习!![http://bbs.pediy.com/showthread.php?threadid=37353]。
NP在Ring0确有拦截,npptNT2.sys加载后,并没有在原函数开始处加jmp XXXXXXXX,而是直接改了SSDT表中的几个函数地址:
NtDeviceIoControlFile (0x42)
NtOpenProcess (0x7A)
NtProtectVirtualMemory(0x89)
NtReadVirtualMemory(0xBA)
NtWriteVirtualMemory(0x115)
下面是NP检查NtOpenProcess的代码:
f880a682 - 55 - push ebp
f880a683 - 8b ec - mov ebp,esp
f880a685 - 51 - push ecx
f880a686 - 56 - push esi
f880a687 - 57 - push edi
f880a688 - 50 - push eax
f880a689 - 8b 46 ec - mov eax,[esi-14]
f880a68c - 89 45 fc - mov [ebp-04],eax
f880a68f - 58 - pop eax
f880a690 - be 48 dc 80 f8 - mov esi,f880dc48
f880a695 - 33 c9 - xor ecx,ecx
f880a697 - 8b c6 - mov eax,esi
f880a699 - 41 - inc ecx
f880a69a - f0 0f c1 08 - lock xadd [eax],ecx
f880a69e - 8b 7d 14 - mov edi,[ebp+14]
f880a6a1 - 33 c0 - xor eax,eax
f880a6a3 - 38 05 33 dc 80 f8 - cmp [f880dc33],al <这些cmp/jxx是检查"非法"操作
f880a6a9 - 74 39 - je f880a6e4
f880a6ab - 38 05 30 dc 80 f8 - cmp [f880dc30],al
f880a6b1 - 74 31 - je f880a6e4
f880a6b3 - 3b f8 - cmp edi,eax
f880a6b5 - 74 2d - je f880a6e4
f880a6b7 - 50 - push eax
f880a6b8 - ff 37 - push [edi]
f880a6ba - e8 45 fe ff ff - call f880a504
f880a6bf - 84 c0 - test al,al
f880a6c1 - 75 21 - jne f880a6e4
f880a6c3 - 8b 45 fc - mov eax,[ebp-04]
f880a6c6 - 3b 05 84 d3 80 f8 - cmp eax,[f880d384]
f880a6cc - 72 0f - jb f880a6dd
f880a6ce - 3b 05 88 d3 80 f8 - cmp eax,[f880d388]
f880a6d4 - 76 0e - jna f880a6e4
f880a6d6 - 3d 00 00 00 80 - cmp eax,80000000
f880a6db - 73 07 - jae f880a6e4
f880a6dd - b8 22 00 00 c0 - mov eax,c0000022
f880a6e2 - eb 10 - jmp f880a6f4
f880a6e4 - 57 - push edi
f880a6e5 - ff 75 10 - push [ebp+10]
f880a6e8 - ff 75 0c - push [ebp+0c]
f880a6eb - ff 75 08 - push [ebp+08]
f880a6ee - ff 15 e0 de 80 f8 - call dword ptr [f880dee0] <这里是原函数的地址
f880a6f4 - 83 c9 ff - or ecx,ff
f880a6f7 - f0 0f c1 0e - lock xadd [esi],ecx
f880a6fb - 5f - pop edi
f880a6fc - 5e - pop esi
f880a6fd - c9 - leave
f880a6fe - c2 10 00 - ret 0010
f880a701 - cc - int 3
我先试着把SSDT里的函数地址改回来,机器立即重启。修改上面这段代码(jmp回原函数)也会导致立即重启,看来NP两个地方都在查。用调试寄存器在f880a682设断点,我也没找到什么地方在读这段代码,NP在我前面处理了异常?
我最后的试验是在SSDT里新加一个地址(0x11C),写上原NtOpenProcess函数(805cac46),然后用OD调试OD,把被调试的OD里ZwOpenProcess改成mov eax,11c...可是加了地址后就重启。
大家有没有破NP Ring0保护的思路?我刚开始学写驱动,每天蓝屏N次,就是想有一天能用OD attach上游戏...呵呵
[课程]Linux pwn 探索篇!