6 个版本 (稳定版)

1.2.4 2023年8月10日
1.2.2 2023年3月5日
1.1.0 2023年2月5日
1.0.0 2022年9月24日
0.1.0 2021年2月23日

#188 in 开发工具

Download history 1200/week @ 2024-04-07 1287/week @ 2024-04-14 1413/week @ 2024-04-21 1404/week @ 2024-04-28 1465/week @ 2024-05-05 1607/week @ 2024-05-12 1982/week @ 2024-05-19 1464/week @ 2024-05-26 1905/week @ 2024-06-02 1730/week @ 2024-06-09 1739/week @ 2024-06-16 1490/week @ 2024-06-23 1523/week @ 2024-06-30 1687/week @ 2024-07-07 1669/week @ 2024-07-14 1780/week @ 2024-07-21

每月下载量 6,699

LGPL-3.0-only

140KB
3K SLoC

crates.io Dependency Runner CI

Dependency runner

Windows 的 ldd - 更多功能!

功能

  • 便携式:从 Linux 或 macOS 调试 Windows DLL 加载问题!
  • 人体工程学 CLI
  • 显示缺失库和符号的可读报告
  • 使用模糊搜索浏览 DLL 和符号(仅限 Unix 目标)
  • JSON 输出
  • 支持 API 集和 KnownDLLs(仅限 Windows,至少目前如此)
  • 支持 Dependency Walker 的 .dwp 文件
  • 支持 Microsoft Visual Studio 的 .vcxproj.vcxproj.user 文件

试试看

dependency_runner> cargo run --bin deprun -- test_data\test_project1\DepRunTest\build\DepRunTest\Debug\DepRunTest.exe --check-symbols --userpath test_data\test_project1\DepRunTestLibWrong\build\Debug

DepRunTest.exe => C:\Users\Marco Esposito\Projects\personal\dependency_runner\test_data\test_project1\DepRunTest\build\DepRunTest\Debug
        DepRunTestLib.dll => C:\Users\Marco Esposito\Projects\personal\dependency_runner\test_data\test_project1\DepRunTestLibWrong\build\Debug

Checking symbols...

No missing libraries detected

Missing symbols detected!
[Importing executable, exporting executable, missing symbols]

DepRunTest.exe
	DepRunTestLib.dll
		public: float TestClass::testMethod(int)

此存储库包含用于分析 Windows 可移植可执行文件(PE 文件)依赖关系的工具,通常用于调试应用程序启动问题。

这些工具包括

  • wldd,GNU ldd 的 Windows PE 可执行文件(exedll 文件)的重新实现。我们努力使输出与原始工具相似,以便现有的针对 Linux 可执行文件的脚本可以轻松重用。当前的 API 可能在未来扩展,以包括 Win32 可执行文件格式允许的新功能。但是,将优先考虑避免输出格式中的破坏性更改。虽然 ldd 调用加载器并检查内存中的结果,但 wldd 不这样做。Windows 加载过程被模拟,因此每个库的加载地址不包括在输出中。这可能在将来改变。
  • deprun是一个进一步的可执行命令行工具,与wldd不同,它不受与ldd保持兼容性的约束。默认情况下,依赖项以树状结构打印,以提高可读性。它支持多种查找路径规范和输出格式,包括JSON文件。它包含一个DLL和符号浏览器,通过Skim集成了模糊搜索。它可以解析Dependency Walker的.dwp文件,以及Visual Studio的.vcxproj.vcxproj.user文件,以读取可执行文件位置、工作目录和用户路径。
  • 这两个工具都是基于相同的Rust库,可以包含在Rust应用程序中。还计划实现C API,以便可以从大多数其他语言中直接使用该库。

所有这些工具的目标是Windows PE可执行文件,但设计为可移植。默认行为会尝试猜测合理的默认值,以便轻松检查位于另一个操作系统上的相邻Windows安装中的可执行文件,或者在没有此类分区可用的情况下忽略缺失的系统库。上面的示例应在任何操作系统上工作。

入门指南

