首页
社区
课程
招聘
关于od drx保护的一个解决办法
发表于: 2012-2-8 23:54 9658

关于od drx保护的一个解决办法

2012-2-8 23:54
9658

这是很老的问题了,已经不算问题了,但是遇到了还是会很麻烦

od在处理完一个异常继续运行时候会将不用的drx直接清零,不会去判断drx里面有没有数据
貌似在od逻辑里,被调试程序是不可能使用这几个寄存器的,但事实上。。。。
自己改了下,凑活能用

od有个全局变量,是个bool,在每次设置drx的时候都会判断这个bool是否为真,真则继续,假则不修改drx
这个bool是在winmain里通过判断os版本来的,os为NT平台是此值为真,否则为假


[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

上传的附件:
收藏
免费 6
支持
分享
最新回复 (7)
雪    币: 71
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
谢谢lz
这个od能调试了?

下载看看
2012-2-9 00:36
0
雪    币: 213
活跃值: (147)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
mark
正好前一段时间看到类似drx,和楼主探讨下。

如果被调试程序自己修改drx来设置硬件断点,这个断点是不能被OD截获的,所以如要模拟被调试程序的流程,只能找到那个断点的位置,然后F2再F9。而在被调试程序设置好这个断点,到调试到那个断点之间这段过程,不能在OD里F7或者F8,因为这样也会修改drx的值,导致前面的断点失效。
而测试的时候我却发现:通过OD添加的硬件断点也是修改drx的值,如果在这个硬件断点之前F8/F7,虽然drx也会被修改,但是这个硬件断点却能被触发。何解?
2012-2-9 11:03
0
雪    币: 2471
活跃值: (2140)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
这个有用,学习一下,谢谢分享,新年快乐~~~~
2012-2-9 13:51
0
雪    币: 435
活跃值: (1287)
能力值: ( LV13,RANK:388 )
在线值:
发帖
回帖
粉丝
5
可以截获 bp KiUserExceptionDispatcher

不仅仅是不能F78 任何暂停继续的动作都会导致od清drx

你设置的断点od会记录下来,和f8的临时硬段一起set进context,set进context的时候od不关心他记录以外的drx内容
2012-2-9 23:21
0
雪    币: 213
活跃值: (147)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
你这里说的“set进context”也是值修改context里的drx的值吧
如果通过OD下的hp是修改context里的drx,F8会修改context,那HP怎么会被断下来的?
2012-2-12 09:35
0
雪    币: 435
活跃值: (1287)
能力值: ( LV13,RANK:388 )
在线值:
发帖
回帖
粉丝
7
hp是什么,硬断?od有自己数据结构来管理断点,f8的时候他会看自己的数据结构,如果有空闲的drx就使用,没有就cc
当然 你得勾上那个选项
2012-2-13 01:02
0
雪    币: 22
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
我HOOK INT 01 这样下硬件断点可以成功.
        __asm
        {
                PUSH        EAX
                MOV                EAX, 断点一
                MOV                DR0, EAX
                MOV                EAX, 断点二
                MOV                DR1, EAX
                MOV                EAX, DR7
                OR                EAX, 0x270F
                MOV                DR7, EAX
                POP                EAX
        }
        可是为什么我取消断点 :
        __asm
        {
                PUSH        EAX
                MOV                EAX, 0
                MOV                DR0, EAX
                MOV                DR1, EAX
                MOV                EAX, DR7
                AND                EAX, 0xFFFFFFF0
                MOV                DR7, EAX
                POP                EAX
        }
        这样取消断点不行呢...希望大牛指点.

        比如我重新设硬断断点也不行.

        __asm
        {
                PUSH        EAX
                MOV                EAX, 新断点一
                MOV                DR0, EAX
                MOV                EAX, 新断点二
                MOV                DR1, EAX
                MOV                EAX, DR7
                OR                EAX, 0x270F
                MOV                DR7, EAX
                POP                EAX
        }
        望各位大牛指点...解惑.
        难道必须用NtSetContextThread 和异常来设置硬件断点么?
2012-12-22 10:44
0
游客
登录 | 注册 方可回帖
返回
//