X86呼び出し命令の代替手段は何ですか?たぶん、リターンアドレスのプッシュとジャンプのようなものですか?
また、メモリ内の現在の位置を取得するためのコマンドですか?
たとえば、CALLは実際にこれを行います
CALL my_func
次のようなことをします
Push ret_address
jmp my_func
後続のRET呼び出しは、ある意味でJMPにプッシュしたばかりのアドレスを使用するだけです。 CALLを使用したくない特定の理由はありますか、それとも使用できませんか?メモリ内の現在の位置については、EIPレジスタの読み取りを試みることができます(書き込むことはできません)。
Dword値とjmpをプロシージャにプッシュするだけです。プッシュはリターンアドレスになります:
Push return_address (Push eax if address in eax)
jmp call_address
その特定の呼び出しに引数が存在する場合は、引数をプッシュすることも忘れないでください。
メモリ内の現在の位置とはどういう意味ですか?あなたは現在の命令ポインタを意味していると思います。これを直接取得することはできませんが、sehハンドラー(構造化例外ハンドラー)を使用して、処理された例外が発生したときにその値を取得できます。
何かが混同されないのなら、それは状況次第だと思います。ご覧のとおり ここ 近距離通話と遠距離通話がありますが、近距離通話について考えてみましょう。ここでも2つの可能性があります
E8 <offset> # relative
FF <address> # absolute
一方、FF
は絶対的な「ジャンプ」を意味し、E8
は確かに現在のeip
に関連することを意味します。
だからあなたが例えば持っているなら.
E8 32 45 ab 6f
つまり、
call 0x3245ab6f
これは、
Push %eip
add $0x3245ab6f, %eip
ではなく
Push %eip
jmp $0x3245ab6f