最近刚刚开始讨论汇编语言和调试问题。我有以下代码:
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地址。
希望这个问题能够很好地形成,我仍然是新手。提前谢谢!
答案 0 :(得分:4)
我很困惑为什么OllyDbg并没有为你拆卸跳跃。无论如何,E9
是一个jmp附近,正如你已经想到的那样。从下一条指令开始需要4个字节的偏移量。因此,您的指令实际上是E9 35 80 00 00
,这意味着jump to address of next instruction + 00008035
(x86使用小端字节顺序)。下一条指令的地址当然是006E3693
,因此跳转会将您带到006E3693 + 00008035 = 006EB6C8
,这是您最初编写的内容。