LEA EDX,DWORD PTR SS:[EBP-0x810]
PUSH EDX
LEA EAX,DWORD PTR SS:[EBP-0x80C]
PUSH EAX
PUSH DWORD PTR SS:[EBP+0x8]
CALL HKD_GetTeleportPosition
ADD ESP, 0xC
CMP EAX, -1
JNZ 0x42891B
LEA EDX,DWORD PTR SS:[EBP-0x810]
MOV EAX, 0x042890B
JMP EAX
在JNZ 0x42891B
我收到错误。怎么了?我什么都不知道。
答案 0 :(得分:2)
在JNZ 0x42891B我收到错误,有什么不对?我没有意识形态
可以想象汇编程序可以接受JNZ 0x42891B
作为有效指令。它将计算您提供的绝对地址与该指令所在位置之间的距离,然后编码正确的相对地址。你的汇编程序显然没有!
在大多数汇编器中,条件分支的操作数表示为标签。
CMP EAX, -1
JNZ YourTarget
LEA EDX,DWORD PTR SS:[EBP-0x810]
MOV EAX, 0x042890B
JMP EAX
YourTarget:
...
答案 1 :(得分:0)
x86没有绝对近似跳转编码。如果您知道CS的当前值,理论上可以使用far jmp ptr16:32
,但这可能比任何替代方案都慢。
如果你的汇编程序不会为你计算给定绝对地址的相对位移,你可以尝试自己编码(除了我用NASM测试,这不起作用强>):
;; DOESN'T WORK in NASM or YASM, maybe try in MASM / MSVC
db 0x0F, 0x85 ; The opcode for JNZ rel32
dd 0x42891B - ($+4) ; The rel32 itself, from the end of the JNZ.
$
是当前输出位置,不包括当前指令。 (但跳跃位移是从指令的末尾开始的。)
理论上,这可能在位置相关的代码中(在链接时知道它自己的地址),但可能没有汇编程序/链接器支持它。
YASM不会组装(error: data expression too complex
)。 NASM 2.13.01将汇编它,但将其视为$
= 0.因此它向前分支0x42891B - 4
个字节。在链接二进制文件中,我得到400093: 0f 85 93 00 40 00 jne 80012c
我没有MASM或MSVC,因此可能值得尝试。
灵活的替代方案(使用寄存器间接JMP)
CMP EAX, -1
jz @nojump
mov ecx, 0x42891B ; pick any register that you can clobber here
jmp ecx
@nojump: