delphi - delphi 中的补丁例程调用

标签 delphi monkeypatching

我想修补例程调用,以便能够通过一些修改自己处理它。 我正在编写一个资源加载器。我想修补 Delphi 的 LoadResourceModule 和 InitInheritedComponent 例程与我的例程相同。我已经检查了 MadExcept.pas 单元中的 PatchAPI 调用,但无法弄清楚是否可以将其用于我的项目。

我想要类似的东西

my exe at runtime calls -> LoadResourceModule -> jump to -> MyCustomResourceModule...

对此的任何指示都会非常有帮助。

最佳答案

我使用以下代码:

procedure PatchCode(Address: Pointer; const NewCode; Size: Integer);
var
  OldProtect: DWORD;
begin
  if VirtualProtect(Address, Size, PAGE_EXECUTE_READWRITE, OldProtect) then 
  begin
    Move(NewCode, Address^, Size);
    FlushInstructionCache(GetCurrentProcess, Address, Size);
    VirtualProtect(Address, Size, OldProtect, @OldProtect);
  end;
end;

type
  PInstruction = ^TInstruction;
  TInstruction = packed record
    Opcode: Byte;
    Offset: Integer;
  end;

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

您可以通过调用RedirectProcedure来实现您的hook/patch/detour:

RedirectProcedure(@LoadResourceModule, @MyLoadResourceModule);

这适用于 32 位代码。如果新旧函数都驻留在同一个可执行模块中,它也适用于 64 位代码。否则跳转距离可能会超出32位整数的范围。

如果有人能够提供适用于 64 位地址空间的替代方案,无论两个地址相距多远,我都会非常感兴趣。

关于delphi - delphi 中的补丁例程调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8978177/

相关文章:

python - 无法对通用对象进行猴子修补

python - mock.patch() 不修补在函数调用中调用了几个级别的类

delphi - 如何快速显示大 (GB) 文本文件?

windows - 使用 Dejan TComport Delphi 组件从串口读取二进制数据

delphi - 编译器如何处理 case 语句?

ruby-on-rails - 猴子修补事件作业

Delphi Chromium - 当用户单击网页中的按钮时在 Delphi 应用程序中启动命令

delphi - 如何远程调试使用运行时包构建的 Win32 VCL 应用程序

javascript - 修改 Angular/core 包中现有的 Angular 函数

ruby - 如何在 Ruby 中实现安全、向后兼容的 "reverse-monkeypatch"?