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 开发工具
每月下载量 6,699
140KB
3K SLoC
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
,GNUldd
的 Windows PE 可执行文件(exe
和dll
文件)的重新实现。我们努力使输出与原始工具相似,以便现有的针对 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变量
- Linux:
使用Cargo从源安装(任何操作系统)
- 下载并执行rustup
- 检出此存储库并执行
cd
执行
cargo
构建 --发布- 将静态链接的二进制文件从
target/release
复制到您的PATH中的某个位置- Linux:
/usr/local/bin
是一个不错的选择 - Windows:创建自己的目录并在控制面板中将其添加到PATH变量
- Linux:
用法
deprun
打印依赖树
deprun path/to/your/executable.exe
默认行为
- Windows
C:\Windows
和C:\Windows\System32
作为“Windows”和“系统”目录- shell的当前目录也用作
cwd
- 当前shell的PATH的内容用作用户路径
- Linux/macOS
- 如果可执行文件位于挂载的Windows分区中,将使用其
C:\Windows
和C:\Windows\System32
目录 - shell的当前目录也用作
cwd
- PATH为空
- 如果可执行文件位于挂载的Windows分区中,将使用其
检查缺失的符号
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 提供了这款优秀的软件,以及个人网站上提供的大量信息和文档)
- pelite 和 goblin,所有这些都是基于这些构建的
- skim,提供了出色的模糊搜索库
许可证
LGPLv3
Dependencies
~16MB
~303K SLoC