Assembly 在调试器中观察到ASM跳转指令的不精确性
我正在对OllyDbg中的一个应用程序进行一些内联修改,并注意到一些奇怪的行为 以下是我编写的指令,直接从调试器复制:Assembly 在调试器中观察到ASM跳转指令的不精确性,assembly,x86,reverse-engineering,machine-code,ollydbg,Assembly,X86,Reverse Engineering,Machine Code,Ollydbg,我正在对OllyDbg中的一个应用程序进行一些内联修改,并注意到一些奇怪的行为 以下是我编写的指令,直接从调试器复制: 2005FE35 4C DEC ESP 2005FE36 77 21 JA SHORT 2005FE59 ; 23 byte difference 为了清楚起见,我只修改了操作码(4C 77 21);其他一切都由OllyDbg自动解释,这就是我的困惑所在。指令应该减少ESP寄存器,然后执行21个十六进制字节的条件前跳。
2005FE35 4C DEC ESP
2005FE36 77 21 JA SHORT 2005FE59 ; 23 byte difference
为了清楚起见,我只修改了操作码(4C 77 21);其他一切都由OllyDbg自动解释,这就是我的困惑所在。指令应该减少ESP寄存器,然后执行21个十六进制字节的条件前跳。然而,地址0x2005FE59和0x2005FE36之间的差异不是21,而是23
在使用21个十六进制字节的值时,我观察到了看似不稳定的结果
2005FE36 77 20 JA SHORT 2005FE58 ; 22 byte difference
2005FE36 77 19 JA SHORT 2005FE51 ; 1B byte difference
2005FE36 77 17 JA SHORT 2005FE4F ; 19 byte difference
我指示向前跳转的十六进制字节数与地址偏移量不匹配;它似乎总是以2为准
这里发生了什么?跳转(或任何指令)是在读取指令后执行的,IP是按指令大小(2字节)递增的,因此跳转是相对于
2005FE38跳转(或任何指令)而言的,跳转是在读取指令后执行的,IP是按指令大小(2字节)递增的所以跳跃是相对于2005FE38的,这可以解释事情。非常感谢@AK-33标准的基本CPU取数/执行周期是(1)从IP取数指令(n字节),(2)将IP增加n字节,(3)执行指令。这可以解释问题。非常感谢@AK-33标准的基本CPU获取/执行周期是(1)从IP获取指令(n字节),(2)将IP增加n字节,(3)执行指令。