acizmarik/sharpdetect
GitHub: acizmarik/sharpdetect
针对 .NET 程序的动态分析框架,通过 Profiling API 和插件体系检测死锁、数据竞争等并发问题。
Stars: 6 | Forks: 0
# SharpDetect
[](https://github.com/acizmarik/sharpdetect/LICENSE.md)
[](https://github.com/acizmarik/sharpdetect/actions)
[](https://www.nuget.org/packages/SharpDetect)
[](https://www.nuget.org/packages/SharpDetect)
## 概述
SharpDetect 是一个针对 .NET 程序的动态分析框架。
监控和插桩支持是通过 [Profiling API](https://learn.microsoft.com/en-us/dotnet/framework/unmanaged-api/profiling/profiling-overview) 实现的。
分析由插件执行,这些插件可以开发用于评估目标程序的各种运行时属性。
## 安装
SharpDetect 作为 .NET 工具在 [NuGet](https://www.nuget.org/packages/SharpDetect) 上分发。
您可以使用以下命令之一进行安装:
```
dotnet tool install --global SharpDetect # Latest stable release
dotnet tool install --global SharpDetect --prerelease # Latest preview (prerelease)
```
## 快速入门
### 1. 创建要分析的程序
创建并构建一个新的控制台 .NET 应用程序(目标框架为 .NET 8、9 或 10),代码如下:
```
// Note: When executed, this program should eventually deadlock
var a = new object();
var b = new object();
new Thread(() => { while (true) lock (a) lock (b) { } }) { IsBackground = true }.Start();
new Thread(() => { while (true) lock (b) lock (a) { } }) { IsBackground = true }.Start();
Thread.Sleep(5000);
```
### 2. 创建分析配置文件
创建一个描述要执行的分析的配置文件。
创建此文件最简单的方法是使用 `sharpdetect init` 命令:
```
sharpdetect init \
--plugin "SharpDetect.Plugins.Deadlock.DeadlockPlugin" \
--target "" \
--output "AnalysisConfiguration.json"
```
*注意:请将 `` 替换为您编译后的 .NET 程序集的实际路径(例如 `bin/Debug/net9.0/MyApp.dll`)。*
### 3. 运行分析
运行分析时,SharpDetect 将使用上一步骤文件中指定的配置。
使用 `sharpdetect run` 命令启动分析:
```
sharpdetect run AnalysisConfiguration.json
```
### 4. 查看报告
在死锁发生后不久,您应该会看到类似以下的日志消息:
```
warn: SharpDetect.Core.Plugins.PluginBase[0]
[PID=20611] Deadlock detected (affects 2 threads).
```
当目标程序终止时,您应该会看到确认报告已生成的提示:
```
Report stored to file: /home/user/Workspace/SharpDetect_Report_20251223_095828.html.
```
报告是自包含的 HTML 文件,可以在任何现代网络浏览器中打开。
## 分析插件
### 🔒 死锁检测插件
`DeadlockPlugin` 用于分析 .NET 程序中的死锁。
分析完成后,它会生成一个包含受影响线程、堆栈跟踪和其他运行时详细信息的综合 HTML 报告。
#### 支持的同步原语
- `System.Threading.Monitor`
- 支持的操作:`Enter`、`TryEnter`、`Exit`、`Wait`、`Pulse`、`PulseAll`
- `System.Threading.Lock` (.NET 9+)
- 支持的操作:`Enter`、`TryEnter`、`Exit`、`EnterScope`
- `System.Threading.Thread`
- 支持的操作:`Join`
#### 已知限制
- 目前无法检测涉及 `async`/`await` 的死锁
- 尚不支持其他同步原语(例如 `SemaphoreSlim`、`Mutex`、`ReaderWriterLock`)
- 插件在分析过程中会引入性能开销
#### 使用方法
```
sharpdetect init \
--plugin "SharpDetect.Plugins.Deadlock.DeadlockPlugin" \
--target "" \
--output "DeadlockAnalysisConfiguration.json"
```
### ⚡ 数据竞争检测插件:Eraser
`EraserPlugin` 用于分析 .NET 程序中的数据竞争。
它实现了 *Eraser: A Dynamic Data Race Detector for Multithreaded Programs* (1997) 中描述的 Eraser 算法。
分析完成后,它会生成一个包含检测到的竞争详细信息的综合 HTML 报告。
#### 支持的操作
- **同步原语**:与死锁检测插件相同
- **内存访问操作**:
- 静态字段读取 `LDSFLD` 和写入 `STSFLD`
- 实例字段读取 `LDFLD` 和写入 `STFLD`
- 数组元素读取 `LDELEM*` 和写入 `STELEM*`(🚧 开发中 🚧)
#### 已知限制
- 由于 Eraser 算法的特性,可能会出现误报
- 目前不分析某些泛型类型的字段(🚧 开发中 🚧)
- 插件在分析过程中会引入性能开销
#### 使用方法
```
sharpdetect init \
--plugin "SharpDetect.Plugins.DataRace.Eraser.EraserPlugin" \
--target "" \
--output "EraserAnalysisConfiguration.json"
```
### ⚡ 数据竞争检测插件:FastTrack
`FastTrackPlugin` 用于分析 .NET 程序中的数据竞争。
它实现了 *FastTrack: efficient and precise dynamic race detection* (2009) 中描述的 FastTrack 算法。
分析完成后,它会生成一个包含检测到的竞争详细信息的综合 HTML 报告。
#### 支持的操作
- **同步原语**:与死锁检测插件相同
- **内存访问操作**:
- 静态字段读取 `LDSFLD` 和写入 `STSFLD`
- 实例字段读取 `LDFLD` 和写入 `STFLD`
- 数组元素读取 `LDELEM*` 和写入 `STELEM*`(🚧 开发中 🚧)
- **线程操作**:
- 线程 fork - 父线程创建新线程
- 线程 join - 一个线程等待另一个线程完成
#### 已知限制
- 可能会出现误报,但可能性低于 Eraser 算法
- 目前不分析某些泛型类型的字段(🚧 开发中 🚧)
- 插件在分析过程中会引入性能开销
#### 使用方法
```
sharpdetect init \
--plugin "SharpDetect.Plugins.DataRace.FastTrack.FastTrackPlugin" \
--target "" \
--output "FastTrackAnalysisConfiguration.json"
```
## 从源码构建
### 前置条件
- .NET 10 SDK
- 支持 CMake 的 C++20 编译器(Linux 上使用 clang,Windows 上使用 MSVC)
- [Native AOT deployment](https://learn.microsoft.com/en-us/dotnet/core/deploying/native-aot) 的平台特定依赖项
### 构建说明
```
git clone https://github.com/acizmarik/sharpdetect.git
cd sharpdetect
git submodule update --init --recursive
cd src
dotnet tool restore
dotnet cake
```
## 平台支持
SharpDetect 支持分析目标框架为 .NET 8、9 和 10 的程序。
支持的操作系统为 Windows 和 Linux。支持的架构为 x64。
## 路线图
下一版本的发布计划包括:
- 改进生成报告的用户界面。
- 在死锁检测中支持更多的同步原语。
- 实现额外的分析插件(例如,数据竞争检测插件)。
## 致谢
SharpDetect 基于众多开源库和组件构建。
有关详细的许可信息和完整的版权声明,请参阅 [THIRD-PARTY-NOTICES.md](THIRD-PARTY-NOTICES.md)。
## 许可证
本项目采用 [Apache-2.0 license](LICENSE) 授权。
标签:Bash脚本, Concurrency, DAST, NuGet, pocsuite3, Profiling API, 二进制发布, 云安全监控, 云资产清单, 可配置连接, 合规性检查, 多人体追踪, 开源工具, 恶意软件分析, 插件架构, 死锁检测, 程序分析, 网络安全, 调试, 软件测试, 运行时监控, 逆向工程, 隐私保护, 静态分析