【问题标题】:WriteProcessMemory equivalent on OS XOS X 上的 WriteProcessMemory 等效项
【发布时间】:2012-06-06 23:14:09
【问题描述】:

我在我的库中使用method hooking/detour

由于 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 替换类的 VMT,该代理类 VMT 从 RTTI 的 TVirtualMethodInterceptor 类创建。使用 TVirtualMethodInterceptor,您只能代理一个现有对象 - 我的实现对整个类都执行此操作(因此所有现有和未来的对象,即使是继承的)。

在所有情况下,都无法使用 Move 写入内存,因为它们受到保护(在使用 CopyMemory 调用替换 WriteProcessMemory 时获取 AV)。

希望这是关于我正在使用这些功能做什么的足够信息 - 有人可以指出一个适用于 OS X 的解决方案(不幸的是我没有,所以我无法测试任何东西)。

【问题讨论】:

  • 看看这个,也许有帮助:stackoverflow.com/questions/10668/…
  • 您是要等效的API函数吗?或者你在问如何挂钩函数?如果你说“两者”,你就有一个 XY 问题;不要假设 X 的解决方案在于知道如何做 Y。如果你真的认为你需要知道这两个问题,请提出两个单独的问题。另外,请注意,链接的挂钩代码可能使用普通的旧 Movememcpy,用于 C 人员),因为它是当前进程中的挂钩代码。
  • @Rob 好吧,我基本上需要知道如何重写正在运行的应用程序的内存。比如挂钩、重写部分 VMT 等。
  • 重写另一个进程的内存有三种基本方法:将自己的代码挂接到进程中(如 Rob 所说,然后你可以只使用 memcpy),作为调试器附加到进程,或使用 Mach蜜蜂。哪一个有意义取决于您最终要完成的任务——而且,如果您要从 Windows 移植某些内容,那么您要移植的内容。
  • 我刚刚注意到它被标记为delphi。很久以前,有人创建了一个名为 GameCheatLib 的开源 delphi 项目(大致基于我编写的类似 Python 库),它封装了用于枚举进程、附加到进程、读取/写入其内存等的代码Mac、Win32 和 linux(或者任何具有完整 ptrace 的 POSIX?)。你可能想用谷歌搜索它;即使它早就死了,来源应该是有帮助的。

标签: macos delphi hook delphi-xe2


【解决方案1】:

与WriteProcessMemory/ReadProcessMemory 最直接等效的是Mach 调用vm_w​​rite/vm_read。您需要一个 Mach 任务(可以通过 task_for_pid 获得)而不是 HPROCESS,当然还有很多小区别。

由于 Apple 已帮助删除了这些函数的联机帮助页,并且没有在任何 Xcode 文档集中记录它们,因此您必须处理稍微过时的非 Apple Mach/MK/Gnu-Mach 文档,头文件 cmets(非常好)和/或第三方文章,如 http://www.uninformed.org/?v=4&a=3http://www.phrack.org/issues.html?issue=66&id=16(您可能仅从 URL 中猜出他们的目标受众是谁)。但这很容易。将“内存作弊工具”从 Windows 移植到 Mac,您将花费更多时间重写 GUI,而不是实现低级的东西。

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

【讨论】:

    猜你喜欢
    • 2011-03-28
    • 1970-01-01
    • 1970-01-01
    • 2020-01-19
    • 1970-01-01
    • 2010-11-29
    • 2010-09-05
    • 2015-11-20
    • 2010-10-08
    相关资源
    最近更新 更多