これは X64 コードです (私はアセンブリについてあまり知りません。このコードは Visual Studio でコンパイルできますが、どの形式かはわかりません):
.code
extern mProcs:QWORD
myfunc proc
jmp mProcs[1*8]
myfunc endp
mProcs は C コードで定義された配列であり、関数 myfunc は単に配列の 2 番目の要素にジャンプします。C から見ると、*(mProcs+1) (x64 ではポインターが 8 バイトであるため 1*8) にジャンプしています。
GCC ARMバージョンでは、これをやろうとしました:
.extern mProcs
.global myfunc
myfunc:
b mProcs+4
(ここではポインタが4バイトなのでmProcs+4)
しかし、このコードは機能していないようです。Cでは、*(mProcs+1)またはmProcs+1にジャンプすることを意味しますか? どうすれば *(mProcs+1) にできますか?
================================================== ==========================
Michael とのコメントでの議論の後、レジスターで計算を行い、bx 命令を使用してターゲット関数にジャンプする必要があることを理解しました。
しかし、ここで問題が発生します。サンクを実装しているので (関数呼び出しをインターセプトし、途中で何かを実行しています)、ターゲット ルーチンがレジスタをどのように使用するかわかりません。
1.ターゲットにジャンプする前に、呼び出し先の保存レジスタを保持する必要があります。そうしないと、ターゲット関数が間違った値を保持してしまいます。
2.ターゲット関数が正しい引数を持つように、ジャンプを実行する前に引数レジスタをそのままにしておく必要があります。3. 上記の 2 つのポイントは、呼び出し元の保存のみを使用でき、引数以外のレジスタを使用できることを意味します。
r0 ~ r3 は引数レジスタ、r4 ~ r12 は呼び出し先保存レジスタ、r13 以降は特殊レジスタです。
つまり、値を復元せずに使用できるレジスタはありません。
bx 命令がレジスタでしか操作できない場合、そのレジスタが一時的にスタックに保存されたとしても、そのレジスタを復元できる可能性はありません。
解決策はありますか?または、腕のバイナリだけをフックすることはできません。