在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的异同。