NP启动后通过WriteProcessMemory跟CreateRemoteThread向所有进程注入代码(除了系统进程smss.exe),代码通过np自己的LoadLibrary向目标进程加载npggNT.des。npggNT.des一旦加载就马上开始干“坏事”,挂钩(HOOK)系统关键函数如OpenProcess,ReadProcessMemory,WriteProcessMemory,PostMessage等等。挂钩方法是通过改写系统函数头,在函数开始JMP到npggNT.des中的替换函数。用户调用相应的系统函数时,会首先进入到npggNT.des模块等待NP的检查,如果发现是想对其保护的游戏进行不轨操作的话,就进行拦截,否则就调用原来的系统函数,让用户继续。
C下面是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] 6 o; B/ {: W l# {# R; Z k; K
8BC7 MOV EAX,EDI
SUB EAX,145
以上是头几下,而下面是NP启动后user32.dll中的PostMessageA的源代码(NP版本900,XP sp2)
E9 A69AB8CD JMP npggNT.458A6630
56 PUSH ESI 7 G1 u% T. u/ f4 r7 @+ B. w
57 PUSH EDI
8B7D 0C MOV EDI,DWORD PTR SS:[EBP+C] , U
8BC7 MOV EAX,EDI !
2D 45010000 SUB EAX,145
通过对比我们可以发现,NP把PostMessageA函数头原来的8BFF558BEC五个字节改为了E9A69AB8CD,即将
MOV EDI,EDI
PUSH EBP
MOV EBP,ESP
三条指令改为了JMP npggNT.458A6630。所以用户一旦调用PostMessageA的话,就会跳转到npggNT.des中的458A6630中去。