以编程方式确定在另一个进程中加载​​哪些模块? (操作系统)

2023-11-21

我觉得我想做的事情非常简单,我只是不确定到底该怎么做。

具体来说,我只想获取在另一个进程中加载​​的模块(共享/动态库)的列表。以及获取该模块在给定进程中所在位置的起始地址。

使用 GDB 获取这些信息非常简单。您只需连接到该进程,然后输入“信息共享”即可。这正是我想要获取的信息类型。例如:

基本名称数量
类型 地址 原因 | |来源 | |
| | | | | |
1 阿迪姆
- 0x1000 执行 Y Y /Applications/Adium.app/Contents/MacOS/Adium (偏移量 0x0)2 dyld
- 0x8fe00000 dyld Y Y /usr/lib/dyld 位于 0x8fe00000(偏移量 0x0) 带有前缀“__dyld_”3 WebCore F 0x95b6a000 dyld Y Y /系统/库/框架/WebKit.framework/版本/A/Frameworks/WebCore.framework/版本/A/WebCore 位于 0x95b6a000(偏移量 0x95b6a000)

有谁知道如何以编程方式执行此操作?显然,模块加载的位置是动态的,因此我需要确定它的位置。


首先使用task_for_pid()获取任务端口。

然后使用task_info找到“dyld所有图像信息地址”:

struct task_dyld_info dyld_info;
mach_msg_type_number_t count = TASK_DYLD_INFO_COUNT;
if (task_info(task, TASK_DYLD_INFO, (task_info_t)&dyld_info, &count) == KERN_SUCCESS)
{
    // retrieve dyld_info.all_image_info_addr;
}

该地址将指向内存中的一个struct dyld_all_image_infos:

struct dyld_all_image_infos {
    uint32_t version;
    uint32_t infoArrayCount;
    const struct dyld_image_info* infoArray;
    // ...
}

infoArrayCount 和 infoArray 条目在这里很重要。您必须检索这些值(使用 mach_vm_read)并迭代 infoArray。每个条目都是一个 struct dyld_image_info:

struct dyld_image_info {
    const struct mach_header* imageLoadAddress;
    const char* imageFilePath;
    uintptr_t imageFileModDate;
};

在此结构中,您感兴趣的是检索 imageLoadAddress(内存中库的地址)和 imageFilePath(内存中以 NULL 结尾的文件路径的地址)的值。

重要提示:上面结构中标记为指针或 uintptr_t 的字段具有不同的字节大小,具体取决于正在运行的进程是 32 位还是 64 位。您可以通过查看 dyld_info.all_image_info_format 是否为 TASK_DYLD_ALL_IMAGE_INFO_32 或 TASK_DYLD_ALL_IMAGE_INFO_64 来确定指针大小(应该可以,但我自己还没有测试过)。

最后,这仍然不包括动态链接器本身的条目。为了检索它,我发现的一种方法是迭代 vm 区域(即 mach_vm_region),并找到第一个看起来像 mach dylinker 的区域(检查 MH_DYLINKER 作为文件类型;请参阅 mach-o 文件格式了解更多信息)。最后我记得检查过,gdb 和/或 lldb 也有一个执行此操作的函数。解析 mach 头也是判断进程是 32 位还是 64 位的一种可能方法。

检索所有 dyld 图像信息条目后,您可能还想按地址对它们进行排序。

我建议不要查看 newosxbook 的 vmmap 实现代码。它已经过时了(因为它仍然使用 DYLD_ALL_IMAGE_INFOS_OFFSET_OFFSET),并且它做了一些不必要的暴力破解。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

