Win7 X64 DNF IDT01 逆向
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
本文由看雪论坛 不吃麻婆豆腐 原创
转载请注明来自看雪社区
戳
热门文章阅读
公众号ID:ikanxue
官方微博:看雪安全
商务合作:wsc@kanxue.com