ZDMA / LeechCore 中文集成指南
面向开发者的 LeechCore 软件集成与应用分发说明:DLL 同目录、单 exe 打包、版本对齐以及验证排错。
1. 版本要求
leechcore.dll与leechcore_driver.dll必须来自同一个 release,不能新旧混用。- 若用 MemProcFS 的
vmm.dll做进程级解析,它的版本必须与leechcore.dll一致。 FTD3XX.dll(FTDI 官方 64 位)仅 FT601 / USB3 板卡需要;ZDMA 走 Thunderbolt,使用自带驱动。- ZDMA 新固件 v4.17 / FPGA1 v4+ 需配最新
leechcore.dll。 - 实操建议:三个 DLL 从同一 release 一起下、一起升级;跑起来前先用
pcileech.exe -device fpga probe验证版本与连通性。
合法使用 / 免责声明
本产品仅供合法内存取证、安全研究、授权渗透测试与调试使用;仅可对自有或已获书面授权的设备操作;禁止未经授权访问他人系统;使用者须遵守所在地法律并自行承担全部责任;产品按“现状”提供,LightningZ 不对滥用负责。
Legal Use / Disclaimer: This product is intended only for lawful memory forensics, security research, authorized penetration testing, and debugging. You may operate it only on devices you own or devices for which you have obtained written authorization. Unauthorized access to third-party systems is prohibited. You must comply with all applicable local laws and assume full responsibility for your use. The product is provided “as is”, and LightningZ is not responsible for misuse.
2. 所需用户态 DLL
| 文件 | 是否需要 | 说明 |
|---|---|---|
leechcore.dll + leechcore_driver.dll |
必需 | 必须来自同一 release。 |
vmm.dll |
可选 | 仅在需按进程或虚拟地址读取时使用,版本须与 leechcore.dll 一致。 |
FTD3XX.dll |
按设备而定 | 仅 FT601 板卡需要,ZDMA Thunderbolt 通常不需要。 |
3. 方式一:DLL 与 exe 同目录
这是最简单的方式,适合开发期或内部工具。
your_app/
|- your_app.exe
|- leechcore.dll
|- leechcore_driver.dll
|- vmm.dll 可选
`- FTD3XX.dll 仅 FT601 板卡需要
Windows 启动应用时会搜索 exe 所在目录。将上述文件放到同一个文件夹即可。
C/C++ 最小示例
#include "leechcore.h"
LC_CONFIG cfg = {0};
cfg.dwVersion = LC_CONFIG_VERSION;
strcpy(cfg.szDevice, "fpga");
// 设备字符串可带参数:"fpga://algo=0,tmread=500,pciegen=2"
HANDLE h = LcCreate(&cfg);
LcRead(h, pa, cb, pb);
LcWrite(h, pa, cb, pb);
LcReadScatter(h, ...); // 高吞吐读取
LcClose(h);
如需按进程读取虚拟内存,再叠加 vmm.dll:使用 VMMDLL_Initialize(-device fpga) 初始化,再调用 VMMDLL_MemRead。
4. 方式二:所有 DLL 集成进单个 exe
关键前提:LeechCore 只发布预编译 DLL,没有静态库。因此“单文件”是把 DLL 作为资源嵌入 exe,运行时释放再加载。
路线 A(推荐)
- 将
leechcore.dll和leechcore_driver.dll嵌入 exe 资源。 - 启动时创建临时目录,并将两个 DLL 释放到同一目录。
- 调用
SetDllDirectory指向该目录。 - 调用
LoadLibrary加载leechcore.dll。
// 两个 DLL 必须释放在同一目录
SetDllDirectoryW(dllDir);
HMODULE hLeechCore = LoadLibraryW(L"leechcore.dll");
版本要求不变:嵌进 exe 的两个 DLL 仍须同一 release。
路线 B(有坑)
MemoryModule 一类的纯内存加载方式并不可靠:leechcore.dll 还会通过 LoadLibrary 加载 driver,二级依赖常在内存加载时失败。实际项目仍建议使用路线 A。
| 语言 | 单文件做法 |
|---|---|
| C/C++ | DLL 写入 .rc 资源,使用 FindResource 释放,再 LoadLibrary 加载。 |
| C#/.NET | <PublishSingleFile>true + <IncludeNativeLibrariesForSelfExtract>true,或 Costura.Fody。 |
| Rust | include_bytes! 嵌入,写盘后使用 libloading::Library::new。 |
| Python | pyinstaller --onefile --add-binary "leechcore.dll;.",并确保所有相关 DLL 都被包含。 |
5. 验证与排错
pcileech.exe -device fpga probe
pcileech.exe -device fpga display -min 0x1000 -max 0x2000
| 现象 | 常见原因 | 建议处理 |
|---|---|---|
LcCreate 返回 NULL,或 probe 无设备 |
DLL 版本不匹配 | 重新从同一 release 下载 leechcore.dll 和 leechcore_driver.dll;如使用 vmm.dll 也一并升级。 |
读取结果全为 0xFF |
IOMMU / VT-d 拦截 DMA | 在 BIOS 中关闭 IOMMU / VT-d 后重新验证。 |
找不到 leechcore_driver.dll |
单文件模式的二级依赖未释放到同目录 | 把两个 DLL 释放到同一目录,并在加载前调用 SetDllDirectory。 |
6. 两种方式对比
| 方式 | 优点 | 限制 | 适用场景 |
|---|---|---|---|
| DLL 同目录 | 集成简单、好调试、DLL 可单独替换升级 | 发布目录有多个文件 | 开发期、内部工具 |
| 单个 exe | 分发干净、便携 | 升级 DLL 要重新打包 | 对外交付 |
probe 通过;对外发布再切到单文件路线 A。DLL 那一对始终保持同一 release。