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
这东西 分析的头皮发麻 越分析 越懵逼
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课