资讯详情

Dependencies 避坑实战:Windows 程序依赖链与导入导出问题快速定位

📅 2026/11/4 19:42:35 | 华诺云谱 👁 阅读
Dependencies 避坑实战:Windows 程序依赖链与导入导出问题快速定位
Dependencies 避坑实战Windows 程序依赖链与导入导出问题快速定位【免费下载链接】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程序在我机器上能跑客户机上弹找不到 api-ms-win-core-fileutil.dll——这类问题最折磨人的地方在于把报错里点名的 DLL 拷过去换个 DLL 又报缺甚至版本明明对得上却报缺某个符号。老手段是用 SDK 里附带的 depends.exe 看依赖树但那套工具 2006 年前后就停止维护了不认 Windows 8.1 之后引入的 ApiSet 重定向分析现代程序时依赖树里会冒出一大片假缺失。Dependencies 就是冲着这个缺口来的用 C# 重写的现代依赖分析器命令行版本Dependencies.exe可以把任意 PE 的依赖树、模块清单、导入/导出表全部转储出来还能以 JSON 形式吐出结构化数据。它最有用的一点是每个节点都标注了模块搜索策略——即这个 DLL 按 NT Loader 的规则到底是从哪个环节找到的缺失的会直接标成NOT_FOUND定位方向一目了然。获取二进制与最小可用命令项目发布两个二进制Dependencies.exeCLI和DependenciesGui.exeGUI两者共享同一套 PE 解析引擎。从 Releases 下载 zip 解压即用也可以 clone 源码后用 Dependencies.sln 自行构建注意配置要手动选Release和x64不是默认值。Dependencies.exe -chain MyApp.exe Dependencies.exe -help不加参数、或带-help都会打印全部选项说明。先记住三个坑二进制未签名SmartScreen 警告属正常现象受 /clr 编译限制运行前需要安装 Visual C Redistributable分析结果强依赖本机环境32 位 PE 走 SysWOW64 与 x86 KnownDlls64 位走 System32跨架构分析结果不可直接对比。手工排查依赖树、模块清单与系统重定向表-chain带出处标注的递归依赖树Dependencies.exe -chain MyApp.exe每个节点后面跟着一个来源标签SxS表示命中 SxS 私有清单ApiSetSchema走了 ApiSet 重定向WellKnownDlls命中注册表 KnownDlls 白名单ApplicationDirectory在 exe 同目录System32Folder/WindowsFolder是系统目录Environment来自 PATH。这些标签就是 NT Loader 搜索顺序的逐条落实完整枚举定义在 DependenciesLib/FindPeModule.cs。树里出现NOT_FOUND的节点就是加载会断掉的环节。-depth 控深-modules 出扁平清单依赖层次很深比如某个运行时 DLL 拖来半套全家桶时可以用-depth限制递归层数默认是无限Dependencies.exe -chain -depth 2 MyApp.exe只要最终都解析成了哪些文件而不关心理由时-modules更省事——每行一个模块附来源策略和落盘路径方便和发行目录对账Dependencies.exe -modules MyApp.exe清单与重定向表把隐形的依赖翻出来-sxsentries列出文件的 SxS 依赖项-manifest转储内嵌的 SxS manifestXML 原文。仓库自带回归脚本 test/manifest-regress/Test-ManifestRegress.ps1 就是靠-manifest验证三个样例二进制的解析正确性。另一类隐形依赖是 ApiSet程序导入的api-ms-win-*.dll往往不是实体文件而是加载器按系统级映射表重定向到真实宿主 DLLkernel32、ntdll 等。想看这张表Dependencies.exe -apisets Dependencies.exe -apisetsdll test/apisetschema.v6.dll Dependencies.exe -knowndll前一条转储当前系统的 ApiSet 映射第二条从指定apisetschema文件离线转储test/目录下备有 v2/v4/v6 三个版本的素材可对比第三条列出 x86 与 x64 两套 KnownDlls 白名单——凡是命中白名单的模块加载时一律强制指向系统目录这解释了为什么程序目录里放了同名 DLL 却不生效。深度剖析函数级的导入表、导出表与程序集引用模块级排查解决找不到 DLL函数级排查解决DLL 加载了但入口点解析失败。Dependencies.exe -imports MyApp.exe输出按模块分组列出全部导入项按序数导入的显示为Ordinal_xxx延迟加载delay import的模块会被单独标注——这类 DLL 运行时才加载是启动正常、用到某功能才崩这类问题的常见源头缺失的导入也会直接标出。Dependencies.exe -exports libfoo.dll逐条给出导出函数的名称、序数、RVA转发导出Forwarded会直接展示转发目标适合做符号级 diff。分析 .NET 程序还有两个专属视角Dependencies.exe -assemblyrefs MyApp.exe Dependencies.exe -modulerefs MyApp.exe前者列出 CLR 程序集引用并尝试本地解析出实际版本后者列出托管模块引用。绑定到了错的程序集版本这种问题先看这两个输出。给流水线加依赖断言除-modules外所有命令都能叠加-json输出缩进 JSON序列化实现见 Dependencies/Program.cs。依赖树对应的结构是ModuleName模块名、Filepath落盘路径、SearchStrategy来源策略、Dependencies递归子节点。三个可以直接抄的流水线用法1. 依赖基线 diff每次构建导出快照和上一版比对依赖集悄悄变了第一时间能看到。Dependencies.exe -json -chain MyApp.exe deps.json git diff deps.base.json deps.json2. 缺失断言递归找SearchStrategy为NOT_FOUND的节点存在即让构建失败。$d Dependencies.exe -json -chain MyApp.exe | ConvertFrom-Json $d.Dependencies | Where-Object { $_.SearchStrategy -eq NOT_FOUND }3. 产物归档把 JSON 作为构建产物留存事后排查有据可查。仓库自己的部署脚本 Deploy-Dependencies.ps1 就是一个现成的消费示例-json -imports解析ClrPhlib.dll的导入按vcruntime/msvc/ucrtbase/concrt前缀挑出需要随包分发的 DLL 拷进产物目录——工具分析自己的依赖再打包整条链路全是 JSON 驱动。参数速查参数需要JSON说明-chain是✅递归依赖树节点带搜索策略-modules是❌已解析模块扁平清单-imports是✅导入表函数级含延迟加载标注-exports是✅导出表名称/序数/RVA/转发-assemblyrefs是✅.NET 程序集引用及本地版本-modulerefs是✅托管模块引用-manifest是✅内嵌 SxS 清单XML-sxsentries是✅SxS 依赖项-apisetsdll是✅从 apisetschema 文件转储 ApiSet 表-knowndll否✅系统 KnownDlls 白名单x86/x64-apisets否✅系统 ApiSet 重定向表-json——全局JSON 输出-cache——全局二进制缓存防 DLL 文件锁定-depth N——全局限制递归深度默认无限-h/-help——打印帮助常见问题SmartScreen 或杀毒软件拦截二进制未签名警告属预期行为。-modules为什么加-json没输出源码中直接拒绝了该组合提示 Json output is not currently supported脚本里请改用-chain。为什么依赖树里没有我LoadLibrary加载的 DLL静态分析只能覆盖直接导入、转发和延迟导入动态加载LoadLibrary不在分析范围内也大概率永远不会被支持。GUI 里全递归分析把内存吃爆了默认行为只解析直接依赖开启递归Recursive后内存开销可能非常夸张大型 PE 慎用CLI 端想限制范围用-depth。分析 32 位程序结果不可信确认运行的是对应架构的 Dependencies.exex86 的 System32 实际是 SysWOW64分析器会按根 PE 的架构选择搜索目录但本机 PATH、环境变量仍会影响Environment策略的判定结果。【免费下载链接】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),仅供参考
📝

华诺云谱内容团队

资深建站顾问 · 行业研究员

10年+企业数字化服务经验,专注智能建站、SEO优化与品牌营销,持续输出建站技巧、行业洞察与营销干货,已帮助5000+企业实现数字化增长。

你可能需要的服务

订阅华诺云谱资讯周报

每周一封,精选建站技巧、SEO与营销干货,直达邮箱。已有 8,000+ 企业主订阅,助你少走弯路。

↑