英特尔80x86 PE代码转换

时间:2014-07-16 08:28:47

标签: x86 portable-executable

我目前正在尝试理解以下PE代码指令的翻译:

004033C0 | .-E9 3BDCFFFF | JMP seh_exam.00401000

我自己进行了一些研究,因为它是无条件的跳转,我认为它是下表中的指令:

enter image description here

(图片来源:http://www.mathemainzel.info/files/x86asmref.html#jmp

根据我的理解,字节E9 =无条件跳转,3B = o0和DC = 01,其中o0和01表示设置EIP的偏移量。

代码跳了9152个字节,但负偏移的转换究竟是如何工作的?任何建议将不胜感激。

PS:不是作业问题。

1 个答案:

答案 0 :(得分:5)

您问题中的说明是JMP rel32,并未包含在您显示的表格中。您可能应该使用更好的参考,例如Intel's Software Developer Manuals

little-endian布局中的字节3B DC FF FF(x86处理器使用的)构成32位双字FFFFDC3B。在two's complement representation中,值FFFFDC3B等于-23C5

您的跳转指令从4033C0开始,长度为5个字节。由于跳跃位移是相对于下一条指令的开始,因此您将获得跳转目标4033C0 + 5 - 23C5 == 401000。或者,您可以将其写为truncate_to_32_bits(4033C0 + 5 + FFFFDC3B)