查看原文
其他

Win7 X64 DNF IDT01 逆向

不吃麻婆豆腐 看雪学院 2019-05-25


0x00


1月份的时候研究 dnf调试,win10调试秒过。到了win7发现所有东西都处理了,还是没啥用,然后就看到他HOOK了IDT的01和0E 。


01是处理硬段和单步异常之类的中断,0E是处理内存页面方面的中断。


还有msr 82 就是syscall的r0处理函数,但是他都不是inline Hook,是直接把寄存器里的值改掉的。


Win7 dnf除了降低权限和DebugPort清0外,还替换了个假的cr3。



0x01


我把调试权限和进程权限DebugPort 和cr3解决后,用windows调试器调试的症状就是会程序崩溃。


所以现在只能用VEH调试了,VEH因为有TP有idt01的存在,所以导致了硬件断点失效、单步失效。


所以我们开始分析IDT。



0x02


先打开xt,看看TP idt01的地址:




结果发现这里面的数据和系统IDT完全不一样,根本牛头不对马嘴,这里有个CALL,我们跟进去。




然后......发现还是牛头不对马嘴。


这里面一大堆计算,他还ret了出来。所以这是肯定一段混淆,然后用ret返回真实的idt地址。




          

这是以前分析的,所以前面地址不一样。


入口这里还是没有变化,这里看不懂啥意思的话,可以自己去分析一遍,我写的可能有点乱。





0x03


现在的IDT才对,一大堆保持环境,因为这里是IDT01,所以进来的时候rsp所在的位置是 _KTRAP_FRAME+0x168的位置,这个结构在我上篇分析IDT的帖子里有图片:



因为veh断点是R3的操作,所以我们来看R3的处理。他干了啥,我文档上和windbg上面显示的地址不是一样的,不过代码他没有变,都是一样的。


因为我文档有注释,所以我们看文档(在win7双机调试dnf的时候会发现windng能断下来,但是不能单步。就是这里搞的鬼 R0处理的地方他有个单步位取反的操作)

         

他判断先前模式后,然后有各自的操作,下面是R3:


                  

这里他进了一个CALL有4个参数,当前cr3  _KTRAP_FRAME+0x170   dr6  dr7我们跟进去



               

这里面这个用方框框起来的地方,不知道这串运算有啥用,好多地方都有这样的运算,看不懂,晕晕...



0x04

       

然后碰到了第一个CALL,参数就一个 cr3 穿进去比较。

      


这里找到里个一存储CR3的数组,我们用WINDBG看看里面的东西:





这是一个存储结构体指针的指针,而这个结构体就是存储CR3之类信息的结构体,往下面看汇编代码: 


我们发现,他取到了这个结构体指针,用CR3和偏移为0  70  80的几个值比较了,所以这里应该存的也是CR3。


用WINDBG看:




从图中可以看出这个结构体0偏移位置为假的cr3,因为他PTML4都是空的。


经测试 +0x70是存储真实CR3的位置。


判断相同,对上了就会直接CR3就会直接返回,跳出去:




这个函数里就做了一件事清,循环判断了CR3。判断正确了,就返回这个存储CR3的结构体指针。错误了,就返回0。图中我们看r8是结构体的指针ebx是循环了多少遍。


这里乘以c700我们可以猜测出,这个结构体大小为c700。




现在TP更新了,这个结构体大小变成D828了。


然后我们返回到上一层。



0x05




进call




这个Call貌似没啥用,虽然这里面有个Call清除dr6,但是我当时测试的时候,他好像压根就不执行。


继续出去往下看:





这里他开始判断,有没有异常了。第一个判断,你有异常,就会被拦截然后调到他的处理里面。


但是这下面几个判断,不知道是写错了还是怎样。判断DR寄存器有值了,他就会直接返回并且这里最后rax=0 and r12 的话。


就是返回0。 如果从上一行mov sil,r14b进入下面的话,那么rax最后=0xfffffffff  and r12(传进来的cr3)就是返回个cr3。


所以这里处理硬段失效,我们只需要把这个地方NOP掉就行了。  




这下面几个判断,我寻思着估计是代码写错了8,可能tp程序员有别的考虑

然后下面代码分析的都迷迷糊糊的,不知道他在干啥。





最后下面分析不下去了,看他操作把自己看的很迷。


返回上一层吧,现在真实CR3有了,然后硬段也能下了。


 

这里有个清空单步异常的操作,但是不能nop。很麻,nop掉Dnf就GG了。 



0x06


然后现在调试模式用veh下访问断




可能是我直接写回了cr3,也肯是我开了xt和Ce被制裁了8。


已经可以了断了,但是就是不能单步。这个单步有人可能会说把那个判断返回系统01还是直接返回单步的地方jmp就可以了嘛。


但是 dnf自己会制造这个单步异常,单步异常给系统01 。系统01貌似不能正确的处理。


而且这个单步异常的触发地方奇奇怪怪,各式各样,哪里都会触发。当时我就在想:“他到底是怎么做到这个异常的呢?直到最近分析idt 0E的时候 发现dnf他会在0E里面设置单步”


而且改返回的rip地址,所以这就验证了为啥这里直接改成JMP,只是一个单步异常而已01会处理不了。


因为0e里面还改返回RIP了(也有可能我分析错了,只是猜测)


这是0e的部分分析






0x07


然后来测试用OD附加会出现什么样的问题




断到了( 这都是骗人的,有时会断不到 )但是程序崩溃会出这个400001f单步异常,这个单步估计就要处理0E才能搞定了。



0x08

          

本人技术有限,只能分析出这么多。可能有的地方分析有误,想要OD能调试和能单步跑的,可以去分析下TP 的 0E。


         

最后有个问题很疑惑:为啥TP既然IDT0E都上了,不把内存隐藏搞上去,这样需要hook的外挂不就全死了。

          

读写和执行不是一页,你要HOOK 让你写假页面,你还以为你hook成功了 。但是他就是不执行你的代码。

          

可能是在放水或者不稳定8

          

这东西分析的头皮发麻,越分析 越懵逼




- End -




看雪ID:不吃麻婆豆腐         

https://bbs.pediy.com/user-802719.htm



本文由看雪论坛 不吃麻婆豆腐 原创

转载请注明来自看雪社区



热门图书推荐

 立即购买!




热门文章阅读

1、大疆前员工一不小心泄露源代码,被判刑半年,罚20万

2、SSDT-HOOK

3、议题征集 | 2019看雪安全开发者峰会

4、工信部:网络安全技术应用试点示范项目公示





公众号ID:ikanxue

官方微博:看雪安全

商务合作:wsc@kanxue.com



戳原文,查看更多干货!

    您可能也对以下帖子感兴趣

    文章有问题?点此查看未经处理的缓存