cuisy78/Super-LeechCore-Audit-Proxy
GitHub: cuisy78/Super-LeechCore-Audit-Proxy
LeechCore 2.23 的非官方 Windows x64 代理 DLL,在不修改原始 ABI 的基础上增加了可配置的读写审计日志和写入拦截功能。
Stars: 0 | Forks: 0
# Super LeechCore 审计代理
[English](#english) | [简体中文](#简体中文)
一个非官方的 x64 Windows 审计代理 DLL,适用于 LeechCore 2.23.0.100。它保留了原始 `leechcore.dll` 的导出 ABI,同时增加了可配置的读写日志记录和可选的写入拦截功能。
## 英语
### 概述
该项目构建了一个名为 `leechcore.dll` 的 x64 代理 DLL。原始的 LeechCore 2.23.0.100 DLL 被作为 `RCDATA` 资源嵌入其中,因此在部署时只需要该代理 DLL 即可。
在第一次实际调用 LeechCore API 时——而不是在 `DllMain` 内部——代理会弹出一个配置窗口。UI 会自动根据当前的 Windows 显示语言进行适配:
- 简体中文、繁体中文以及其他中文区域设置使用中文。
- 所有其他区域设置使用英文。
### 功能特性
- 保留了原始 x64 DLL 的所有 20 个导出名称和 ordinal。
- 同时支持基于名称和基于 ordinal 的导入。
- 为读取日志和写入日志提供独立的详细级别。
- 可选的调用耗时统计和有界缓冲区捕获。
- 带有有界无锁队列的异步 UTF-8 日志记录。
- 每个进程独立的时间戳日志文件并支持日志轮转。
- 支持直接放行、拦截并失败和拦截但模拟成功三种写入模式。
- 可选的严格拦截模式,用于配置更改和具有副作用的命令。
- 加载前对嵌入的原始 DLL 进行 SHA-256 校验。
读取和写入日志记录级别可以独立设置为:
1. 关闭
2. 仅记录结果/错误
3. 关键操作摘要
4. 所有 API 调用
5. 详细调试日志
当写入日志未关闭时,每一次写入尝试都会被记录,包括真实的成功、真实的失败、被拦截的失败以及模拟的成功。
### 写入处理
| 模式 | 调用原始写入实现 | 布尔值结果 |
|---|---|---|
| 直接放行 | 是 | 原始结果 |
| 拦截并返回失败 | 否 | `FALSE`,`ERROR_ACCESS_DENIED` |
| 拦截但模拟成功 | 否 | `TRUE`,`ERROR_SUCCESS` |
普通的写入拦截涵盖了 `LcWrite`、`LcWriteScatter`、已知的 FPGA/TLP 写入命令、Agent VFS 写入,以及根据提供的 LeechCore 2.23 源码和头文件归类为写入的其他命令。
严格的副作用拦截还额外涵盖了 `LcSetOption`、内存映射修改以及选定的上下文/回调命令。由于其可能会干扰设备插件的初始化,该功能默认处于关闭状态。
### 内嵌的原始 DLL
内嵌的原始 DLL 的预期 SHA-256:
```
ED76822E67B8F9B949D298E54C12D47E07ADC2BB215EE1DA9C1126BCC6419F92
```
校验通过后,原始 DLL 会被原子化释放并放置在代理 DLL 所在目录下,文件名为:
```
leechcore_original_2_23_0_100.dll
```
这样可以保持与应用程序目录中 `leechcore_device_*.dll` 插件的兼容性。如果该目录不可写,代理 DLL 会回退到:
```
%LocalAppData%\LeechCoreProxy\cache\2.23.0.100
```
Windows 并不提供直接从任意内存缓冲区执行受支持的 `LoadLibrary` 操作的方式,因此在运行时提取内嵌的原始 DLL 属于预期内的正常行为。
### 构建
环境要求:
- Visual Studio 2026 / MSVC v145
- Windows SDK 10.0.26100
- x64 目标平台
```
msbuild leechcore-proxy.vcxproj /m /p:Configuration=Release /p:Platform=x64
```
输出:
```
bin\Release\leechcore.dll
```
### 部署与配置
1. 备份应用程序现有的官方 `leechcore.dll`。
2. 将代理 `leechcore.dll` 复制到其所在位置。
3. 保留现有的 `leechcore_device_*.dll`、FTDI 运行时以及其他设备依赖项。
4. 启动宿主应用程序,并在首次调用 LeechCore API 时配置代理。
代理会在 DLL 所在目录下创建此配置文件:
```
leechcore_proxy.ini
```
该文件包含中文和英文注释。设置以下值以控制 UI:
```
[ui]
; 1 shows the settings window; 0 skips it and uses the INI directly.
show_ui=1
```
对于服务以及其他非交互式宿主程序,请在启动前设置 `show_ui=0`。
日志将写入到代理 DLL 所在的以下目录中:
```
leechcore日志
```
每个进程运行时都会创建一个包含时间戳、毫秒和 PID 的新文件名。第一行记录了该次会话的完整设置快照。
### 提供的基准测试结果
这些测量数据来自已有的原生/代理对比测试,并未在最新构建版本中重新收集:
| 测量项目 | 原生 DLL | 代理 DLL |
|---|---:|---:|
| 16 MiB 批量读取峰值吞吐量 | 195 MB/s | 192 MB/s |
| 4 KiB 及更小块的峰值读取次数/s | 5900–6000 | 5900–6800 |
| 所有测试块大小中的最低延迟 | 168 µs | 170 µs |
测得的 16 MiB 吞吐量下降幅度约为 1.54%,最小延迟增加 2 µs,约为 1.19%。小块读取的范围存在重叠并且包含了测量误差;不应将 6800 次/s 的观测值解释为代理性能的稳定提升。
### 验证
- Release x64 构建成功。
- 代理和原始导出表包含相同的 20 个名称和 ordinal。
- `proxy_smoketest.exe` 验证了名称/ordinal 查找和内嵌转发。
- 当 INI 策略为 `1` 或 `2` 时,`proxy_smoketest.exe --blocked-write` 验证了连续和分散写入拦截。
- `policy_test.exe` 验证了直接放行、显式失败、模拟成功、严格模式以及未知命令分类。
### 许可证与上游项目
本仓库基于 GNU General Public License v3.0 分发。详见 [LICENSE](LICENSE)。
LeechCore 上游项目:
- https://github.com/ufrisk/LeechCore
LeechCore 原始的版权和许可声明依然适用于内嵌的上游二进制文件以及基于源码派生的接口。
## 简体中文
### 项目简介
本工程生成名为 `leechcore.dll` 的 x64 Windows 审计代理 DLL。它完整保留原版 LeechCore 2.23.0.100 的导出 ABI,同时增加可配置的读写日志和写入拦截能力。
官方 LeechCore 2.23.0.100 DLL 已作为 `RCDATA` 资源嵌入,因此部署时只需要代理 DLL 本身。
第一次实际调用 LeechCore API 时——不是在 `DllMain` 中——代理会显示设置窗口。界面根据当前 Windows 显示语言自动选择:
- 简体中文、繁体中文及其他中文区域使用中文。
- 其他语言使用英文。
本项目是非官方项目,与 LeechCore 项目及其作者不存在隶属或官方认可关系,仅用于经过授权的调试、审计和兼容性测试。
### 主要功能
- 保留原版 x64 DLL 的全部 20 个导出名称和 ordinal。
- 同时兼容按名称导入和按 ordinal 导入。
- 读取日志和写入日志可以分别设置详细程度。
- 可选调用耗时和有上限的缓冲区内容记录。
- 使用有界无锁队列进行 UTF-8 异步日志写入。
- 每个进程生成独立的时间戳日志并支持轮转。
- 支持正常放行、拦截失败、拦截但模拟成功三种写入模式。
- 可选严格拦截配置修改和其他副作用命令。
- 加载前校验内嵌原版 DLL 的 SHA-256。
读写日志可以分别设置为:
1. 关闭
2. 仅记录结果或错误
3. 记录关键操作摘要
4. 记录全部 API 调用
5. 详细调试记录
只要写入日志没有关闭,每次写入尝试都会记录,包括真实成功、真实失败、拦截失败和模拟成功。
### 写入处理
| 模式 | 是否调用原版写入实现 | 布尔返回结果 |
|---|---|---|
| 正常放行 | 是 | 原函数结果 |
| 拦截并返回失败 | 否 | `FALSE`,`ERROR_ACCESS_DENIED` |
| 拦截但模拟成功 | 否 | `TRUE`,`ERROR_SUCCESS` |
普通写入拦截覆盖 `LcWrite`、`LcWriteScatter`、已识别的 FPGA/TLP 写命令、Agent VFS 写入及根据所提供 LeechCore 2.23 源码和头文件确认的其他写命令。
“严格副作用拦截”还会覆盖 `LcSetOption`、内存映射修改和部分上下文/回调设置。该选项默认关闭,因为它可能影响设备插件初始化。
### 内嵌原版 DLL
内嵌原版 DLL 的预期 SHA-256:
```
ED76822E67B8F9B949D298E54C12D47E07ADC2BB215EE1DA9C1126BCC6419F92
```
校验通过后,原版 DLL 会被原子释放到代理目录:
```
leechcore_original_2_23_0_100.dll
```
这样可以保持与应用目录中 `leechcore_device_*.dll` 插件的兼容性。如果代理目录不可写,则回退到:
```
%LocalAppData%\LeechCoreProxy\cache\2.23.0.100
```
Windows 不提供从任意内存缓冲区直接执行标准 `LoadLibrary` 的受支持方式,因此运行时看到释放出的原版 DLL 属于正常设计行为。
### 构建
要求:
- Visual Studio 2026 / MSVC v145
- Windows SDK 10.0.26100
- x64 目标
```
msbuild leechcore-proxy.vcxproj /m /p:Configuration=Release /p:Platform=x64
```
输出文件:
```
bin\Release\leechcore.dll
```
### 部署与配置
1. 备份应用目录原有的官方 `leechcore.dll`。
2. 将代理版 `leechcore.dll` 复制到原位置。
3. 保留应用原有的 `leechcore_device_*.dll`、FTDI 运行库及其他设备依赖。
4. 启动调用方,在第一次 LeechCore API 调用时完成配置。
代理会在 DLL 同目录创建:
```
leechcore_proxy.ini
```
文件包含中英文注释,可通过以下设置控制界面:
```
[ui]
; 1 显示设置窗口;0 不显示窗口并直接使用 INI。
show_ui=1
```
服务或其他无交互桌面的宿主应在启动前设置 `show_ui=0`。
日志固定写入代理 DLL 同目录下的:
```
leechcore日志
```
每个进程运行时都会生成包含时间戳、毫秒和 PID 的新日志。日志首行记录本次运行的完整设置快照。
### 已提供的性能测试结果
下表来自已有的原版 DLL/代理 DLL 基准结果,本轮没有重新采集:
| 测试项目 | 原版 DLL | 代理 DLL |
|---|---:|---:|
| 16 MiB 批量读峰值吞吐 | 195 MB/s | 192 MB/s |
| 4 KiB 及更小块峰值读取次数 | 5900–6000 次/s | 5900–6800 次/s |
| 所有测试块大小中的最低耗时 | 168 µs | 170 µs |
16 MiB 吞吐下降约 1.54%,最低延迟增加 2 µs,约为 1.19%。小块读取次数区间存在重叠和测量波动,不应将 6800 次/s 解读为代理能够稳定提升性能。
### 验证
- Release x64 构建成功。
- 代理和原版导出表的 20 个名称及 ordinal 完全一致。
- `proxy_smoketest.exe` 验证名称/ordinal 查找和内嵌转发。
- INI 写入策略为 `1` 或 `2` 时,`proxy_smoketest.exe --blocked-write` 验证连续写和散布写拦截及日志。
- `policy_test.exe` 验证放行、明确失败、模拟成功、严格模式和未知命令分类。
### 许可证与上游项目
本仓库使用 GNU General Public License v3.0,详见 [LICENSE](LICENSE)。
LeechCore 上游项目:
- https://github.com/ufrisk/LeechCore
内嵌上游二进制及从上游接口派生的内容仍适用 LeechCore 原有的版权和许可证声明。
标签:C/C++, Linux, SecList, UML, Windows, 事务性I/O, 代理DLL, 内存取证, 审计日志, 客户端加密