4

我在我的库中使用方法挂钩/绕行。

由于 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 的解决方案(不幸的是我没有,所以我无法测试任何东西)。

4

1 回答 1

10

与 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=3http://www.phrack.org/issues.html?issue=66&id =16(您可能仅从 URL 中就可以猜到他们的目标受众是谁)。但这很容易。将“内存作弊工具”从 Windows 移植到 Mac,您将花费更多时间重写 GUI,而不是实现低级的东西。

但这可能不是进行方法挂钩的最佳方式。特别是如果您要挂钩 ObjC 方法,甚至是 C API。更详细地描述你想做什么,我可以提供更好的选择。

于 2012-06-01T19:13:48.860 回答