Intel 语法 - 带有 $+5 操作数的 jmp/call 指令的含义

逆向工程 拆卸 x86 称呼 英特尔
2021-06-30 10:07:32

我目前正在分析大量的汇编文件,不明白具体的jmpcall$+5操作数:

call $+5
 jmp $+5

为了提供更多的上下文,我收集了一些出现的情况:

mov esp, [ebp+ms_exc.old_esp]
and [ebp+ms_exc.registration.TryLevel], 0
or [ebp+ms_exc.registration.TryLevel], 0FFFFFFFFh
call $+5
jmp sub_4493CA
===== S U B R O U T I N E =======================================
push esi

[...]

mov esp, [ebp+ms_exc.old_esp]
and [ebp+ms_exc.registration.TryLevel], 0
or [ebp+ms_exc.registration.TryLevel], 0FFFFFFFFh
call $+5
jmp sub_45746A
===== S U B R O U T I N E =======================================
mov eax, dword_4778F8

[...]

mov eax, ebx
test al, 2
jnz loc_100994B8
jmp $+5
-----------------------------------------------------------------
mov eax, [ebp+var_34]
mov [ebp+var_40], eax

$+5操作数的含义是什么?

2个回答

call $+5 的操作码是 e8 00000000 所以它调用
jmp $+5的下一条指令操作码是 e9 00000000 所以它跳转到下一个指令

76E95FE0                        E8 00000000 CALL    76E95FE5         ;  <ntdll.call here>
76E95FE5 <ntdll.call here>      00          DB      00
76E95FE6                        E9 00000000 JMP     76E95FEB         ;  <ntdll.jmp_here>
76E95FEB <ntdll.jmp_here>       00          DB      00
76E95FEC                        EB 02       JMP     SHORT 76E95FF0   ;  <ntdll.jmp+4>
76E95FEE                        00          DB      00
76E95FEF                        00          DB      00
76E95FF0 <ntdll.jmp+4>          00          DB      00

$ = 当前位置(指令的开始)

+5 = 从指令开始的 +5 个字节

jmp $+5 = jmp 超过 jmp 指令 3 个字节(短 jmp 占用 2 个字节 + 3 个字节)