注意:使用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中看到的成功反汇编的代码:
这是 Olly 展示的内容:
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
的操作码
,这就是奥利所看到的。位移字节被解码为该 test
的 ModRM 和 SIB,留下两个位移字节 (FF FF),它们被解码为另一个未知指令。
OllyDbg 无法正确解释 SSE2 指令和操作数 这是正确的!但是
您可以尝试一下超级成熟专业的工具 OllyDbg 2.01 版 https://www.ollydbg.de/version2.html
它非常了解如何处理 XMM/YMM 寄存器 及其反汇编器支持整数、FPU、MMX、3DNow、SSE1-SSE4.1 和 AVX 操作数