我在我的图书馆中使用 method hooking/detour。
由于 WriteProcessMemory/ReadProcessMemory 是 Windows API 函数,因此 OS X 上方法 Hook /绕行的解决方案是什么?
编辑:
好的,让我在这里提供更多信息,以便更清楚为什么我问这个问题:
在我的 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 库(例如我的 Mocking 库和 Vincent Parrett 的 Delphi Mocks)非常重要(在我们都意识到该问题之前,他基本上有一个用户报告了该问题)。
WriteProcessMemory 的另一个用途是在 DSharp 的 AOP 部分,我基本上用从 RTTI 的 TVirtualMethodInterceptor 类创建的代理类 VMT 替换了类的 VMT。使用 TVirtualMethodInterceptor 你只能代理一个现有的对象——我的实现是为整个类做的(所以所有现有的和 future 的对象,即使是继承的)。
在所有情况下都不能使用 Move 写入内存,因为它们是 protected (在调用 CopyMemory 替换 WriteProcessMemory 时获得 AV)。
希望这些信息足以说明我正在使用这些功能做什么 - 有人可以向我指出一个适用于 OS X 的解决方案(不幸的是我没有一个,所以我无法测试任何东西)。
最佳答案
与 WriteProcessMemory/ReadProcessMemory 最直接的等价物是 Mach 调用 vm_write/vm_read。您需要一个 Mach 任务(您可以通过 task_for_pid 获得)而不是 HPROCESS,当然,它们之间存在许多细微差别。
由于 Apple 删除了这些函数的联机帮助页,并且没有在任何 Xcode 文档集中记录它们,因此您必须处理稍微过时的非 Apple Mach/MK/Gnu-Mach 文档,头文件评论(非常好)和/或第三方文章,如 http://www.uninformed.org/?v=4&a=3 和 http://www.phrack.org/issues.html?issue=66&id=16(您可能仅从 URL 中猜出目标受众是谁)。但这很容易。将“内存作弊工具”从 Windows 移植到 Mac,与实现低级内容相比,您将花费更多的时间来重写 GUI。
但这可能不是进行方法 Hook 的最佳方式。特别是如果您正在 Hook ObjC 方法,甚至是 C API。更详细地描述你想做什么,我可以提供更好的选择。
关于macos - OS X 上的 WriteProcessMemory 等效,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/10854910/