在调试器中观察到 ASM 跳转指令不精确

Imprecision of ASM jump instructions observed in debugger

我正在对 OllyDbg 中的应用程序进行一些内联​​修改,我注意到一些奇怪的行为。

这些是我写的指令,直接从调试器复制而来:

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