Dependencies 源码解析①:PE 文件内存映射全景图——Process Hacker phlib 到底做了什么
Dependencies 源码解析①PE 文件内存映射全景图——Process Hacker phlib 到底做了什么【免费下载链接】DependenciesA rewrite of the old legacy software depends.exe in C# for Windows devs to troubleshoot dll load dependencies issues.项目地址: https://gitcode.com/gh_mirrors/de/DependenciesDependencies是一个用 C# 重写的经典 Windows 开发工具旧版 depends.exe帮助开发者快速排查PE 文件.exe / .dll的DLL 依赖加载问题——比如缺少某个 DLL、位数不匹配这类让新手抓狂的报错。它的解析引擎并非从零手搓而是深度集成了 Process Hacker 项目中的phlib内存映射库。本文带你走一遍 PE 文件从磁盘到内存的完整链路看懂 phlib 到底做了什么。一、先建立全景图一次 PE 解析的调用链当你把一个 exe 拖进 Dependencies 时数据是这样流动的C# 业务层 (DependenciesLib/FindPeModule.cs) │ 调用 PE 类的 Load() ▼ C/CLI 桥接层 (ClrPhlib/src/managed/PE.cpp) │ 把托管字符串转成原生宽字符串 ▼ UnmanagedPE 封装 (ClrPhlib/src/unmanaged/UnmanagedPE.cpp) │ 持有 PH_MAPPED_IMAGE 结构体 ▼ Process Hacker phlib (third_party/phlib/mapimg.c) │ NtCreateSection NtMapViewOfSection ▼ Windows 内存映射视图 —— PE 内容以指针偏移方式被读取理解这条链的关键是phlib 把整个 PE 文件一次性映射进进程地址空间之后所有解析都只是在内存视图里按偏移取数据不再碰磁盘。这就是它又快又稳的根本原因。二、PE 文件如何进入内存内存映射技术1. 打开文件并创建内核 Section 对象入口函数在 mapimg.c 的PhLoadMappedImage它先调用PhMapViewOfEntireFile完成三件事以只读方式打开目标文件允许其他进程同时读取调用NtCreateSection基于文件创建 Section 对象调用NtMapViewOfSection把整个文件映射到当前进程地址空间得到一个viewBase指针。相关实现可精读 mapimg.c。这里有两个值得注意的细节权限按需申请只读解析只申请FILE_READ_ATTRIBUTES | FILE_READ_DATA不会锁死文件卸载同样直接PhUnloadMappedImage只是一句NtUnmapViewOfSection立即释放内存并解除对文件的占用见 mapimg.c。2. PhInitializeMappedImage逐层体检 PE 结构拿到内存视图后PhInitializeMappedImage 开始校验文件是否真的是一个合法 PE校验步骤做什么失败返回值DOS 头魔数检查文件头是否为MZSTATUS_INVALID_IMAGE_NOT_MZe_lfanew 偏移必须非 0 且小于文件大小STATUS_INVALID_IMAGE_FORMATPE 签名检查PE\0\0签名STATUS_INVALID_IMAGE_FORMATOptional Header 魔数必须是 32 位或 64 位魔数STATUS_INVALID_IMAGE_FORMAT内存探测用 SEH 异常探测指针访问越界返回异常码最后它把NtHeaders指针、节区表、可选头信息全部填进PH_MAPPED_IMAGE结构体——这个结构体就是后续所有解析的锚点。为什么用 SEH 探测而不是先判断长度因为 PE 文件可能被恶意构造或截断光看声明的长度不可信真正访问一下内存才能确认数据安全。三、映射之后phlib 提供的三大解析能力PH_MAPPED_IMAGE就绪后mapimg.h 中声明的一系列 API 就能无磁盘 I/O地读取 PE 的各个目录PhGetMappedImageImports/PhGetMappedImageDelayImports解析导入表含延迟加载导入返回按 DLL 分组的PH_MAPPED_IMAGE_IMPORTS结构——这正是 Dependencies 界面里导入的 DLL 列表的数据来源PhGetMappedImageExports解析导出表得到PH_MAPPED_IMAGE_EXPORTS支持按名称或序号查函数地址PhGetMappedImageResources枚举资源段用于提取嵌入的清单manifestPhCheckSumMappedImage计算 PE 校验和与文件头声明值比对判断二进制是否被修改过。四、ClrPhlib 桥接层C# 如何拥抱 phlibphlib 是纯 C 代码而 Dependencies 上层是 C#。两者之间的翻译官是ClrPhlib项目C/CLI核心结构分两层1. UnmanagedPE —— 原生封装层UnmanagedPh.h 中定义的UnmanagedPE类直接持有PH_MAPPED_IMAGE、导入/延迟导入/导出等原生结构体。它的 LoadPE 方法 只做了两件事确保旧映像已卸载然后调用PhLoadMappedImage加载新文件。析构时自动卸载杜绝内存泄漏。2. PE 类 —— C# 可见的托管门面PE.cpp 把上述原生能力翻译成 C# 友好的接口公开类型在 ClrPhlib.h 中声明Load()/Unload()映射与卸载并填充PeProperties机器类型、映像基址、入口点、子系统、校验和等见 InitPropertiesGetImports()/GetExports()惰性解析 本地缓存首次调用才解析之后直接返回缓存列表GetManifest()从资源段提取 UTF-8 嵌入清单供 SxS侧载分析使用IsWow64Dll()/GetProcessor()判断 32 位/64 位、x86/arm/arm64 架构——这正是32 位进程装 64 位 DLL 失败这类问题的判断依据。一个容易被忽视的细节NativeFileNativeFile.h 是System.IO.File的部分重写专门绕开 64 位系统中的WoW64 文件系统重定向32 位程序访问 System32 会被悄悄转到 SysWOW64。分析 DLL 依赖时这一点致命——它保证了 32 位 Dependencies 也能如实看到 64 位目录下的文件还顺带实现了基于 bcrypt 的 SHA256 文件哈希。五、源码导读建议按这个顺序精读顺序文件看点1third_party/phlib/mapimg.c内存映射与 PE 校验的完整实现约 1800 行2third_party/phlib/include/mapimg.hPH_MAPPED_IMAGE系列结构与全部 API 声明3ClrPhlib/src/unmanaged/UnmanagedPE.cpp最薄的原生封装理解桥接层的最佳起点4ClrPhlib/src/managed/PE.cpp托管门面缓存策略、清单提取、架构判断5DependenciesLib/FindPeModule.csC# 业务层如何组合使用 PE 类做 DLL 搜索6test/manifest-regress/清单回归测试样例含.dll.manifest实例 后续文章会基于这条链路继续深入ApiSet Schema 解析Windows 8 之后 DLL 名称如何被虚拟化与DLL 搜索顺序模拟FindPeModule 是如何复刻加载器行为的。六、小结用三句话记住本文phlib 的核心思想是先映射、后解析——一次NtCreateSection NtMapViewOfSection把 PE 文件搬进内存视图之后全是指针运算健壮性靠 SEH 探测——不信任文件自报的头部长度访问即校验畸形 PE 不会让工具崩溃分层清晰——C 层phlib做重活C/CLI 层ClrPhlib做翻译C# 层DependenciesLib做体验各层通过PH_MAPPED_IMAGE这一个结构体解耦。掌握这条 PE 内存映射全景链路你就拿到了读懂 Dependencies 整个解析引擎的地图。️【免费下载链接】DependenciesA rewrite of the old legacy software depends.exe in C# for Windows devs to troubleshoot dll load dependencies issues.项目地址: https://gitcode.com/gh_mirrors/de/Dependencies创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

