【问题标题】:How to get a base address of a module in C++ on Os X如何在 Os X 上的 C++ 中获取模块的基地址
【发布时间】:2013-06-07 00:53:44
【问题描述】:

我一直在尝试在 Os X 上用 C++ 读取/写入另一个进程的内存。

我遇到的问题是我得到了一个指针(例如 server.dylib+0x123AB),但我似乎找不到在 c++ 中动态获取 server.dylib 的内存地址/基地址的方法。是否有任何方法可以推荐尝试找到它。这可能是我的技能水平,但我发现尝试在 OsX 上修改内存是一项艰巨的任务(周围的文档很少)。

任何建议将不胜感激。

【问题讨论】:

    标签: c++ macos memory mach


    【解决方案1】:

    梅林的回答有些不准确。 ASLR 并不是要阻止您在运行时获取地址 - 它是为了阻止您依赖 FIXED 地址(即代码注入时)。如果你已经可以执行代码,你肯定可以获取地址(哎呀,GDB可以,为什么不能呢?)

    DYLD 公开了一个非常丰富的 API(和 dyld_images.h),它使您能够轻松地从进程内部或外部获取加载到进程地址空间中的所有图像的列表。您还可以获得 "slide" ,这是使用的 ASLR 偏移量。然而,这是假设您已经在该机器上运行代码 - 即注入代码时它不会工作。

    【讨论】:

    • 非常感谢,抱歉,我现在才注意到这一点 - 该示例几乎显示了我正在寻找的内容。
    • @Technologeeks,我从来没有说过 ASLR 是为了防止在运行时获取地址 - 我说这是为了防止恶意软件利用,包括依赖固定地址和代码注入!另请注意,我链接到一篇关于 gdb 如何与 ASLR 一起工作的文章,因此您对“GDB 可以,为什么你不能”的评论有些无关紧要!
    【解决方案2】:

    OSX 安全性的一部分是一种称为 ASLR(地址空间布局随机化)的技术。这可确保将图像加载到进程地址空间的随机区域中,以防止恶意软件利用。它存在于内核和用户空间进程中。

    您可以阅读有关它的更多信息 ASLR here

    如果你搜索 google,你将能够找到更多与 OSX 相关的信息,例如this article

    如果如您所说,您只是在试验,使用 gdb 运行目标进程,您将能够在加载 dylib 后找出内存地址,然后您可以在测试中使用它程序。

    【讨论】:

    • 感谢您的回复。抱歉,如果我在这里遗漏了一些东西,但在运行时无法计算出 server.dylib 的地址 - 我能够对进程进行采样(通过活动监视器),它给了我正确的地址,但它确实在每个之间发生了变化发射。
    • 我并不是说这不可能,只是说这并不容易。这个问题的答案应该对你有所帮助:stackoverflow.com/questions/4309117/…
    • 感谢您的链接。在我回到大学之前,我还有一个夏天要杀,所以我会在某个时候努力完成它——这将是一次学习经历。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-30
    • 2015-03-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多