在NP下用OD调试游戏的方法
一、NP用户层监视原理
NP启动后通过WriteProcessMemory跟CreateRemoteThread向所有进程注入代码(除了系统进程smss.exe),代码通过np自己的LoadLibrary向目标进程加载npggNT.des。npggNT.des一旦加载就马上开始干“坏事”,挂钩(HOOK)系统关键函数如OpenProcess,ReadProcessMemory,WriteProcessMemory,PostMessage等等。挂钩方法是通过改写系统函数头,在函数开始JMP到npggNT.des中的替换函数。用户调用相应的系统函数时,会首先进入到npggNT.des模块等待NP的检查,如果发现是想对其保护的游戏进行不轨操作的话,就进行拦截,否则就调用原来的系统函数,让用户继续。
下面是NP启动前user32.dll中的PostMessageA的源代码(NP版本900,XP sp2)
8BFF MOV EDI,EDI
55 PUSH EBP
8BEC MOV EBP,ESP
56 PUSH ESI
57 PUSH EDI
8B7D 0C MOV EDI,DWORD PTR SS:[EBP+C]
8BC7 MOV EAX,EDI
2D 45010000 SUB EAX,145
74 42 JE SHORT USER32.77D1CBDA
83E8 48 SUB EAX,48
74 3D JE SHORT USER32.77D1CBDA
2D A6000000 SUB EAX,0A6
0F84 D4530200 JE USER32.77D41F7C
8B45 10 MOV EAX,DWORD PTR SS:[EBP+10]
8B0D 8000D777 MOV ECX,DWORD PTR DS:[77D70080]
F641 02 04 TEST BYTE PTR DS:[ECX+2],4
0F85 03540200 JNZ USER32.77D41FBE
8D45 10 LEA EAX,DWORD PTR SS:[EBP+10]
50 PUSH EAX
57 PUSH EDI
E8 FBFEFFFF CALL USER32.77D1CAC0
FF75 14 PUSH DWORD PTR SS:[EBP+14]
FF75 10 PUSH DWORD PTR SS:[EBP+10]
57 PUSH EDI
FF75 08 PUSH DWORD PTR SS:[EBP+8]
E8 ACBFFFFF CALL USER32.77D18B80
5F POP EDI
5E POP ESI
5D POP EBP
C2 1000 RETN 10
而下面是NP启动后user32.dll中的PostMessageA的源代码(NP版本900,XP sp2)
E9 A69AB8CD JMP npggNT.458A6630
56 PUSH ESI
57 PUSH EDI
8B7D 0C MOV EDI,DWORD PTR SS:[EBP+C]
8BC7 MOV EAX,EDI
2D 45010000 SUB EAX,145
74 42 JE SHORT USER32.77D1CBDA
83E8 48 SUB EAX,48
74 3D JE SHORT USER32.77D1CBDA
2D A6000000 SUB EAX,0A6
0F84 D4530200 JE USER32.77D41F7C
8B45 10 MOV EAX,DWORD PTR SS:[EBP+10]
8B0D 8000D777 MOV ECX,DWORD PTR DS:[77D70080]
F641 02 04 TEST BYTE PTR DS:[ECX+2],4
NP启动后通过WriteProcessMemory跟CreateRemoteThread向所有进程注入代码(除了系统进程smss.exe),代码通过np自己的LoadLibrary向目标进程加载npggNT.des。npggNT.des一旦加载就马上开始干“坏事”,挂钩(HOOK)系统关键函数如OpenProcess,ReadProcessMemory,WriteProcessMemory,PostMessage等等。挂钩方法是通过改写系统函数头,在函数开始JMP到npggNT.des中的替换函数。用户调用相应的系统函数时,会首先进入到npggNT.des模块等待NP的检查,如果发现是想对其保护的游戏进行不轨操作的话,就进行拦截,否则就调用原来的系统函数,让用户继续。
下面是NP启动前user32.dll中的PostMessageA的源代码(NP版本900,XP sp2)
8BFF MOV EDI,EDI
55 PUSH EBP
8BEC MOV EBP,ESP
56 PUSH ESI
57 PUSH EDI
8B7D 0C MOV EDI,DWORD PTR SS:[EBP+C]
8BC7 MOV EAX,EDI
2D 45010000 SUB EAX,145
74 42 JE SHORT USER32.77D1CBDA
83E8 48 SUB EAX,48
74 3D JE SHORT USER32.77D1CBDA
2D A6000000 SUB EAX,0A6
0F84 D4530200 JE USER32.77D41F7C
8B45 10 MOV EAX,DWORD PTR SS:[EBP+10]
8B0D 8000D777 MOV ECX,DWORD PTR DS:[77D70080]
F641 02 04 TEST BYTE PTR DS:[ECX+2],4
0F85 03540200 JNZ USER32.77D41FBE
8D45 10 LEA EAX,DWORD PTR SS:[EBP+10]
50 PUSH EAX
57 PUSH EDI
E8 FBFEFFFF CALL USER32.77D1CAC0
FF75 14 PUSH DWORD PTR SS:[EBP+14]
FF75 10 PUSH DWORD PTR SS:[EBP+10]
57 PUSH EDI
FF75 08 PUSH DWORD PTR SS:[EBP+8]
E8 ACBFFFFF CALL USER32.77D18B80
5F POP EDI
5E POP ESI
5D POP EBP
C2 1000 RETN 10
而下面是NP启动后user32.dll中的PostMessageA的源代码(NP版本900,XP sp2)
E9 A69AB8CD JMP npggNT.458A6630
56 PUSH ESI
57 PUSH EDI
8B7D 0C MOV EDI,DWORD PTR SS:[EBP+C]
8BC7 MOV EAX,EDI
2D 45010000 SUB EAX,145
74 42 JE SHORT USER32.77D1CBDA
83E8 48 SUB EAX,48
74 3D JE SHORT USER32.77D1CBDA
2D A6000000 SUB EAX,0A6
0F84 D4530200 JE USER32.77D41F7C
8B45 10 MOV EAX,DWORD PTR SS:[EBP+10]
8B0D 8000D777 MOV ECX,DWORD PTR DS:[77D70080]
F641 02 04 TEST BYTE PTR DS:[ECX+2],4