偶然出くわした。このトピックを明確にするために、コードケーブ パッチに対する相対 JMP オフセットの計算は、現在のプログラム カウンター アドレスからパッチ アドレスを差し引くことで機能します。
uint32_t patch_address = (uint32_t) VirtualAlloc(...);
uint32_t jmp_offset = patch_address - (current_offset + current_len);
注: current_lenは、JMP 命令が必要とするバイト数です。これは、ショートジャンプ (EB) かロングジャンプ (E9) かによって異なります。あなたの例では2バイトですが、通常のJMP(E8 0x12345678)は5バイトかかります。
したがって、次の MOV および CALL 命令に属する次のバイトをオーバーライドする必要があるため、この例は簡単には機能しないことがわかります。これは、コードケーブがアドレス空間の別の領域に割り当てられているため、現在の命令オフセットまでの距離が長いという事実に依存しています。
したがって、上書きされた 7 バイトを洞窟にコピーすることができます。これは、パッチで EDI レジスタをいじらない場合にのみ機能します (「MOV ECX, EDI」のため)。また、上書きしている CALL アドレスを修正する必要があります。したがって、これはおそらく codecave を配置するのに最適な場所ではありませんが、実行可能です。
ジェネリック レジスタ引数、スタック クリーンアップ、上書きされた asm パディングを処理する独自のフック ライブラリを作成しましたが、上記のフレームワークを使用することをお勧めします。
よろしく、マイケル