4

我目前正在开发一个 x86 反汇编程序,并开始反汇编一个 win32 PE 文件。大部分反汇编代码看起来不错,但是有一些非法的 0xff /7 操作码的出现(/7 表示 reg=111,0xff 是操作码组 inc/dec/call/callf/jmp/jmpf/push/非法操作数r/m 16/32)。第一个猜测是,/7 是 pop 指令,但它是用 0x8f /0 编码的。我已经对照官方的英特尔架构软件开发人员手册第 2 卷:指令集参考检查了这一点——所以我不只是被误导了。

反汇编示例:(S0000O0040683a 是被另一条指令跳转到的标签)

S0000O0040683a: inc    edi                      ; 0000:0040683a  ff c7
                test   dword ptr [eax+0xff],edi ; 0000:0040683c  85 78 ff
                0xff/7 edi                      ; 0000:0040683f  ff ff

顺便说一句:gdb 对此进行了同样的反汇编(除了错误 0xff 在我的反汇编中没有产生 -1 ):

(gdb) disassemble 0x0040683a 0x00406840
Dump of assembler code from 0x40683a to 0x406840:
0x0040683a:     inc    %edi
0x0040683c:     test   %edi,0xffffffff(%eax)
0x0040683f:     (bad)  
End of assembler dump.

所以问题是:Windows的非法操作码异常处理程序中是否有任何默认处理程序,它实现了这个非法操作码中的任何功能,如果是:那里发生了什么?

问候, 博多

4

4 回答 4

4

在让我的反汇编程序以与 gdb 完全相同的语法生成输出之后,我可以区分这两个版本。这在我的反汇编中揭示了一个相当尴尬的错误:我忘记考虑到 0x0f 0x8x 跳转指令有一个两字节操作码(加上 rel16/32 操作数)。因此,每个 0x0f 0x8x 跳转目标都偏离了一个,导致代码在现实中无法访问。修复此错误后,不再反汇编 0xff/7 操作码。

感谢所有回答我的问题的人(并评论这些答案),因此至少试图帮助我。

于 2009-02-13T13:53:46.640 回答
2

Visual Studio 将其反汇编为以下内容:

00417000 FF C7            inc         edi  
00417002 85 78 FF         test        dword ptr [eax-1],edi 
00417005 ??               db          ffh  
00417006 FF 00            inc         dword ptr [eax] 

显然,一般保护错误发生在 00417002,因为 eax 没有指向任何有意义的东西,但即使我将其 nop 出来(90 90 90),它也会在 00417005 处引发非法操作码异常(它不会被内核处理)。我很确定这是某种数据而不是可执行代码。

于 2009-02-12T12:12:53.787 回答
1

为了回答您的问题,Windows 将使用异常代码 0xC000001D 关闭应用程序STATUS_ILLEGAL_INSTRUCTION。该对话框将匹配用于任何其他应用程序崩溃的对话框,无论它提供调试器还是发送错误报告。

关于提供的代码,它似乎要么组装不正确(编码大于 8 位位移),要么实际上是数据(正如其他人已经建议的那样)。

于 2009-02-12T12:47:56.153 回答
0

看起来测试指令插入了 0xFFFFFFFF 而不是 0xFF,可能是错误的?

85 = 测试 r/m32,78 是参数 [eax+d​​isp8]、edi 的字节,后面的 disp8 应该是 0xFF (-1),但作为 32 位有符号整数,它是 0xFFFFFFFF。

所以我假设你有 85 78 FF FF FF FF 应该是 85 B8 FF FF FF 用于 32 位位移或 85 78 FF 用于 8 位位移?如果是这种情况,代码中的下一个字节应该是 0xFF...

当然,正如已经建议的那样,这可能只是数据,不要忘记数据可以存储在 PE 文件中,并且没有任何特定结构的有力保证。如果您正在积极优化以减小 .exe 大小,您实际上可以将代码或用户定义的数据插入到某些 MZ 或 PE 标头字段中。

编辑:根据下面的评论,我还建议使用您已经确切知道预期的反汇编代码应该是什么的可执行文件。

于 2009-02-12T13:20:52.593 回答