了解程序集中的JMP代码

时间:2014-11-13 00:28:17

标签: debugging assembly disassembly opcode

最近刚刚开始讨论汇编语言和调试问题。我有以下代码:

Address   Hex dump          Command                                  Comments
006E3689   .  E8 C5F9FFFF   CALL 006E3053
->006E368E      E9            DB E9
->006E368F      35            DB 35                                    ; CHAR '5'
->006E3690      80            DB 80
->006E3691   .  0000D490      DD 90D40000
006E3695  />  E8 72040000   CALL 006E3B0C

进一步向下......

Address   Hex dump          Command                                  Comments
006EB6C8  /.  6A 58         PUSH 58
006EB6CA  |.  68 A0372A00   PUSH 2A37A0
006EB6CF    ^ E9 C17FFFFF   JMP 006E3695

在我编写由 - >指示的代码之前实际上它们都包含在JMP 006EB6C8中,当然只是跳到第二组代码,推了几个东西然后又回到了顶部。

现在这段代码仍然可以正常运行,但我不确定为什么代码在编译时会改变(使用Ollydbg),但更重要的是(我相信)是代码知道如何跳转和多远。到目前为止,我的研究告诉我E9是跳跃的操作码,但是我还没有能够找到35和80的信息。我假设0000D490是某种偏移,但我找不到任何数学加起来006EB6C8地址。

希望这个问题能够很好地形成,我仍然是新手。提前谢谢!

1 个答案:

答案 0 :(得分:4)

我很困惑为什么OllyDbg并没有为你拆卸跳跃。无论如何,E9是一个jmp附近,正如你已经想到的那样。从下一条指令开始需要4个字节的偏移量。因此,您的指令实际上是E9 35 80 00 00,这意味着jump to address of next instruction + 00008035(x86使用小端字节顺序)。下一条指令的地址当然是006E3693,因此跳转会将您带到006E3693 + 00008035 = 006EB6C8,这是您最初编写的内容。