首页
社区
课程
招聘
[原创]对双机调试的探索
发表于: 2014-1-21 12:26 30843

[原创]对双机调试的探索

2014-1-21 12:26
30843
1: kd> dd kdDebuggerEnabled
83f9d96c  00000001 00000000 00000000 db1dbbbb
1: kd> ed kdDebuggerEnabled 0
1: kd> dd kdDebuggerEnabled
83f9d96c  00000000 00000000 00000000 db1dbbbb
00 807eaae0 83eb40cb nt!RtlpBreakWithStatusInstruction
01 807eaae8 83eb409d nt!KdCheckForDebugBreak+0x22
02 807eab98 83eb937f nt!KeUpdateRunTime+0x164
03 807eac20 83eb0e0d nt!PoIdle+0x524
04 807eac24 00000000 nt!KiIdleLoop+0xd
00 807eaae0 83e950cb nt!RtlpBreakWithStatusInstruction
01 807eaae8 83e9509d nt!KdCheckForDebugBreak+0x22
02 807eab18 8422f430 nt!KeUpdateRunTime+0x164
03 807eab18 937d05d6 hal!HalpClockInterruptPn+0x158
...
1: kd> uf KeUpdateRunTime
后ctrl+F搜索kdDebuggerEnabled发现一处代码
83eb4082 803d6cd9f98300  cmp     byte ptr [nt!KdDebuggerEnabled (83f9d96c)],0
83eb4089 7412            je      nt!KeUpdateRunTime+0x164 (83eb409d)
83eb408b a1740ff783      mov     eax,dword ptr [nt!KiPollSlot (83f70f74)]
83eb4090 3b86cc030000    cmp     eax,dword ptr [esi+3CCh]
83eb4096 7505            jne     nt!KeUpdateRunTime+0x164 (83eb409d)
83eb4098 e80c000000      call    nt!KdCheckForDebugBreak (83eb40a9)
83eb409d 5f              pop     edi
1: kd> uf KdCheckForDebugBreak
83eb40a9 803d271df68300  cmp     byte ptr [nt!KdPitchDebugger (83f61d27)],0
83eb40b0 7519            jne     nt!KdCheckForDebugBreak+0x22 (83eb40cb)
83eb40b2 803d6cd9f98300  cmp     byte ptr [nt!KdDebuggerEnabled (83f9d96c)],0
83eb40b9 7410            je      nt!KdCheckForDebugBreak+0x22 (83eb40cb)
83eb40bb e81f000000      call    nt!KdPollBreakIn (83eb40df)
83eb40c0 84c0            test    al,al
83eb40c2 7407            je      nt!KdCheckForDebugBreak+0x22 (83eb40cb)
83eb40c4 6a01            push    1
83eb40c6 e801000000      call    nt!DbgBreakPointWithStatus (83eb40cc)
83eb40cb c3              ret
1: kd> u DbgBreakPointWithStatus
nt!DbgBreakPointWithStatus:
83eb40cc 8b442404        mov     eax,dword ptr [esp+4]
nt!RtlpBreakWithStatusInstruction:
83eb40d0 cc              int     3
83eb40d1 c20400          ret     4
83eb40fa 381d6cd9f983    cmp     byte ptr [nt!KdDebuggerEnabled (83f9d96c)],bl
//KdDebuggerEnabled变量存储
BOOLEAN gKdDebuggerEnabled=TRUE;

//KdPitchDebugger变量存储
BOOLEAN gKdPitchDebugger=FALSE;