二进制发布(任何操作系统)

  • GitHub发布页面下载您操作系统上的二进制文件
  • 将二进制文件复制到您的PATH中的某个位置
    • Linux:/usr/local/bin是一个不错的选择
    • Windows:创建自己的目录并在控制面板中将其添加到PATH变量

使用Cargo从源安装(任何操作系统)

  • 下载并执行rustup
  • 检出此存储库并执行cd
  • 执行cargo构建 --发布
  • 将静态链接的二进制文件从target/release复制到您的PATH中的某个位置
    • Linux:/usr/local/bin是一个不错的选择
    • Windows:创建自己的目录并在控制面板中将其添加到PATH变量

用法

deprun

打印依赖树

deprun path/to/your/executable.exe

默认行为

  • Windows
    • C:\WindowsC:\Windows\System32作为“Windows”和“系统”目录
    • shell的当前目录也用作cwd
    • 当前shell的PATH的内容用作用户路径
  • Linux/macOS
    • 如果可执行文件位于挂载的Windows分区中,将使用其C:\WindowsC:\Windows\System32目录
    • shell的当前目录也用作cwd
    • PATH为空

检查缺失的符号

deprun --check-symbols path/to/your/executable.exe

限制扫描和输出深度

deprun --depth 4 path/to/your/executable.exe

将扫描结果保存到JSON文件

deprun --output-json-path path/to/output.json path/to/your/executable.exe

每个可执行文件将用一个单独的对象表示。可以从每个节点的依赖项列表重建依赖项树。

递归打印所有系统依赖项

deprun --print-system-dlls path/to/your/executable.exe

使用模糊搜索浏览DLL,浏览选定DLL导入/导出的符号(在Windows上尚不支持)

deprun --skim path/to/your/executable.exe

浏览所有找到的DLL导入/导出的符号(在Windows上尚不支持)

deprun --skim-symbols path/to/your/executable.exe

wldd

上述内容的子集,使用-h进行检查

路线图

欢迎以问题和拉取请求的形式提供帮助!

  • v 0.1.0
    • 最小的、非并行化的PE依赖项扫描库
    • wldd中实现了ldd功能的有意义子集
      • 非详细模式的兼容输出
    • 人体工程学 CLI
    • JSON 输出
    • 通过.dwp文件指定查找路径
    • 通过.vcxproj.user文件指定PATH,选择配置
    • 通过 .vcxproj 文件指定可执行文件和工作目录,选择配置
    • 从 DLL 中提取符号
    • 检查依赖树中导入/导出符号的对应性
    • 在软件包管理器上发布
      • crates.io
  • v 0.2.0
    • 支持 API 集合
    • 支持 KnownDLLs
  • v 1.0.0
    • API 重构
    • 文档改进
  • v 1.1.0
    • 添加 goblin PE 解析器以增强对对齐问题的鲁棒性
  • v 1.2.0
    • 添加基于 skim 的模糊搜索
  • v 1.3.0
    • 支持清单
    • 使用地址/序号可视化库符号
    • 在软件包管理器上发布
      • Chocolatey
      • WinGet?
      • APT?
      • AUR?
    • wldd 中实现 ldd 功能集的最大可能子集
      • 部分详细输出
      • 未使用符号?
      • 重定位?
  • v 1.x.0
    • 在多个线程上并行化(如果必要时)
    • dependency_runner 图形用户界面?
      • 拖放可执行文件输入
      • PATH 编辑
      • 将 PATH 保存到磁盘,将每个 PATH 与磁盘上的可执行文件关联
      • 监控文件更改

局限性

  • LoadLibraryEx 和类似机制不能在不让程序运行的情况下进行检查。这种限制是其他类似工具的共同点,这些工具递归扫描可执行文件并解析它们的导入表。
  • 尚未支持应用程序清单。您可以查看 Dependencies 作为替代
  • 出于性能原因,不递归到系统 DLL 的依赖项中;然而,您通常可以认为它们的正确性是可信的

致谢

  • Dependencies(感谢 @lucasg 提供了这款优秀的软件,以及个人网站上提供的大量信息和文档)
  • pelitegoblin,所有这些都是基于这些构建的
  • skim,提供了出色的模糊搜索库

许可证

LGPLv3

Dependencies

~16MB
~303K SLoC