OllyDbg FPU 反调试

逆向工程 ollydbg 反调试
2021-06-15 02:03:21

在玩弄 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 上测试。

1个回答

最后一条指令操作码主要是为异常处理程序的使用设置的,但它是为每个非控制 FPU 指令设置的(即,由加载、存储、比较等设置)。

该值在我的系统上不为零,但它是不同的值,并且不是常数。

Olly 1 请求的上下文字段不像 Olly 2 那样多,这也是值不同的部分原因。上下文结构初始化留下一些未分配的字段。设置某些位并不是 Olly 特有的。另请注意, (0xd800+)0x7ff 的值不会解码为任何有意义的指令。

总之,不是一种可靠的检测方法。