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 回答