以编程方式确定在另一个进程中加载​​哪些模块? (操作系统) 的相关文章

  • 对 UIImage 进行方形裁剪,导致图像拉伸

    当尝试执行 UIImage 的中心裁剪时 我得到以下结果 左侧是原始图像640 1136 右边是适合正方形的裁剪图像UIImageView at 320 320 turns to 我对比率元素进行了相当多的修改 以便它可以正确检测要修剪的量
  • iOS:从非图像数据生成图像(Godus,如风景)

    所以看到图像后Godus http www kickstarter com projects 22cans project godus我想知道如何生成简单的 非交互式的 2D 图像 with 不同高度或层数的颜色不同就像下面的图片一样 我只
  • XCode:代码覆盖率数据生成失败

    当我尝试运行单元测试时 我在 Objective C 项目中遇到了这个可怕的问题 我已经尝试了以下所有方法 根据各种 SOF 帖子 清除派生数据 删除 Library 中的所有模拟器设置 重新启动 XCode 重新启动MBP 多次重置模拟器
  • 如何使用 ZBar 读取器的 scanCrop 属性?

    我正在使用 iPhone 的 ZBar SDK 来扫描条形码 我希望阅读器仅扫描特定的矩形而不是整个视图 为此需要将阅读器的 scanCrop 属性设置为所需的矩形 我很难理解必须设置的矩形参数 有人可以告诉我如果在纵向视图上它的坐标是 我
  • 如何将 Spotlight for Help 插入本地化的 macOS 应用程序?

    我正在 macOS 上使用 Swing GUI 框架实现 Java 应用程序 当使用system外观和感觉以及screen菜单栏 Swing 自动插入一个搜索栏 called 聚光灯寻求帮助 https developer apple co
  • 如何添加授权以从新钥匙串对应用程序进行代码签名,而无需任何人工交互

    我正在尝试使用特定证书自动化构建 iPhone 应用程序的过程 因此 想象一下 如果不同的用户将他们的证书上传到系统中 并且可以立即用于代码签名 我想在没有任何交互的情况下做到这一点 我也不想用不同的用户证书弄乱系统或登录钥匙串 为此我有
  • 在 Mac 上使用“sudo gem install nokogiri”安装 nokogiri 时出错

    我试图安装 nokogiri 因为它是启动 Rails 所必需的 rails s usr local rvm gems ruby 1 9 3 p194 global gems bundler 1 1 5 lib bundler spec s
  • Xcode:如何使用具有跨项目引用的单独项目在应用程序中嵌入框架?

    我使用的是 Xcode 4 3 我有一个用于嵌入式 Mac OS X 框架的现有 Xcode 项目 最初在 Xcode 3 中创建 该项目有几个目标 但该项目中的主要目标是我的框架 该框架设计为嵌入 Mac Apps 中 并设置了适当的安装
  • 推送/呈现模态视图控制器

    我的视图控制器中有一个表 我们称之为 TVC1 我使用了 TVC1 中的行 以便用户除了 TVC1 上的数据之外还可以输入更多数据 因此 当有人点击 TVC1 中的特定行时 它将显示另一个视图控制器 我们称之为 TVC2 然而 当显示TVC
  • Apple 帮助创作

    我正在跟进本指南 http developer apple com library mac documentation Carbon Conceptual ProvidingUserAssitAppleHelp authoring help
  • 以编程方式更改 UISlider 的范围

    如何以编程方式设置 UISlider 的最小最大范围 例如 虚拟代码 UISlider slider UISlider alloc init slider min 3 slider max 3 EDIT 所以我有以下内容 sl minimu
  • 如果目录不存在,有没有办法让 mv 创建要移动到的目录?

    因此 如果我在主目录中并且想将 foo c 移动到 bar baz foo c 但这些目录不存在 是否有某种方法可以自动创建这些目录 以便你只需要输入 mv foo c bar baz 一切都会顺利吗 似乎您可以将 mv 别名为一个简单的
  • 监控剪贴板活动可可?

    是否可以在可可中 观看 用户剪贴板 例如 如果我的应用程序是系统托盘样式应用程序 例如 dropbox 客户端 我可以订阅用户在另一个应用程序中点击复制 粘贴时引发的事件吗 你可以随时查看Apple的示例代码 剪贴板查看器 http dev
  • 当 Firebase 函数以 Swift 结束时

    我在我的应用程序中使用 Firebase 它查询大量用户并获取所需的特定数据 但是当它开始查询时 其余功能也继续运行 而不仅仅是查询 所以我无法理解当它结束时 例如在这段代码中 ref observeEventType ChildAdded
  • iOS 中的词干 - 不适用于单个单词

    我在用NSLinguisticTagger用于词干提取 我能够获得句子中单词的词干 但无法获得单个单词的词干 以下是我正在使用的代码 NSString stmnt i waited NSLinguisticTaggerOptions opt
  • 如何确定 UINavigationController 中工具栏的高度?

    我有一个带有由 UINavigationController 呈现的工具栏的视图 当我处理 UIKeyboardWillShowNotification 时 我将整个屏幕向上滚动键盘的高度 问题是当显示键盘时 底部工具栏不显示 所以我只需将
  • gdb:如何禁用特定的漂亮打印机

    如何在 gdb 中禁用特定的漂亮打印机 例如 禁用 C 11 std unique ptr 打印机 gdb 帮助或文档没有提供真实的或工作的示例 这对我有用 gdb info pretty printer global pretty pri
  • 后台模式下的 AVSpeechSynthesizer

    我无法获取 iOS 7AVSpeechSynthesizer当我的 iOS 应用程序处于后台模式时工作 我添加了 应用程序播放音频 应用程序支持的后台模式的关键 但我仍然无法让它工作 我还研究了创建一个AVMutableCompositio
  • 如何在 iOS 5 中使用 Embed Segue?

    iOS 6 引入了 Embed Segue 允许在 Storyboard 中使用自定义容器控制器 有没有办法在 iOS 5 上复制这个 这里的挑战是子视图控制器的视图通常要添加为父视图控制器的某些容器视图的子视图 因为你不能随机进行序列UI
  • 小部件配置在 macOS 上不起作用

    我为我的 iOS 应用程序制作了一个小部件 效果很好 现在我正在将其移植到我的 macOS 应用程序中 但不知何故 小部件配置不起作用 这些项目已显示 但我无法以某种方式选择它们 查看屏幕截图 但请看一下我制作的视频 https youtu

