首页
社区
课程
招聘
[求助]请教第14章软件保护技术14.2.2节SMC技术中代码C的问题
2017-8-17 21:58 2374

[求助]请教第14章软件保护技术14.2.2节SMC技术中代码C的问题

2017-8-17 21:58
2374

在第14章软件保护技术14.2.2节SMC技术中,代码C部分部分,先调用了GetThreadContext函数,又调用了SetThreadContext函数。

如果在SetThreadContext处用od的f8,就会使程序走向错误的路线并终止,反之不用f8就没有这个问题,这是怎么回事呢?

我只知道od的f8,如果当前指令是函数调用call,则会在call指令的下一条指令(返回指令处)下一个一次性的硬件断点。


书中代码:

pushad

mov                edi,offset sContext

mov                ecx,sizeof CONTEXT

xor                eax,eax

cld

rep                stosb

invoke        GetCurrentThread

mov                edi,eax

mov                [sContext].ContextFlags, CONTEXT_ALL

invoke        GetThreadContext,edi,addr sContext

mov                [sContext].ContextFlags, CONTEXT_DEBUG_REGISTERS

mov                [sContext].iDr7,101h ;LOCAL_EXACT_BPM_ENABLED + DR0_ENABLED

invoke        SetThreadContext,edi,addr sContext

popad


在帖子"《加密与解密 第3版》SMC的一个令人费解的bug" 中 ,最后简单提到

(链接 - http://bbs.pediy.com/thread-70444.htm)

"这段代码通过使能DR0调试寄存器,使得调试者不能在跟踪时随意使用硬件寄存器断点或BPM断点,

  一旦设下断点,在使用 OllyDBG 调试时运行到 SetThreadContext 时可能会触发断点,从而改变了程序的流程,最终将影响程序的继续运行。"


在SetThreadContext按f8时,od是会重新设置硬件断点,那dr0有什么作用呢?

如果我在SetThreadContext内部提前下一个断点,按f8会断下,并不会走到别处,

但如果里面又遇到一个call zwSetContextThread,按f8就会跑到其他地方。

我就是想知道这里是具体怎么起作用的,劳请大家解答。




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

收藏
点赞0
打赏
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回