欢迎来到 嗅灵易学

零基础也能上手的脚本技术课,一对一答疑带你入门

[原创]解决TP最新版双机调试实例下篇---AGP论坛视频培训课件

[原创]解决TP最新版双机调试实例下篇---AGP论坛视频培训课件

一共有两篇
1篇:TP对双机调试干扰的原理与分析
2篇:解决TP双机调试实战
首先要理解双机调试的几个常识(有点类似初中上学时候,我们要做一道关于三角形的证明题,那么数学老师是不是要先交你几个定理:勾股定理,两点之间直线最短,同角或等角的补角相等 等等),那么现在你要解决双机调试,肯定也要知道双机调试的几个定理(常识):
我们获取知识的
1:就是我告诉你们(别人告诉你们也好。)
2:从自己的实战经验总结(实战出真理。)
3:从书本上得到的知识。
1:KdReceivePacket和KdSendPacket的两个串口函数, 用于接收和发送串口数据
被调试的系统--》KdSendPacket发送数据到串口--》VM虚拟机串口转接到windbg
==》KdSendPacket发送数据到串口,然后被调试的系统KdReceivePacket接收数据
2:不能调用KdDisableDebugger禁止内核调式,否则windbg将无法调式。
NTSTATUS KdDisableDebugger(void)
{
  int v0; // ecx@7
  char v2; // [sp+1h] [bp-1h]@1
  v2 = KfRaiseIrql(2);
  KdpPortLock();
  if ( !KdDisableCount )
  {
    if ( !(_BYTE)KdDebuggerEnabled || (KdPreviouslyEnabled = 1, KdPitchDebugger) )
      KdPreviouslyEnabled = 0;
    if ( (_BYTE)KdDebuggerEnabled )
    {
      KdpSuspendAllBreakpoints();
      KiDebugRoutine = (int)KdpStub;
      LOBYTE(KdDebuggerEnabled) = 0;
    }
  }
  ++KdDisableCount;
  KdpPortUnlock();
  LOBYTE(v0) = v2;
  return KfLowerIrql(v0);
}
//禁止双机调试
KiDebugRoutine = (int)KdpStub;
LOBYTE(KdDebuggerEnabled) = 0;
3:双机调试的时候,那么 [KiDebugRoutine]必须指向KdpTrap(正常启动的系统KiDebugRoutine为KdpStub,在Boot.ini里加上/DEBUG启动的系统的KiDebugRoutine为KdpTrap),为了证明这点,我们现在来看虚拟机:
在正常系统下:
lkd> dd KiDebugRoutine //全局变量指向804f7c86 !KdpStub
80553f84  804f7c86 00000000 7c92e4a8 7c92e45c
80553f94  7c92e440 7c92e430 0002625a 00000000
80553fa4  00000000 00000000 00000000 00000000
80553fb4  00000000 00000000 00000000 00000000
80553fc4  00000000 00000000 00000000 00000000
80553fd4  00000000 00000000 00000000 80502b9c
80553fe4  00000000 0000011c 80503010 bf999e80
80553ff4  00000000 0000029b bf99ab90 00000000
lkd> u 804f7c86
nt!KdpStub:
804f7c86 8bff            mov     edi,edi
804f7c88 55              push    ebp
804f7c89 8bec            mov     ebp,esp
804f7c8b 8b4510          mov     eax,dword ptr [ebp+10h]
804f7c8e 813803000080    cmp     dword ptr [eax],80000003h
804f7c94 7525            jne     nt!KdpStub+0x35 (804f7cbb)
804f7c96 83781000        cmp     dword ptr [eax+10h],0
804f7c9a 761f            jbe     nt!KdpStub+0x35 (804f7cbb)
在双机环境下:
kd> dd KiDebugRoutine
80553f84  80661a86 00000000 7c92e4a8 7c92e45c
80553f94  7c92e440 7c92e430 0002625a 00000000
80553fa4  00000000 00000000 00000000 00000000
80553fb4  00000000 00000000 00000000 00000000
80553fc4  00000000 00000000 00000000 00000000
80553fd4  00000000 00000000 00000000 80502b9c
80553fe4  00000000 0000011c 80503010 bf999e80
80553ff4  00000000 0000029b bf99ab90 00000000
kd> u 80661a86
nt!KdpTrap:
80661a86 8bff            mov     edi,edi
80661a88 55              push    ebp
80661a89 8bec            mov     ebp,esp
80661a8b 51              push    ecx
80661a8c 51              push    ecx
80661a8d 8b4510          mov     eax,dword ptr [ebp+10h]
80661a90 813803000080    cmp     dword ptr [eax],80000003h
80661a96 56              push    esi
内核调试器加载,则KiDebugRoutine(KdpTrap)可以处理int 0x3异常(看windbg断下之后是不是 int 0x3):
nt!RtlpBreakWithStatusInstruction:
80528bec cc              int     3
异常处理到这里被正常返回。处理方法是将当前的处理器状态(比如各寄存器等重要信息)发送KdSendPacket(定理1要用到的函数)  给通过串口相连的主机上的内核调试器,并一直在等待内核调试器的回应,系统这时在KdpTrap里调用一个Kd函数KdpSendWaitContinue循环等待KdReceivePacket来自串口的数据(内核调试器和被调试系统通过串口联系),直到内核调试器下达继续执行的命令g,,让系统继续执行,系统可以正常从int 0x3后面一条指令执行。
我大概画了个图给大家理解:
通过图片我们大概知道流程,那么反双机调试只需要把[KiDebugRoutine]修改为KdpStub,又达到了反双机的目的。
推荐大家看两篇文章:http://www.xfocus.net/articles/200412/761.html
http://www.xfocus.net/articles/200412/765.html
一节课我们是无法阐述内核调试原理的,但是我们只要满足上面的三个条件,那么windbg就可以双机调试。那么我们来分析TP。大家都还记得前面我教大家怎么分析游戏保护对系统做的手脚,如果大家对那一节课还没吃透,建议再回去看看。
现在我们以现有的工具gmer来静态分析TP(至于动态分析,我们要到下一节课才会学到。)
为什么不用xuetr,因为人怕出名猪怕壮,xuetr已经进入了tp的黑名单。
总结:
1:两个串口发送函数已经被tp hook。
2:肯定会调用KdDisableDebugger来禁止内核调试
3:TP会强行的把KiDebugRoutine全局变量修改为KdpStub
PS:请期待下篇,下篇讲提供可用的BIN。

上传的附件 图片1.png

注意:上传附件及图片大小不得大于30M。

⚠️ 版权声明:
本博客所有内容(含教程、源码、工具)仅供个人技术学习与研究交流使用,严禁商用、倒卖、二次分发及非法用途。
未经作者书面授权,任何组织或个人不得转载、复制或用于其他平台,违者将追究相关责任。

0 0 0 举报
复制成功