我目前正在尝试理解以下PE代码指令的翻译:
004033C0 | .-E9 3BDCFFFF | JMP seh_exam.00401000
我自己进行了一些研究,因为它是无条件的跳转,我认为它是下表中的指令:
(图片来源:http://www.mathemainzel.info/files/x86asmref.html#jmp)
根据我的理解,字节E9 =无条件跳转,3B = o0和DC = 01,其中o0和01表示设置EIP的偏移量。
代码跳了9152个字节,但负偏移的转换究竟是如何工作的?任何建议将不胜感激。
PS:不是作业问题。
答案 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)
。