我在我的库中使用方法挂钩/绕行。
由于 WriteProcessMemory/ReadProcessMemory 是 Windows API 函数,OS X 上的方法挂钩/绕行的解决方案是什么?
编辑:
好的,让我在这里提供更多信息,以便更清楚我为什么要问这个问题:
在我的DSharp库中即将推出的功能中,我有以下代码:
procedure FreeInstance(Self: TObject);
begin
...
Self.CleanupInstance;
FreeMem(Pointer(Self));
end;
var
FreeInstanceBackup: TXRedirCode;
initialization
...
HookCode(@TObject.FreeInstance, @FreeInstance, FreeInstanceBackup);
finalization
UnhookCode(@TObject.FreeInstance, FreeInstanceBackup);
...
end.
事实是,我需要连接到 TObject.FreeInstance 方法以收到每个对象销毁的通知(是的,我知道,如果有人决定覆盖它并且不调用继承,它可能不会被调用)。
另一个使用 WriteProcessMemory 的单元是ReturnTypePatch.pas,它修复了QC #98687,这对于像我的 Mocking 库和来自 Vincent Parrett 的 Delphi Mocks 是必需的(在我们都意识到这个问题之前,他基本上有一个用户报告了这个问题)。
WriteProcessMemory 的另一个用途是在 DSharp 的 AOP 部分中,我基本上将一个类的 VMT 替换为从 RTTI 的 TVirtualMethodInterceptor 类创建的代理类 VMT。使用 TVirtualMethodInterceptor,您只能代理现有对象 - 我的实现为整个类执行此操作(因此所有现有和未来的对象,即使继承)。
在所有情况下,无法使用 Move 写入内存,因为它们受到保护(在调用 CopyMemory 替换 WriteProcessMemory 时获取 AV)。
希望这是关于我正在使用这些功能做什么的足够信息 - 有人可以为我指出一个适用于 OS X 的解决方案(不幸的是我没有,所以我无法测试任何东西)。