码迷,mamicode.com
首页 > 其他好文 > 详细

过TenProtect

时间:2015-03-30 16:12:22      阅读:816      评论:0      收藏:0      [点我收藏+]

标签:

    32位XP虚拟机,过TP的反调试。其实我也想试试Win7 X64下的TP的。奈何电脑带Win7虚拟机都卡成狗了,更别说运行游戏了。计划这个清明加根内存条,然后再试试X64 的TP

言归正传。如果XP处于 DEBUG 模式,一开TP会直接蓝屏的。逆过早期的TP都知道TP是不停的调用KdDisableDebugger 函数来清零 KdDebuggerEnabled 来防止反调试。

 

基础知识

《软件调试》上的Windows启动过程

技术分享

 

可以看到系统一共调用了两次KdInitSystem()函数

 

第一次调用KdInitSystem() 会初始化全局变量

  1. KdPitchDebugger : Boolean 用来表示是否显示的抑制内核调试, 当启动项中包含 /DEBUG选项时,这个变量会被置为 TRUE
  2. KdDebuggerEnabled : Boolean 用来表示内核调试是否被启用。当启动项中包含 /DEBUG 或者/ DEBUGPORT 而且不包含/NODEBUG时,这个变量置为TRUE
  3. kiDebugRoutine : 函数指针类型 ,用来记录内核调试引擎的异常处理回调函数,当内核调试引擎活动时,指向KdpTrap函数,否则指向KdpStub函数
  4. KdpBreakpointTable : 结构体数组类型,用来记录代码断点。每一个元素为BREAKPOINT_ENTRY结构,用来描述一个断点,包括断点地址。
kd> dd KdPitchDebugger
80546efc  00000000 00000000 00000000 00000000

kd> dd KdDebuggerEnabled
8054d4c1  01000001 00000000 00000000 01000000

kd> dd kiDebugRoutine
80553f04  80661a06 00000000 7c92e4a8 7c92e45c


kd> u 80661a06 
nt!KdpTrap:
80661a06 8bff            mov      edi,edi
80661a08 55              push     ebp
80661a09 8bec            mov     ebp,esp
80661a0b 51              push     ecx
80661a0c 51              push     ecx
80661a0d 8b4510          mov     eax,dword ptr [ebp+10h]
80661a10 813803000080    cmp     dword ptr [eax],80000003h
80661a16 56              push     esi

  

早期的TP是靠循环来清零 KdDebuggerEnabled 0 来达到防止调试的目的,依照这个思路,做以下尝试

先将KdPitchDebugger 置为1
kd> ed KdPitchDebugger 1

kd> dd KdPitchDebugger
80546efc  00000001 00000000 00000000 00000000

然后设置KiDebugRoutine 指向的指针 从KdpTrap 改成 KdpStub 
kd> dd KiDebugRoutine
80553f04  80661a06 00000000 7c92e4a8 7c92e45c

kd> u 80661a06 
nt!KdpTrap:
80661a06 8bff            mov     edi,edi
80661a08 55              push    ebp
80661a09 8bec            mov     ebp,esp
80661a0b 51              push    ecx
80661a0c 51              push    ecx
80661a0d 8b4510          mov     eax,dword ptr [ebp+10h]
80661a10 813803000080    cmp     dword ptr [eax],80000003h
80661a16 56              push    esi


kd> u KdpStub
nt!KdpStub:
804f7c76 8bff            mov     edi,edi
804f7c78 55              push    ebp
804f7c79 8bec            mov     ebp,esp
804f7c7b 8b4510          mov     eax,dword ptr [ebp+10h]
804f7c7e 813803000080    cmp     dword ptr [eax],80000003h
804f7c84 7525            jne     nt!KdpStub+0x35 (804f7cab)
804f7c86 83781000        cmp     dword ptr [eax+10h],0
804f7c8a 761f            jbe     nt!KdpStub+0x35 (804f7cab)


kd> ed KiDebugRoutine 804f7c76
kd> dd KiDebugRoutine
80553f04  804f7c76 00000000 7c92e4a8 7c92e45c

最后恢复KdDebuggerEnabled 为 0。因为如果先恢复KdDebuggerEnabled的值会使 WinDbg接收不到消息,所以最后才赋值,赋值之后我们再Debug?Break(Ctrl+Break)已经没反应了
kd> ed KdDebuggerEnabled 0

附上看雪原地址

http://bbs.pediy.com/showthread.php?t=196149&viewgoodnees=1&prefixid=

http://bbs.pediy.com/showthread.php?t=186091 

 

运行TP,逗比的是TP居然过了,但是,自己的Windbg也废了,断点下不上了。等我功力更深厚了,内存条加了再来补充

 

过TenProtect

标签:

原文地址:http://www.cnblogs.com/lanrenxinxin/p/4378218.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!