- 注册时间
- 2011-1-27
- 最后登录
- 2021-8-19
- 在线时间
- 229 小时
终身VIP会员
花钱是让你服务的,不是叫你大哥 ...
- 魔鬼币
- 10632
|
KdDisableDebugger 函数 (防止双机调试)
首先在打开虚拟机VMWARE,然后本机打开双机调试版WINDBG。
在windbg上下断点命令:bp KdDisableDebugger,进入虚拟机内,打开游戏,WINDBG断下。
nt!KdDisableDebugger(检测双机调试函数):
804f8876 8bff mov edi,edi //首地址
804f8878 55 push ebp
804f8879 8bec mov ebp,esp
804f887b 51 push ecx
804f887c b102 mov cl,2
804f887e ff152c904d80 call dword ptr [nt!_imp_KfRaiseIrql (804d902c)]
804f8884 8845ff mov byte ptr [ebp-1],al
804f8887 e81c010000 call nt!KdpPortLock (804f89a8)
804f888c 833d486a558000 cmp dword ptr [nt!KdDisableCount (80556a48)],0
804f8893 753a jne nt!KdDisableDebugger+0x59 (804f88cf) // KdDisableDebugger+0x1d
//第一次进入时,jne跳转没有实现(未修改);
804f8895 a0416a5580 mov al,byte ptr [nt!KdDebuggerEnabled (80556a41)]
804f889a 84c0 test al,al
804f889c 7510 jne nt!KdDisableDebugger+0x38 (804f88ae) // KdDisableDebugger+0x26
//第一次进入时,jne跳转实现(修改后);
804f889e 803dfce6548000 cmp byte ptr [nt!KdPitchDebugger (8054e6fc)],0
804f88a5 c6054c6a558001 mov byte ptr [nt!KdPreviouslyEnabled (80556a4c)],1
804f88ac 7407 je nt!KdDisableDebugger+0x3f (804f88b5)
//第一次没有经过这个跳转;
804f88ae c6054c6a558000 mov byte ptr [nt!KdPreviouslyEnabled (80556a4c)],0
804f88b5 84c0 test al,al
804f88b7 7516 jne nt!KdDisableDebugger+0x59 (804f88cf) // KdDisableDebugger+0x41
//第一次进入时,jne跳转实现(修改后);
804f88b9 e8d23d1700 call nt!KdpSuspendAllBreakpoints (8066c690)
804f88be c70564d655806c8d4f80 mov dword ptr [nt!KiDebugRoutine (8055d664)],offset nt!KdpStub (804f8d6c)
*eb为机器码写入;
接着我们下eb nt!KdDisableDebugger+26 75;eb nt!KdDisableDebugger+41;eb nt!KdDisableDebugger+1d 74; eb nt!KdDisableDebugger+36 75命令,这是一条复合命令,即将上面改变上面四个跳转。
接着F10往下走,直到RETN的时候,我们r eax(EAX为函数的返回值,eax=0代表KdDisableDebugger返回失败,即可以进行双击调试)。继续F10,函数返回,走到一条判断命令处,我们下 eb TesSafe+5069 74断点,接着往下走,
到这里:
// call TesSafe+0x26dc (ee0d66dc)
ee0d66dc a18c3e0eee mov eax,dword ptr [TesSafe+0xfe8c (ee0e3e8c)] //EAX=85DC1958
kd> u ee0d66dc L30
TesSafe+0x26dc:
ee0d66dc a18c3e0eee mov eax,dword ptr [TesSafe+0xfe8c (ee0e3e8c)] //EAX=804F872E
ee0d66e1 8b402c mov eax,dword ptr [eax+2Ch]
ee0d66e4 3305883e0eee xor eax,dword ptr [TesSafe+0xfe88 (ee0e3e88)] //EAX=804F8876
ee0d66ea 7402 je TesSafe+0x26ee (ee0d66ee) //修改为 75,跳过KeDisableDebugger函数
ee0d66ec ffd0 call eax // KeDisableDebugger函数
ee0d66ee 8b0dac0e0eee mov ecx,dword ptr [TesSafe+0xceac (ee0e0eac)]
ee0d66f4 85c9 test ecx,ecx
ee0d66f6 740f je TesSafe+0x2707 (ee0d6707) // TesSafe+26f6
ee0d66f8 a1b00e0eee mov eax,dword ptr [TesSafe+0xceb0 (ee0e0eb0)]
ee0d66fd 85c0 test eax,eax
ee0d66ff 7406 je TesSafe+0x2707 (ee0d6707) //// TesSafe+26ff
ee0d6701 3901 cmp dword ptr [ecx],eax //[ECX]=8066D1F8,EAX=804F8D6C
ee0d6703 7402 je TesSafe+0x2707 (ee0d6707) // TesSafe+2703,跳转处理
ee0d6705 8901 mov dword ptr [ecx],eax
ee0d6707 c3 ret
执行 eb TesSafe+2703 75,即将地址ee0d6703处的第一个机器码74变成75;
至此,已经过掉所有的检测 KeDisableDebugger的跳转。
大家也可以直接下 eb nt!KdDisableDebugger+26 75;eb nt!KdDisableDebugger+41 75;eb TesSafe+5069 74; eb TesSafe+2703 75;eb nt!KdDisableDebugger+1d 74; eb nt!KdDisableDebugger+36 75断点。 |
评分
-
查看全部评分
|