//转移win7中的KdDebuggerEnabled和KdPitchDebugger变量
void MoveVariable_Win7(IN BOOL b***)
{
    ULONG ulAddr, ulAddr2;

    //----------------------------改写KeUpdateRunTime中的KdDebuggerEnabled 

    //得到原内核的KeUpdateRunTime地址
    ulAddr=GetOriginalProcAddr(L"KeUpdateRunTime");

    //定位KdDebuggerEnabled
    //特征码
    //83ec9082 803d6c29fb8300  cmp     byte ptr [nt!KdDebuggerEnabled (83fb296c)],0
    //83ec9089 7412            je      nt!KeUpdateRunTime+0x164 (83ec909d)
    //83ec908b a1745ff883      mov     eax,dword ptr [nt!KiPollSlot (83f85f74)]
    UCHAR szSig1[10] = {0x80, 0x3d, '?', '?', '?', '?', '?', 0x74, 0x12, 0xa1};

    //特征码定位KdDebuggerEnabled
    ulAddr=SearchCode((PUCHAR)ulAddr, szSig1, 10, 0x200);
    ulAddr+=2;

    //改写KdDebuggerEnabled变量
    PageProtect(FALSE);
    *(PULONG)ulAddr=(ULONG)&gKdDebuggerEnabled;
    PageProtect(TRUE);


    //----------------------------改写KdCheckForDebugBreak中的KdDebuggerEnabled

    //得到KdCheckForDebugBreak地址
    //特征码
    //83ec9098 e80c000000      call    nt!KdCheckForDebugBreak (83ec90a9)
    //83ec909d 5f              pop     edi
    UCHAR szSig2[6] = {0xe8, '?', '?', '?', '?', 0x5f};
    ulAddr=SearchCode((PUCHAR)ulAddr, szSig2, 6, 0x100);
    ulAddr=ulAddr+*(PULONG)((PUCHAR)ulAddr+1)+5;

    //记录KdCheckForDebugBreak函数地址 用于KdPitchDebugger变量的处理
    ulAddr2=ulAddr;

    //特征码定位KdDebuggerEnabled
    //83ec90b2 803d6c29fb8300  cmp     byte ptr [nt!KdDebuggerEnabled (83fb296c)],0
    //83ec90b9 7410            je      nt!KdCheckForDebugBreak+0x22 (83ec90cb)
    //83ec90bb e81f000000      call    nt!KdPollBreakIn (83ec90df)
    UCHAR szSig3[10] = {0x80, 0x3d, '?', '?', '?', '?', '?', 0x74, 0x10, 0xe8};
    ulAddr=SearchCode((PUCHAR)ulAddr, szSig3, 10, 0x100);
    ulAddr+=2;

    //改写KdDebuggerEnabled变量
    PageProtect(FALSE);
    *(PULONG)ulAddr=(ULONG)&gKdDebuggerEnabled;
    PageProtect(TRUE);


    //----------------------------改写KdCheckForDebugBreak中的KdPitchDebugger

    //定位KdPitchDebugger变量
    //由于KdPitchDebugger变量在函数开头偏移2处 所以直接偏移定位KdPitchDebugger
    //83eb30a9 803d270df68300  cmp     byte ptr [nt!KdPitchDebugger (83f60d27)],0
    //83eb30b0 7519            jne     nt!KdCheckForDebugBreak+0x22 (83eb30cb)
    ulAddr2+=2;

    //改写KdPitchDebugger变量
    PageProtect(FALSE);
    *(PULONG)ulAddr2=(ULONG)&gKdPitchDebugger;
    PageProtect(TRUE);


    //----------------------------改写KdPollBreakIn中的KdDebuggerEnabled

    //得到KdPollBreakIn地址
    //特征码
    //83ebe0bb e81f000000      call    nt!KdPollBreakIn (83ebe0df)
    //83ebe0c0 84c0            test    al,al
    UCHAR szSig4[7] = {0xe8, '?', '?', '?', '?', 0x84, 0xc0};
    ulAddr=SearchCode((PUCHAR)ulAddr, szSig4, 7, 0x100);
    ulAddr=ulAddr+*(PULONG)((PUCHAR)ulAddr+1)+5;

    //记录KdPollBreakIn函数地址 用于KdPitchDebugger变量的处理
    ulAddr2=ulAddr;

    //特征码定位KdDebuggerEnabled
    //83ebe0f7 885dff          mov     byte ptr [ebp-1],bl
    //83ebe0fa 381d6c79fa83    cmp     byte ptr [nt!KdDebuggerEnabled (83fa796c)],bl
    //83ebe100 0f84c0000000    je      nt!KdPollBreakIn+0xe7 (83ebe1c6)
    UCHAR szSig5[11] = {0x88, 0x5d, 0xff, 0x38, 0x1d, '?', '?', '?', '?', 0x0f, 0x84};
    ulAddr=SearchCode((PUCHAR)ulAddr, szSig5, 11, 0x100);
    ulAddr+=5;

    //改写KdDebuggerEnabled变量
    PageProtect(FALSE);
    *(PULONG)ulAddr=(ULONG)&gKdDebuggerEnabled;
    PageProtect(TRUE);


    //----------------------------改写KdPollBreakIn中的KdPitchDebugger

    //特征码定位KdPitchDebugger
    //83eb30e6 33db            xor     ebx,ebx
    //83eb30e8 381d270df683    cmp     byte ptr [nt!KdPitchDebugger (83f60d27)],bl
    //83eb30ee 7407            je      nt!KdPollBreakIn+0x18 (83eb30f7)
    UCHAR szSig6[10] = {0x33, 0xdb, 0x38, 0x1d, '?', '?', '?', '?', 0x74, 0x07};
    ulAddr2=SearchCode((PUCHAR)ulAddr2, szSig6, 10, 0x100);
    ulAddr2+=4;

    //改写KdPitchDebugger变量
    PageProtect(FALSE);
    *(PULONG)ulAddr2=(ULONG)&gKdPitchDebugger;
    PageProtect(TRUE);

}
1: kd> dd KiDebugRoutine
83fa2b20  841664f2 83f16683 00000000 0311870a
83fa2b30  00000bb8 00000011 5385d2ba d717548f
83fa2b40  83eb7d5c 00000000 00000191 83eb83a4
83fa2b50  986fa000 00000000 00000339 986fb02c
83fa2b60  00000100 00000000 00000000 83fa2b68
83fa2b70  00000340 00000340 00000007 00000000
83fa2b80  86cdb6b8 86cdb5f0 86ce3838 86ce39c8
83fa2b90  86ce3900 00000000 86d37040 00000000
1: kd> u 841664f2 
nt!KdpTrap:
841664f2 8bff            mov     edi,edi
841664f4 55              push    ebp
841664f5 8bec            mov     ebp,esp
841664f7 51              push    ecx
841664f8 51              push    ecx
841664f9 8b4510          mov     eax,dword ptr [ebp+10h]
841664fc 33d2            xor     edx,edx
841664fe 813803000080    cmp     dword ptr [eax],80000003h

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

