看流星社区

 找回密码
 注册账号
查看: 2114|回复: 0

【模仿】对双机调试的学习

[复制链接]

该用户从未签到

发表于 2017-6-1 17:25:25 | 显示全部楼层 |阅读模式
首先要谢谢zfdyq我是看了他的帖子还有代码一步步验证过来的。

当然在调试的过程中间出了很多问题,但是都一个个解决了,收获还是蛮多的。
我的大体思路都是跟着zfdyq来的,就是关于kdptrap这一块在代码里面没有看到(是我太笨了,没能领略其它的奥妙),我用搜索栈的方法改变这个值。其他地方可以说基本没做多少变动,不要打我,我太懒了,回头研究内核重载时候一定自己写代码。。。。

我还是新手,才学会windbg这些玩意,大神一笑而过就可以了
进入正题吧
一、对三个部分的个人理解
1.关于KdEnteredDebugger
我根据大牛写的这个帖子http://bbs.pediy.com/showthread.php?t=186091将错误都重现了一遍。我感觉搞这个调试,最重要的能力是重现错误。一开始我是在xp下研究的,但是后来保护过了,却下不了断,而且我回溯栈然后搜索只有两处用到KdDeBuggerEnable,没有看到对KdCheckForDebugBreak的调用,所以没法搜索到KdPitchDebugger。但是有一次,竟然出现了KdCheckForDebugBreak的断点,好吧,那时候我还不会栈回溯,直接跳过,然后蓝屏。以后再没遇到过只好放弃了xp,昨天重装的win732.
解决方法就是用大牛提供的思路,Hook这个函数IoAllocateMdl,代码就不贴了。实现原理,我猜是返回一个虚拟地址,映射到KdEnteredDebugger所在物理地址,这样*P就可以按照自己的方式操纵这个变量,不用遵循内核的保护。
2.关于绕过kdsendpacketKdReceivePacket
先上图,大概解释一下我的理解


本人能力有限,不知道童鞋们能看懂不。主要就是,搜索导出表,找到最初kdsendpacketKdReceivePacket地址,给我们的全局变量,然后用我们自己的全局变量替换那个中转变量imp_KdSendPacketimp_KdReceivePacket。。。
3.让*P自己把kdptrap地址写入KiDebugRoutine
还是上图


*P是在第二次调用KdDisableDebugger时候要将KiDebugRoutine写成kdpstub,然后我们就是在hook函数里面通过栈上面的返回地址,得到*P改写的那一段代码,在那段代码中得到保存kdpstub的地址,然后将kdptrap地址写入就好了。

二、简单叙述一下流程
1.关于恢复断点功能,如何得知要转移哪些变量
我一开始在ida里面搜索KdDeBuggerEnable,好家伙,一大排。。。
后来经请教得知,要栈回溯。。一语惊醒梦中人啊。
就是要看看正常情况一个断点经过哪些函数,然后再搜索就可以。。。一层窗户纸,不点不破



可以看到断点信息包的处理流程。在xp下死活搜不到KdCheckForDebugBreak。。。ida里面显示调用KdCheckForDebugBreak的函数都是一些io函数,好奇怪
后面会附上搜索到的相关数据

2.对于*P调用KdDisableDebugger的处理
开始在测试的时候,不知道游戏开始前提前给KdDisableDebugger下断,等游戏开始后一直没法和vm建立联系了。。。都怀疑帖子里面怎么可能做到下断点呢
先下好断点,填上nop和ret



开始游戏,第一次断下来了,单步步过,回到调用函数,发现里面的edi存的是KdDebuggerEnabled,不能直接改代码,我怕有校验,就改了edi指向的数据




继续,第二次断下来就是*P对KiDebugRoutine的赋值了,直接得到kdptrap的地址,覆盖过去就好了,前面已经解释过了。



ok,到此,已经可以进入游戏了。

3.在验证过程中遇到的些问题
先上一张导出表

1.在导出表里面没有KeUpdateSystemTimeAssist,但是用KeUpdateSystemTime竟然可以得到前者的地址,我开始还沾沾自喜的以为发现了学长的错误,后来一直蓝屏蓝屏。。。。


可以看到ddul_KeUpdateSystemTime得到的是KeUpdateSystemTimeAssist,我又不得不用学长原来被我注释掉的那行代码

2.导出表里面也没有KeUpdateRunTime,但是可以获取到。。。好吧,我也不知道哪里没理解透彻

