首页
社区
课程
招聘
[求助]Drx寄存器除了G(S)etThreadContext以外,还有没有其他方法读写?
发表于: 2009-7-12 11:07 6933

[求助]Drx寄存器除了G(S)etThreadContext以外,还有没有其他方法读写?

2009-7-12 11:07
6933
Drx寄存器除了G(S)etThreadContext以外,还有没有其他方法读写?
研究一个Securom的壳,通过GetVersion函数已经把OEP找到,但是由于它会修改Drx寄存器导致硬件断点不管用,而软件断点无法下在自修改模块上。
硬件下断GetThreadContext和SetThreadContext都没有断下,NtGetThreadContext和NtSetThreadContext也是如此。而且如果通过观察,它似乎用Drx存取了一些数据,所以用PhantOm(不知道它的原理是什么)保护Drx,就无法正常运行起来。
由于不能使程序断在OEP处,dump出来的东西总是存在些问题的。它到底是怎么读写Drx寄存器的?请赐教!

[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

收藏
免费 0
支持
分享
最新回复 (7)
雪    币: 722
活跃值: (123)
能力值: ( LV12,RANK:300 )
在线值:
发帖
回帖
粉丝
2
调试器修改被调试程序的线程上下文才会用GetThreadContext和SetThreadContext,程序线程自己修改自己的线程上下文只需要使用结构化异常处理(SEH)就可以了。从楼主的描述看,很可能是壳中采用了SEH来anti-debug,这是加密壳采用的典型的anti-debug方式,楼主应该学习一下这方面的知识。
2009-7-12 18:57
0
雪    币: 359
活跃值: (41)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
3
我只问个简单的问题,如何不用SetThreadContext来修改dr0-dr7的寄存器,直接mov dr0,eax会报异常,似乎只能在ring0里面改……
不过已经能在OEP处断下了,也可以将程序dump出来,要补的区段也通过Hook VirtualAllocEx得到了。不过securom真是变态,一堆cpuid做加密种子,被加密的这些代码要在以后运行过程中才被解密出来,而加密着的代码每次都不一样,写了一个Loader把这些段加载上去也运行不了。翻了翻了老帖,才知道它用了当前进程ID做加密种子,下断GetCurrentProcessId发现确实如此。
只能再试试看了,不过这壳太硬,我这样的菜鸟估计脱不了了……
2009-7-12 19:51
0
雪    币: 2110
活跃值: (21)
能力值: (RANK:260 )
在线值:
发帖
回帖
粉丝
4
不用GetThreadContext获取Context:发生异常时,系统会将Context结构传给在SEH链中注册的HANDLER。

不用SetThreadContext设置Context:当异常处理结束时,系统调用NtContinue()可以重新装载线程的Context.
2009-7-12 19:51
0
雪    币: 359
活跃值: (41)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
5
原来是修改异常处理程序传递进来的Context参数就可以修改drx了,谢谢。
2009-7-12 19:54
0
雪    币: 635
活跃值: (101)
能力值: ( LV12,RANK:420 )
在线值:
发帖
回帖
粉丝
6
用内核调试器就可以修改DRX了
2009-7-12 20:11
0
雪    币: 2067
活跃值: (82)
能力值: ( LV9,RANK:180 )
在线值:
发帖
回帖
粉丝
7
LZ喜欢倒着来?
2009-7-12 21:51
0
雪    币: 264
活跃值: (11)
能力值: ( LV9,RANK:250 )
在线值:
发帖
回帖
粉丝
8
SEH吧

勇于调戏SR的都是高手..
2009-7-13 00:01
0
游客
登录 | 注册 方可回帖
返回
//