2

関数をフックしてリダイレクトするために使用されるのはなぜですか?

このような:

procedure RedirectProcedure(OldAddress, NewAddress: Pointer);
var
  NewCode: TInstruction;
begin
  NewCode.Opcode := $E9; //relative jump
  NewCode.Offset := NativeInt(NewAddress)-NativeInt(OldAddress)-SizeOf(NewCode);
  PatchCode(OldAddress, NewCode, SizeOf(NewCode));
end;

ところで、$E9 定数とはどういう意味ですか?

4

1 に答える 1

8

ジャンプ命令は、命令ポインターを新しい位置に移動します。goto に相当する機械語です。絶対ジャンプは、命令ポインターを絶対アドレスに移動します。相対ジャンプは、現在の命令ポインターを基準にして指定されたアドレスにジャンプします。

$E9 オペコードは、32 ビット オフセットの相対ジャンプです。異なるサイズのオフセットを持つジャンプには、異なるジャンプ オペコードがあることに注意してください。

アドレスはジャンプ命令の最後に相対的であるため、SizeOf(NewCode) 調整です。

そのコードは私には見覚えがあります。書いたと思います!

于 2013-07-22T13:13:31.523 に答える