三、贴一些数据和代码
1.找那几个用来判断是否处于内核调试状态变量的数据

代码:
KeUpdateSystemTimeAssist
nt!KeUpdateSystemTimeAssist:
83eb9e0064ff05c4050000incdwordptrfs:[5C4h]
83eb9e07ff3424pushdwordptr[esp]
83eb9e0a8bcdmovecx,ebp
83eb9e0c8bd0movedx,eax
83eb9e0ee8da010000callnt!KeUpdateSystemTime(83eb9fed)
83eb9e13facli


KeUpdateSystemTime83eb9fed
83eba410803d4c4afa8300cmpbyteptr[nt!KdDebuggerEnabled(83fa4a4c)],0
83eba4177464jent!KeUpdateSystemTime+0x48a(83eba47d)

83eba6078b4c241cmovecx,dwordptr[esp+1Ch]
83eba60be80e000000callnt!KeUpdateRunTime(83eba61e)
83eba6105fpopedi

KeUpdateRunTime
83eba767803d4c4afa8300cmpbyteptr[nt!KdDebuggerEnabled(83fa4a4c)],0
83eba76e7412jent!KeUpdateRunTime+0x164(83eba782)

83eba77b7505jnent!KeUpdateRunTime+0x164(83eba782)
83eba77de80c000000callnt!KdCheckForDebugBreak(83eba78e)
83eba7825fpopedi

nt!KdCheckForDebugBreak:
83eba78e803d278df68300cmpbyteptr[nt!KdPitchDebugger(83f68d27)],0
83eba7957519jnent!KdCheckForDebugBreak+0x22(83eba7b0)
83eba797803d4c4afa8300cmpbyteptr[nt!KdDebuggerEnabled(83fa4a4c)],0
83eba79e7410jent!KdCheckForDebugBreak+0x22(83eba7b0)

83eba7a0e822000000callnt!KdPollBreakIn(83eba7c7)
83eba7a584c0testal,al
83eba7a77407jent!KdCheckForDebugBreak+0x22(83eba7b0)
83eba7a96a01push1
83eba7abe804000000callnt!DbgBreakPointWithStatus(83eba7b4)


nt!KdPollBreakIn:
83eba7ce33dbxorebx,ebx
83eba7d0381d278df683cmpbyteptr[nt!KdPitchDebugger(83f68d27)],bl
83eba7d67407jent!KdPollBreakIn+0x18(83eba7df)
83eba7d832c0xoral,al
83eba7dae9d2000000jmpnt!KdPollBreakIn+0xea(83eba8b1)
83eba7df885dffmovbyteptr[ebp-1],bl
83eba7e2381d4c4afa83cmpbyteptr[nt!KdDebuggerEnabled(83fa4a4c)],bl
83eba7e80f84c0000000jent!KdPollBreakIn+0xe7(83eba8ae)
[/code]

2.代码

代码:
ul_KdPollBreakIn=(ULONG_PTR)GetFuncAddress(L"KdPollBreakIn");
KdpTrapAddress=ul_KdPollBreakIn+0x2b2d2b;
...

elseif(bl_FirstInto_KdDsiableDebugger==1){
//现在是第二次进来,此时要把kdptrap的值覆盖过去
//在这里获取kdptrap地址,
__asm
{
pusheax;
pushebx;
moveax,esp;//此时esp减少了14,单步试出来的
addeax,14h;
moveax,[eax]
addeax,31h;
moveax,[eax];
movebx,KdpTrapAddress;
mov[eax],ebx;
popebx;
popeax;
}
bl_FirstInto_KdDsiableDebugger=-1;
//KdBreakPoint();
return0;
[/code]

最后上个图


代码我就不上传了吧,大部分都是zfdyq的代码。该休息一段时间了,要不然一研究起来,中午睡不着,晚上睡不着,吃饭想,走路想。。。连看妹子的心情都没有了
身体最重要啊。
最后的最后,学无止境,大家一定要多看书。
点击按钮快速添加回复内容: 支持 高兴 激动 给力 加油 苦寻 生气 回帖 路过 感恩
您需要登录后才可以回帖 登录 | 注册账号

本版积分规则

小黑屋|手机版|Archiver|看流星社区 |网站地图

GMT+8, 2024-3-19 17:16

Powered by Kanliuxing X3.4

© 2010-2019 kanliuxing.com

快速回复 返回顶部 返回列表