x86汇编程序 - Windows下的非法操作码0xff / 7

时间:2009-02-12 11:30:26

标签: windows assembly x86

我正在开发一个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的非法操作码异常处理程序中是否有任何默认处理程序,它实现了此非法操作码中的任何功能,如果是,那么会发生什么?

此致,Bodo

4 个答案:

答案 0 :(得分:4)

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

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

答案 1 :(得分: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没有指出任何有意义的东西,但即使我把它弄出来(90 90 90)它会在00417005抛出非法的操作码异常(它不会被内核处理)。我很确定这是某种数据,而不是可执行代码。

答案 2 :(得分:1)

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

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

答案 3 :(得分:0)

对于测试指令,似乎已插入0xFFFFFFFF而不是0xFF,可能是错误的?

85 =测试r / m32,78是参数[eax + disp8],edi的字节,其后跟随disp8,它应该只是0xFF(-1)但是作为32位有符号整数,这是0xFFFFFFFF

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

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

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