-
-
[求助]请教第14章软件保护技术14.2.2节SMC技术中代码C的问题
-
发表于: 2017-8-17 21:58 2451
-
在第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直播授课