OllyDbg 没有正确解释 SSE2 指令和操作数

问题描述

注意:使用 OllyDbg v1.1

我正在尝试对程序中的子例程进行逆向工程,该子例程可能使用某种技术来挫败基本的“IsDebuggerPresent”之外的过程。

我在 IDA 中反汇编了代码,但某些指令没有被 OllyDbg 识别为任何有效指令。这会发生多次,并且经常导致后面的指令弄乱它们的对齐。请注意,代码会执行,我只是无法在需要设置的区域设置断点,以便在特定函数调用之前查看堆栈上的特定值。

特别是,IDA 反汇编为 SSE2 movq [ebp+var_DF4],xmm0 的指令似乎有问题(见下文)。

鉴于 var_DF4 = -0x0DF4,我认为 Olly 应该将其标识为
MOVQ QWORD PTR [EBP-0xDF4],XMM0 就像 IDA 一样。

我试图通过手动尝试组合指令来强制 Olly 执行此操作,但我收到错误消息“命令不支持给定操作数。”

这是在IDA中看到的成功反汇编的代码

Here is the successfully disassembled code seen in IDA

Olly 展示的内容如下:

Here is what Olly shows

解决方法

movq 是 SSE2 指令 (https://www.felixcloutier.com/x86/movd:movq)。 xorps 和 movups 是 SSE1 指令,所以你的 Ollydbg 版本似乎只知道 SSE1。

这可以解释您所看到的一切,唯一的解决方案是使用知道如何反汇编代码使用的指令集扩展的较新软件。

从反汇编来看,很明显 Ollydbg 只是放弃了带有 0F D6 前缀的 2 字节 66 操作码。它将其视为它不知道的指令的结束。 (66 是操作数大小前缀,是作为 movq 编码的一部分的“强制前缀”。)

它不假设未知指令有一个 ModRM 字节,所以它在 85 字节处再次开始解码,这应该是你的 movq 的 ModRM,但如果你在那里开始解码,它是操作码对于 TEST r/m32,r32,这就是 Olly 看到的。位移字节被解码为该 test 的 ModRM 和 SIB,留下两个位移字节 (FF FF),它们被解码为另一个未知指令。