macos - OS X 上的 WriteProcessMemory 等效项

标签 macos delphi hook delphi-xe2

我正在使用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.

事实是,我需要 Hook TObject.FreeInstance 方法才能收到每个对象销毁的通知(是的,我知道,如果有人决定覆盖它并且不调用继承,则可能不会调用它)。

另一个使用 WriteProcessMemory 的单元是 ReturnTypePatch.pas修复 QC #98687这对于像我这样的 Mocking 库和 Vincent Parrett 的 Delphi Mocks 来说是必要的(在我们都意识到这个问题之前,他基本上就有一个用户报告了这个问题)。

WriteProcessMemory 的另一个用途是在 DSharp 的 AOP 部分中,我基本上用从 RTTI 的 TVirtualMethodInterceptor 类创建的代理类 VMT 替换类的 VMT。使用 TVirtualMethodInterceptor,您只能代理现有对象 - 我的实现对整个类执行此操作(因此所有现有和 future 的对象,即使是继承的)。

在所有情况下,都无法使用 Move 写入内存,因为它们受到保护(通过调用 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=3http://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/

相关文章:

multithreading - 与GCD并行进行光线追踪时,线程捕获了正在燃烧的CPU

python - py2app 构建的应用程序在其他机器上显示 `ERROR: pygame.macosx import FAILED`

Delphi TStringList Find 方法找不到项目

Wordpress 添加新的用户 Hook

security - 使用 WinAPI Hook 对程序进行沙箱处理

macos - 拦截 NSMenu 按键事件

javascript - 是否可以在主显示器以外的其他显示器上显示网络推送通知?

delphi - 具有大量 shell 项目时的 SelectDirectory/ShBrowseForFolder 问题

delphi - 为什么使用 FILE_FLAG_NO_BUFFERING 打开文件时写入失败?

c++ - 在linux库中查找静态函数地址