在玩弄 FPU 指令时,我发现了 OllyDbg 的反调试技巧。到目前为止,我还没有在流行的参考文献中找到它。
首先是这里。
fnsave [esp-100h]
cmp word ptr [esp-0EEh], 07FFh ; 07FFh (all bits set) in Olly 2
; 0000h in Olly 1
; something different otherwise
je @being_debugged
代码片段在 +0x12 处检查“最后一条指令操作码”。根据英特尔手册,当且仅当发生异常时才设置它。
该值仅设置一次,在重新启动 (<<) 程序时不起作用。
但我不知道这些值从何而来。当 Olly 调用 debuggee 的 GetThreadContext() 时,该值已经设置。其他调试器似乎没有这样的行为。
任何人都可以证实这一点吗?在 Win XP SP3、Intel P4 上测试。