首页
社区
课程
招聘
[原创]WIN7 X64 DNF IDT01 逆向
发表于: 2019-4-26 22:38 14463

[原创]WIN7 X64 DNF IDT01 逆向

2019-4-26 22:38
14463

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直播授课

收藏
免费 4
支持
分享
最新回复 (16)
雪    币: 634
活跃值: (1149)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
2
山总:很好。又省我50块钱
2019-4-27 00:43
0
雪    币: 12502
活跃值: (3048)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
3
不懂,可能是为了效率吧,把内存藏起来,损失的效率太大了估计。
2019-4-27 08:22
0
雪    币: 12848
活跃值: (9108)
能力值: ( LV9,RANK:280 )
在线值:
发帖
回帖
粉丝
4
hook的挂,用内存隐藏是藏不了的,不依赖vt,没法做到读写和执行页分离。
并且hook肯定是注入了,既然注入那就是游戏线程的上下文,那替换假cr3也没用了
最后于 2019-4-27 09:56 被hzqst编辑 ,原因:
2019-4-27 09:55
0
雪    币: 1454
活跃值: (84)
能力值: (RANK:10 )
在线值:
发帖
回帖
粉丝
5
去研究Win10 64位1903的IDT Hook吧
2019-4-27 13:40
0
雪    币: 144
活跃值: (335)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
mark一下 谢谢分享
2019-4-27 14:09
0
雪    币: 223
活跃值: (32)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
厉害,mark一下
2019-4-27 14:37
0
雪    币: 914
活跃值: (2293)
能力值: ( LV5,RANK:68 )
在线值:
发帖
回帖
粉丝
8
新人都这么厉害了吗
2019-4-27 17:28
0
雪    币: 83
活跃值: (1082)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
9
win7x64 双机调试 你过了检测?
2019-4-28 17:37
0
雪    币: 2055
活跃值: (486)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
10
killpy win7x64 双机调试 你过了检测?
https://bbs.pediy.com/thread-247940.htm  按照这上面来就能过了
2019-4-28 17:41
0
雪    币: 83
活跃值: (1082)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
11
不吃麻婆豆腐 https://bbs.pediy.com/thread-247940.htm 按照这上面来就能过了
win7x64的呢  另外你这个后面我没看明白  0e里面会根据异常地址 进程等信息 给一个真实的cr3 和真实cr3里的rip地址 完后设置单步(dr寄存器) 返回后 在真实cr3执行一条指令后 立刻触发单步异常 进入idt 01中断 里面根据相关情况 会把页表再次换成假页表  你这里直接漏掉了 所以不能单步
2019-4-28 18:30
0
雪    币: 2055
活跃值: (486)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
12
killpy win7x64的呢 另外你这个后面我没看明白 0e里面会根据异常地址 进程等信息 给一个真实的cr3 和真实cr3里的rip地址 完后设置单步(dr寄存器) 返回后 在真实cr3执行一条指令后 立 ...
win7处理方法一样  win10低版本和win7x64一样
2019-4-28 18:58
0
雪    币: 248
活跃值: (3789)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
内存隐藏很难兼容
2019-5-1 16:58
0
雪    币: 218
活跃值: (1815)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
BDBig 山总:很好。又省我50块钱
山总给了你多少广告费啊,天天跟人家打广告
2019-12-16 11:05
0
雪    币: 38
活跃值: (168)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
早不能用了 
2020-7-1 18:46
0
雪    币: 38
活跃值: (168)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
16
山总 很牛了。
2020-7-6 23:39
0
雪    币: 10
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
17
有dnf开发吗,合作
2020-7-20 02:53
0
游客
登录 | 注册 方可回帖
返回
//