我使用的是Windows 7;架构是x86_64。 我需要从一个地址到另一个地址进行绝对跳转(这些地址之间的距离大于0xFFFFFFFF,所以我不能使用相对跳转)。 我使用过这段代码:
mov rax, 0000000011223344
jmp rax
效果很好;但它的长度是12个字节(太多了 - 8个字节是最大长度)。我提到我的地址总是可以容纳4个字节,所以我更正了代码:
mov eax, 11223344
jmp rax
它的长度是7个字节,它可以很好地工作,直到某些数据在高阶DWORD中进入rax
。例如,如果rax
包含000007FE 00000000,则它会跳转到000007FE 11223344,而不会跳转到00000000 11223344.因此,应用程序崩溃,因为000007FE 11223344处没有数据。
如何使用32位地址在x86_64中编写绝对跳转代码,总指令长度< = 8字节?