【问题标题】:How do I access memory from one program in another如何从另一个程序中的一个程序访问内存
【发布时间】:2012-06-14 00:18:59
【问题描述】:

我有一个封闭源代码的第 3 方程序,我希望能够

  • 了解分配给程序的内存
  • 访问该内存(只读即可)

vmmap(1)、heap(1) 和leaks(1) 之类的实用程序似乎具有与我需要的功能相似的功能,但我无法在任何地方找到它们的源代码(OS X 版本)并且无法确定弄清楚它们是如何工作的。最好这一切都在用户空间中完成,可能以 root 身份运行,如果可以避免的话,我不想编写内核代码来绕过内存保护。

我尝试使用共享内存将我想要读取的地址作为第二个参数传递给 shmat(2),但这最终没有成功(并且可能不是它的预期用途和/或不好的做法)并且仍然让我没有一种确定我正在寻找的内存的方法(拥有内存的程序必须向我报告它的地址)。

有没有办法只禁用某个程序的内存保护,以便它在尝试读/写分配给不同进程的内存时不会出现段错误?有没有更好的方法不会让错误严重破坏我的整个系统?

这是如何实现的?

【问题讨论】:

  • 您是否尝试过跟踪此类实用程序的系统调用?
  • @icktoofay 好主意。以前从来没有这样做过。我刚刚使用 Shark.app 尝试过(不稳定的 gui 废话,只是谷歌找到我的第一个建议)但有一些问题 1)符号名称丢失 2)鲨鱼不断崩溃(我会尝试看看我是否可以使用 GDB 或其他东西执行此操作),以及 3)我找不到看起来可能相关的系统调用的文档(io_connect_method、io_connect_(un)map_memory、一些 mach_* 东西)。 4) 我会花很长时间去挖掘转储并弄清楚如何正确使用这些调用。某处必须有文档...

标签: c macos unix shared-memory


【解决方案1】:

【讨论】:

  • 那篇文章似乎归结为“ptrace 不起作用,使用 vm_read 和 vm_write”,它们都没有联机帮助页,并且转储中唯一看起来相似的系统调用是 vm_deallocate...: (
【解决方案2】:

基本上,this guy 是对的。

去下载 source code 伴随的 this book 并查看示例 8-16 的 vm_rw_master.c 以获得有效的实现。

有关文档,请参阅 http://web.mit.edu/darwin/src/modules/xnu/osfmk/man/,它有点过时了,而且可能是正确的,但它是最好的。

编辑:另外,请参阅http://lightbulbone.com/2011/05/dumping-process-memory-on-mac-os-x/(请注意,拥有您尝试读取的内存的任务不需要是尝试进行读取的进程的子进程,您只需要获得适当的授权即可。)

编辑:另外,请参阅http://os-tres.net/blog/2010/02/17/mac-os-x-and-task-for-pid-mach-call/ 以获得一个很好的授权示例。

【讨论】:

    猜你喜欢
    • 2017-01-02
    • 1970-01-01
    • 2016-08-11
    • 2020-04-25
    • 2017-09-01
    • 1970-01-01
    • 2013-03-17
    • 2013-07-20
    • 2011-09-02
    相关资源
    最近更新 更多