在Windows 8.1 Preview x64上,OllyDbg如果试图启动一个程序进行调试,会出现一个死在ntdll.RtlUserThreadStart的单步异常:
这个问题其实是由内核在创建进程时引发的,内核如何做的我没仔细看,就在创建进程后,内核把LdrInitializeThunk中执行ZwContinue的CONTEXT结构体的EFlags设置加上了TF(单步)标志,使得ZwContinue设置CONTEXT跑去执行RtlUserThreadStart的一条指令后就中断了,而又没有异常处理去Skip这个异常,就出现了无法调试的问题。
修复这个问题很简单,设置OD停在系统断点,然后把ZwContinue的CONTEXT中的EFlags改成202而不是默认的302即可,如下图:
这样F9后就能停在入口点了。还是希望8.1的RTM能修复这个问题。
还有大家需要注意下目前x64上32位程序在切内核时跟x86的异同。
x86:

在Windows 8.1 Preview x64上使用OllyDbg进行程序调试时,会遇到在ntdll.RtlUserThreadStart处的单步异常。原因是内核在创建进程后设置了EFlags的TF标志导致异常。解决方法是在OD中设置系统断点,修改ZwContinue的CONTEXT EFlags为202而非302,以便成功停在入口点。希望8.1 RTM版能解决此问题,同时提醒用户注意x64平台上32位程序切内核的差异。
最低0.47元/天 解锁文章

被折叠的 条评论
为什么被折叠?