上传的附件:
收藏
免费 5
支持
分享
最新回复 (34)
雪    币: 131
活跃值: (98)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
2
不觉明厉阿
2014-1-21 12:41
0
雪    币: 114
活跃值: (180)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
楼主V5,果断先下载了再回帖。
2014-1-21 12:59
0
雪    币: 458
活跃值: (306)
能力值: ( LV12,RANK:400 )
在线值:
发帖
回帖
粉丝
4
不错的东西。
2014-1-21 13:19
0
雪    币: 102
活跃值: (2065)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
5
楼主犀利啊。。。。果断收藏之。。。。
2014-1-21 13:35
0
雪    币: 1098
活跃值: (1293)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
mark 先
2014-1-21 13:35
0
雪    币: 623
活跃值: (40)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
7
mark
2014-1-21 13:44
0
雪    币: 121
活跃值: (121)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
接题请教下,为啥我一开内核调试,不管Windbg连不连得上,一开DNF。立马就让我的虚拟机挂掉,由VMware弹出虚拟CPU挂了。“虚拟 CPU 已进入关闭状态。这会造成物理计算机重新启动。这可能是虚拟机操作系统中的错误或 VMware Workst造成”,点确定重启,取消就关闭了。

本机:Win7 32
VMware 8.0、9.0、10.0
TargetOS:Win7 32
不知道你们遇到过没有?
有遇到的人,求指点。
2014-1-21 13:47
0
雪    币: 228
活跃值: (68)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
犀利,支持楼主
2014-1-21 14:28
0
雪    币: 500
活跃值: (995)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
好文章,感谢lz
2014-1-21 15:54
0
雪    币: 49
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
我也是这样的情况,在VMware打开DNF就蓝屏,我都什么都没运行,就直接挂掉啊。。。。

不知道原因?????
2014-1-21 18:19
0
雪    币: 49
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
看了下楼主的文章,我明白了,楼主调试的应该是这保护的低级版本,应该是1.15.0.13337版本,
如果调试2.0.1.3733版本,估计在VMware里,什么工具都不开,就直接给你蓝屏掉,别想用工具查看这保护在内核调试下做了什么手脚。。。。。。

楼主可以试下最新版本2.0.1.3733,就知道了。。。。。。。。。。
2014-1-21 18:48
0
雪    币: 65
活跃值: (112)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
13
这种内核互掐的做法,实际上已经没意义了,相互死循环而已……有意义的,还是如何守住内核入口,然后又能保证目标程序正常工作。
一句话,仅限于自娱自乐
2014-1-21 19:47
0
雪    币: 77
活跃值: (48)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
mark
2014-1-22 08:15
0
雪    币: 110
活跃值: (308)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
不明觉厉
2014-1-22 08:26
0
雪    币: 5
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
16
腾讯的工程师在论坛里面也看,所以里面的调试方法都找到应对方法,上回有一家伙发了腾讯qq的代码被警告了。
2014-1-22 09:30
0
雪    币: 55
活跃值: (519)
能力值: ( LV6,RANK:80 )
在线值:
发帖
回帖
粉丝
17
目测会火。感谢楼主。
2014-1-22 10:12
0
雪    币: 49
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
18
呵呵,我估计就算企鹅那帮2B工程师24小时在偷看论坛有那个高手发对付他们的2B宝贝保护文章,在有针对性的修改,也没用,应为有强大的360和百度的Crecker高手专门的发文章来对付他们,要不论坛怎么会有那么多的针对企鹅的Creck文章哦!!!!

期待各高手们指点啊!!!!!!
2014-1-22 11:14
0
雪    币: 76
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
19
mark
2014-1-22 13:44
0
雪    币: 135
活跃值: (63)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
20
mark
2014-4-18 18:37
0
雪    币: 38
活跃值: (18)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
21
好厉害,得加紧学习了
2014-6-12 21:36
0
雪    币: 8764
活跃值: (5240)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
22
只想FCUK一下腾讯的安全工程师的MM
2014-6-13 12:59
0
雪    币: 255
活跃值: (12)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
23
看了,写的很详细,非常感谢
2014-6-14 11:32
0
雪    币: 54
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
24
不知道现在还可行嘛。明天试试看!
2014-8-3 00:40
0
雪    币: 124
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
25
现在的已经不行了
2014-8-3 01:49
0
游客
登录 | 注册 方可回帖
返回
//