FPGA实战:将UART封装为Vivado自定义IP核全流程

FPGA实战:将UART封装为Vivado自定义IP核全流程

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/19 1:58:36 阅读更多 →
核电级安全文化如何落地:从抽象理念到可执行行为标准

核电级安全文化如何落地:从抽象理念到可执行行为标准

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/19 1:58:36 阅读更多 →
企业级Agent上K8s:架构设计、资源调度与踩坑实录

企业级Agent上K8s:架构设计、资源调度与踩坑实录

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/19 1:58:36 阅读更多 →

最新新闻

华为ICT云赛道云存储试题解析:从存储基础到OceanStor全闪存

华为ICT云赛道云存储试题解析:从存储基础到OceanStor全闪存

简介:面向华为ICT大赛云赛道与HCIA-Storage认证考生的云存储试题资料,紧扣云存储与存储技术考点,覆盖数据类型(结构化、半结构化、非结构化)、块/文件/对象存储、云存储特点、存储网络协议(FC拓扑、CIFS交互…

2026/9/19 3:28:30 阅读更多 →
异构算力统一管理:从GPU到NPU的调度与监控实战

异构算力统一管理:从GPU到NPU的调度与监控实战

智算中心的机器越堆越多,但真正让平台团队头疼的往往不是买卡,而是怎么把手里这些不同品牌、不同架构的GPU和NPU管起来用起来。如果你也在做类似的事,或者正准备搭一套异构算力管理平台,这篇内容应该能帮你少走不少弯路。我从一个…

2026/9/19 3:28:30 阅读更多 →
Hasura Event Triggers 实战:用 AWS Lambda(Python)在数据变更时自动写入修订历史

Hasura Event Triggers 实战:用 AWS Lambda(Python)在数据变更时自动写入修订历史

Hasura Event Triggers 实战:用 AWS Lambda(Python)在数据变更时自动写入修订历史 【免费下载链接】graphql-engine Blazing fast, instant realtime GraphQL APIs on all your data with fine grained access control, also trigger webhook…

2026/9/19 3:28:30 阅读更多 →
考研复试准备18天复盘:从信息搜集到面试模拟的高效冲刺策略

考研复试准备18天复盘:从信息搜集到面试模拟的高效冲刺策略

今天是DHU复试准备的第18天,距离最终走进考场还有一周左右的时间。按惯例,这个节点该停一停,做一次阶段性的梳理。与其说是"复盘",不如说是把18天来踩过的坑、确认过的信息、摸索出来的有效方法摊开来看一看&#xff0c…

2026/9/19 3:28:30 阅读更多 →
oh-my-zsh wakeonlan 插件使用指南:用 `wake` 命令远程唤醒局域网设备

oh-my-zsh wakeonlan 插件使用指南:用 `wake` 命令远程唤醒局域网设备

CLI开发工具插件系统 【免费下载链接】ohmyzsh 🙃 A delightful community-driven (with 2,500 contributors) framework for managing your zsh configuration. Includes 300 optional plugins (rails, git, macOS, hub, docker, homebrew, node, php, python, etc…

2026/9/19 3:28:30 阅读更多 →
YOLOv8本地部署全流程:Anaconda、PyCharm、CUDA与PyTorch环境配置避坑指南

YOLOv8本地部署全流程:Anaconda、PyCharm、CUDA与PyTorch环境配置避坑指南

但凡亲手做过一次YOLOv8本地部署的人,应该都会同意一件事:YOLOv8本身一点都不难,难的是环境。模型说白了就是一个Python包,一条pip install ultralytics就能装完。但在这条命令之前的Python版本管理、PyTorch安装、CUDA和显卡驱动…

2026/9/19 3:27:30 阅读更多 →

日新闻

BP神经网络时序预测:滑窗长度与多窗口平均策略

BP神经网络时序预测:滑窗长度与多窗口平均策略

简介:面向机器学习、深度学习与数据建模学习者的一份完整研究文献,聚焦BP神经网络在农业产量预测中的应用。文档以1980—2018年全国棉花产量为样本,系统讲解数据归一化处理、激活函数原理、多层神经网络结构搭建及训练流程,展示敏…

2026/9/19 0:00:30 阅读更多 →
Transformer训练实时监控实战:基于MindSpore的损失曲线可视化方案

Transformer训练实时监控实战:基于MindSpore的损失曲线可视化方案

上个月调一个Deformable DETR模型,在单卡上要跑将近两天。第二天早上我下意识打开终端翻日志,发现loss从凌晨两点就开始往上爬,一路从0.8涨到1.35,整整六个小时没人发现。那六个小时的训练不仅白跑,还霸占着卡——等于…

2026/9/19 0:00:30 阅读更多 →
OpenCloud 中的 Go 类型安全转换库 spf13/cast:从零值回退到泛型 API 的完整实战指南

OpenCloud 中的 Go 类型安全转换库 spf13/cast:从零值回退到泛型 API 的完整实战指南

OpenCloud 中的 Go 类型安全转换库 spf13/cast:从零值回退到泛型 API 的完整实战指南 【免费下载链接】opencloud 🌤️ OpenCloud is the open source platform for file management, sharing and collaboration. Simple and sovereign. 项目地址: htt…

2026/9/19 0:00:30 阅读更多 →

周新闻

AI SDK Harness 依赖更新指南:掌握 harness 包 SDK 依赖的升级、桥接同步与一致性校验

AI SDK Harness 依赖更新指南:掌握 harness 包 SDK 依赖的升级、桥接同步与一致性校验

AI SDK Harness 依赖更新指南:掌握 harness 包 SDK 依赖的升级、桥接同步与一致性校验 【免费下载链接】ai The AI Toolkit for TypeScript. From the creators of Next.js, the AI SDK is a free open-source library for building AI-powered applications and ag…

2026/9/16 19:03:19 阅读更多 →
Refine v5 Ant Design NumberField 组件实战:基于 Intl 的本地化数字格式化

Refine v5 Ant Design NumberField 组件实战:基于 Intl 的本地化数字格式化

Refine v5 Ant Design NumberField 组件实战:基于 Intl 的本地化数字格式化 【免费下载链接】refine A React Framework for building internal tools, admin panels, dashboards & B2B apps with unmatched flexibility. 项目地址: https://gitcode.com/GitH…

2026/9/17 7:57:36 阅读更多 →
Flutter应用改名全指南:从Android到iOS的配置与工具实践

Flutter应用改名全指南:从Android到iOS的配置与工具实践

刚接一个外包项目时,甲方要求把工程里临时用的应用名改成正式产品名。我本来觉得“改名”这种小事,打开配置文件改一行不就完了?结果真动手才发现,Flutter项目里“应用名称”根本不是一处配置,而是一整套散落在 Androi…

2026/9/17 10:19:14 阅读更多 →

月新闻

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能分类:[AI/大模型]细分主题:AI 增强型 CI/CD 流水线自动化与 GitOps 实践:Agent 工作流、工具调用与任务拆解:从原型到生产的验收清单很多团队在尝试用大…

2026/9/16 22:31:27 阅读更多 →
容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场分类:[工程技术]细分主题:Kubernetes 生产环境运维与排障实战:可复制的项目复盘模板与决策记录大部分团队的事故复盘报告,最后都变成了躺在 Confluence 或钉…

2026/9/15 21:39:18 阅读更多 →
容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步分类:[工程技术]细分主题:Docker 容器化技术与镜像安全管理:核心链路的逐步实现与关键代码取舍面对一个积累了五六年历史包袱的单体架构应用(包含 Web 接口、后台…

2026/9/16 22:32:59 阅读更多 →