英特尔80x86 PE代码转换

bet*_*eta 0 x86 portable-executable

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

004033C0 | .-E9 3BDCFFFF | JMP seh_exam.00401000
Run Code Online (Sandbox Code Playgroud)

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

在此输入图像描述

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

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

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

PS:不是作业问题.

Mic*_*ael 5

您问题中的说明是a JMP rel32,未显示在您所显示的表格中.您可能应该使用更好的参考,例如英特尔的软件开发人员手册.

字节3B DC FF FF在一个小端布局(其为x86处理器使用什么)形成32位的双字FFFFDC3B.在二进制补码表示中,值FFFFDC3B等于-23C5.

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