随机推荐

  • pymc3 中的自定义可能性

    如何在 PyMC3 中定义自定义可能性 在 PyMC2 中 我可以使用 pymc potential 我尝试使用pymc Potential然而 在 PyMC3 中 布尔运算似乎无法应用于参数 我收到类似的错误this当我这样做时 例如 以
  • IPython Notebook Javascript:从 JavaScript 变量中检索内容

    有没有办法function 由 IPython Notebook 单元调用 来检索 JavaScript 变量的内容 例如IPython notebook notebook path其中包含当前笔记本的路径 当直接在单元格中编写时 例如 基
  • 如何将 Svelte 应用程序放入 Docker 容器中?

    标题基本概括了所有内容 我对网络开发非常陌生 我使用创建了一个 Svelte 应用程序npx degit sveltejs template 现在我使用本地运行它npm run dev or npm start 据我了解 这是一个 Node
  • 在命令行工具中获取资源的路径

    我试图在 Xcode 8 beta 2 的命令行工具中获取资源的路径 这是我所得到的 资源 file xyz 已被拖入项目中 并且目标成员资格与主项目匹配 在 构建阶段 gt 复制文件 下 目标设置为 资源 并且子路径为空 未选中 仅在安装
  • 在 SQL Server 上插入更新存储过程

    我编写了一个存储过程 如果记录存在 它将执行更新 否则它将执行插入 它看起来像这样 update myTable set Col1 col1 Col2 col2 where ID ID if rowcount 0 insert into m
  • 通用对象的通用列表

    假设我有一个代表数据字段的对象 该对象需要以下属性 名称 类型 值 长度 这是对象 class Field
  • SwingX JXTable:使用 ColorHighlighter 根据“行对象”为行着色

    我正在使用 JXTable 并且我知道如何基于 JTable 的 DefaultRenderers 来执行此操作 但我想知道如何以基于 HighlighterPipeline 的 JXTable 友好的方式执行此操作 我有一个表中显示的对象
  • Haskell 错误:输入“=”时解析错误

    Specs GHC 6 12 1 Mac OS X 10 6 4 x64 MacBook Pro Problem 我使用时遇到问题let句法 以下代码拒绝编译 module Main where main let x 1 y 2 z 3 i
  • 将 varchar 转换为数据类型 numeric 时出现算术溢出错误。 ‘10’ <= 9.00

    下面是我正在使用的表结构和数据的子集 CREATE TABLE Test Val varchar 5 Type varchar 5 INSERT Test VALUES Yes Text INSERT Test VALUES 10 Int
  • Quicklook/QLPreviewController 委托方法在 iOS 10 Xcode 8 中不调用

    目前我正在 iOS10 中测试我当前的版本 我在用Xcode 8beta 6 用于测试 这里Quicklook QLPreviewController 委托方法未调用 该代码集适用于 XCode 7 和 iOS 9 3 版本 我在苹果开发者
  • Jetpack Compose 具有动态操作的 TopAppBar

    Composable fun TopAppBar title Composable gt Unit modifier Modifier Modifier navigationIcon Composable gt Unit null acti
  • 如何在python2和python3中运行程序

    我的机器上当前安装了 python 2 6 6 和 python 3 1 3 Windows Vista 64 位 我的路径变量包括两个版本的目录 如何指定要在哪个 python 中运行程序 例如 如果我想在 python 3 中运行程序
  • 静态类变量存储在内存中的什么位置?

    这是一个后续问题静态数组如何存储在Java内存中 所以C C 中的全局变量存储在内存的静态数据段中 但是 Java C 中的静态类变量又如何呢 它不能是静态数据段 因为您不知道在整个程序持续时间内将引用什么 多少个类 由于反射 这绝对不是堆
  • iOS 9 上的 GIDSignIn 白屏

    我实现了 Google 登录 并且在 iOS 8 上一切正常 但是当我在 iOS 9 上调用此行时 GIDSignIn sharedInstance signIn 我可以第一次登录 但如果我取消 下次尝试登录时 它会显示一个白色屏幕 其中是
  • r - data.table 和 testthat 包

    我正在构建一个与 data table 一起使用的包 并且应该使用包 testthat 对其进行测试 虽然从命令行调用时代码工作正常 但从测试用例调用时遇到了问题 运行测试时似乎使用了基础包中的 函数 即 data frames 的函数 我
  • 将 HTTP POST 请求重定向到 HTTPS POST 请求

    我最近刚刚将我的服务器设置为使用 SSL 证书通过 HTTPS 运行 该网站是一个图像托管服务 ShareX 的开发人员已将我的网站包含在他们的应用程序中 我的问题是 所有 HTTP 请求都会自动重定向到 HTTPS 该网站运行良好 但 S
  • HtmlAgilityPack.HtmlDocument Cookie

    这与脚本内 可能在脚本标签内 设置的cookie有关 System Windows Forms HtmlDocument执行这些脚本和cookies集 比如document cookie etc 可以通过其检索Cookies财产 我假设Ht
  • 为什么随机访问迭代器的算术运算符接受/返回 int 而不是 size_t?

    由于大多数操作都在std vector要求 返回size t 这就是我用于索引的类型 但现在我已经启用了所有编译器警告来修复一些我知道的签名 未签名转换问题 这条消息让我感到惊讶 警告 C4365 参数 从 size t 转换为 w64 i
  • Java的notify()在wait()之前运行?

    public class ThreadA public static void main String args ThreadB b new ThreadB b start synchronized b try System out pri
  • 以编程方式确定在另一个进程中加载​​哪些模块? (操作系统)

    我觉得我想做的事情非常简单 我只是不确定到底该怎么做 具体来说 我只想获取在另一个进程中加载 的模块 共享 动态库 的列表 以及获取该模块在给定进程中所在位置的起始地址 使用 GDB 获取这些信息非常简单 您只需连接到该进程 然后输入 信息