游戏是随便找的一个有TP保护的!qq游戏大厅里面的三国战记!(本着短小精悍的原则嘛,嘿嘿!)
过了双机调试之后,在Debugport偏移处下读断点!
TesSafe(这是TP模块地址,下面我都用TesSafe代替)
ba r4 TesSafe+0xbc
得到了四处清零地址:
TesSafe+0x6ef1:
xor ecx,ecx
ede76eef 8708 xchg ecx,dword ptr [eax]
ede76ef1 8b4624 mov eax,dword ptr [esi+24h]
TesSafe+0x22a2:
ede4e2a2 8b09 mov ecx,dword ptr [ecx]
上面两处我都搞定了,直接retn了!还有一处检测我也retn了,在虚机里面测试,不会再读了!
————————————————————————————————————
问题就出在下面两处上面,edx是debugPort的偏移地址!
TesSafe+0xba4cc:
edf064ca ff32 push dword ptr [edx]
edf064cc e9a8350000 jmp TesSafe+0xbda79 (edf09a79)
TesSafe+0xbb0f2:
edf2b0f0 8f02 pop dword ptr [edx]
edf2b0f2 e9c5f1ffff jmp TesSafe+0xba2bc (edf2a2bc)
我HOOK了上面两处地方,请看我的HOOK代码
ULONG g_uPopJmpImageBase = TesSafe+0xba2bc;//这是要跳转的地址
__declspec(naked) void HookDegbugPOP()
{
__asm
{
pushfd
pushad
mov eax,u_TesSafeDebugPortImageBase//这个是Debugport的偏移地址
cmp edx,eax
jnz MYPOP
popad
popfd
add esp,0x4
jmp g_uPopJmpImageBase
MYPOP:
popad
popfd
pop DWORD PTR [edx]
jmp g_uPopJmpImageBase
}
}
我比较edx是否等于debugport的偏移,如果不等于我就让它执行以前的代码(即汇编中MYPOP标签的地方),如果相等的话,我直接抬高堆栈,然后JMP到TP原来的地址继续执行
HOOK的代码是这样写的:
*(PUCHAR)u_HookPOPBase = 0xe9; //POP地址
*(PULONG)(u_HookPOPBase+0x1) = (ULONG)HookDegbugPOP - u_HookPOPBase - 0x5 ;
请问老大:
1、这样的思路是否有问题?
2、为什么我HOOK成功之后,下debugport的读断点的时候,还是会断在 MYPOP标签的地方(即程序原来的代码?)
(POP和PUSH这两处地方遇到了同样的问题)
求老大指点,感激不尽!!
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)