KingKDot/Exorcism
GitHub: KingKDot/Exorcism
Exorcism 是一款开源的运行时 Windows 批处理反混淆器,通过挂钩 cmd.exe 实现对混淆批处理命令的实时拦截、调试与记录。
Stars: 44 | Forks: 5
# Exorcism - 运行时 Windows 批处理反混淆器
“当有小恶魔拿着 .bat 加密器到处乱跑时,你需要一场驱魔。”



**Exorcism** 是一个运行时 Windows 批处理反混淆器/调试器,它使用 DLL 注入和函数挂钩(hooking)技术,在 `cmd.exe` 处理批处理命令时,对其进行暂停、编辑、跳过和记录。
## 🎯 什么是 Exorcism?
Exorcism 在运行时挂钩到 Windows 命令处理器(`cmd.exe`),以便在批处理命令执行之前拦截并记录它们。与那些容易被混淆技术欺骗的静态分析工具不同,Exorcism 能够捕获 Windows 命令解释器在处理过程中的实际命令。
### 主要特性
- **运行时分析**:在实际处理命令时对其进行捕获,绕过大多数混淆技术
- **交互式调试**:在执行前暂停、继续、跳过、编辑或自动处理重复的命令
- **DLL 注入**:使用 Rust 的 `detour` crate 实现可靠的函数挂钩
- **实时监控**:以 JSON 输出格式实时记录命令
- **安全的内存访问**:稳健的指针验证和内存安全检查
- **跨架构**:同时支持 x86 和 x64 进程
## 🏗️ 架构
该工具由两个主要组件组成:
1. **Hook DLL(`cmdtest.dll`)**:一个 Rust 编写的 DLL,用于挂钩 `cmd.exe` 中的 `FindFixAndRun` 函数
2. **Python 控制器(`main.py`)**:一个 Python 脚本,负责处理 DLL 注入和日志监控
### 工作原理
1. Python 控制器启动一个新的 `cmd.exe` 进程
2. 使用 DLL 注入技术将 Hook DLL 注入到 `cmd.exe` 进程中
3. 该 DLL 使用 Rust 的 `detour` crate 挂钩内部的 `FindFixAndRun` 函数
4. 每条命令在执行前都会到达由 Python 控制的断点
5. Python 监控器允许你继续、跳过、编辑或自动处理重复的命令
6. 决策和命令活动将被记录到 `cmd_hook.json` 中
## 📋 前置条件
- Windows 10/11 (x64)
- Rust 稳定版工具链
- Python 3.7 或更高版本
- 管理员权限(DLL 注入所需)
## 🚀 安装说明
### 1. 克隆仓库
```
git clone https://github.com/YourUsername/Exorcism.git
cd Exorcism
```
### 2. 构建 Hook DLL
1. 构建并暂存 Rust Hook DLL:
build_cmdtest.bat
2. 暂存的 DLL 将位于 `bin\cmdtest.dll`,这是 `main.py` 使用的默认 Hook DLL 路径。
### 3. 安装 Python 依赖
```
pip install -r requirements.txt
```
## 📖 用法
### 基本用法
1. **以管理员身份运行**(DLL 注入所需):
# 以管理员身份打开命令提示符
python main.py
2. **出现提示时,输入 DLL 路径**:
输入 Hook DLL 的完整路径 [C:\path\to\Exorcism\bin\cmdtest.dll]:
3. **在弹出的受监控 cmd.exe 窗口中执行你的批处理文件**
4. **当每条命令触发断点时,选择调试器操作**:
- `c`:继续一次
- `s`:跳过一次
- `e`:在命令行运行前对其进行编辑
- `a`:永远继续执行该特定命令
- `k`:永远跳过该特定命令
- `i`:现在继续,并在未来出现重复时静默继续
### 输入示例
```
echo Hello World
set VAR=secret_value
if exist file.txt del file.txt
cls
```
### 输出示例
该工具以 JSON 格式将命令记录到 `cmd_hook.json`:
```
[
{
"event_type": "hook_status",
"message": "FindFixAndRun hook initialized successfully"
},
{
"arguments": " Hello World",
"break_id": 1,
"command": "echo",
"command_type": 0,
"event_type": "debug_break",
"message": "Paused before command execution"
},
{
"arguments": " Hello World",
"break_id": 1,
"command": "echo",
"event_type": "debug_decision",
"message": "continue"
},
{
"arguments": " Hello World",
"command": "echo",
"command_type": 0,
"event_type": "command_execution"
},
{
"arguments": " VAR=secret_value",
"command": "set",
"command_type": 0,
"event_type": "command_execution"
},
{
"command": "cls",
"command_type": 0,
"event_type": "command_execution"
},
{
"event_type": "hook_status",
"message": "FindFixAndRun hook being removed"
}
]
```
## 🔧 配置
### Hook DLL 配置
`main.py` 会在启动受监控的 shell 之前,从匹配的 `cmd.exe` 公共符号中解析出 `FindFixAndRun` 的 RVA,然后通过 `EXORCISM_FIND_FIX_AND_RUN_RVA` 将其传递给 Hook DLL。匹配的 PDB 缓存在本地的 `.symbols/` 目录下。
该 Hook DLL 还保留了一个备用 RVA:
```
const DEFAULT_FIND_FIX_AND_RUN_RVA: usize = 0x116B0;
```
**注意**:此 RVA 特定于某些版本的 `cmd.exe`。如果挂钩失败,你可能需要:
1. 检查在 `main.py` 启动时,符号解析是否记录了最新的 `FindFixAndRun` RVA。
2. 如果符号不可用,请使用调试器(x64dbg、IDA Pro)查找 `FindFixAndRun` 的当前 RVA。
3. 在运行 `main.py` 之前设置 `EXORCISM_FIND_FIX_AND_RUN_RVA=0x...`,或者更新 `cmdtest/src/lib.rs` 中的备用 RVA 并使用 `build_cmdtest.bat` 重新构建。
### Python 监控器配置
Python 脚本会自动执行以下操作:
- 清理之前的日志文件
- 清理 `.exorcism_debug/` 中之前的调试器响应文件
- 通过 DLL 注入启动 `cmd.exe`
- 实时监控 JSON 日志文件
- 将调试器的决策写回 Hook DLL
- 提供丰富的终端界面
## 🛡️ 安全注意事项
### 对于分析师
- **在分析恶意样本时,请务必在隔离环境中使用**
- 考虑使用易于还原的专用分析虚拟机
- 除了记录命令外,还应监控网络连接和文件系统更改
- 请注意,某些高级恶意软件可能会检测到 Hook 并改变其行为
### 对于开发者
- 目前的实现使用了硬编码的 RVA,这可能会随着 Windows 更新而失效
- 考虑实现 IAT(Import Address Table,导入地址表)挂钩以获得更好的兼容性
- 为命令参数和重定向添加额外的验证
- 实现对批处理文件生成的子进程的进程监控
## 📝 许可证
本项目基于 Apache License 2.0 授权 - 有关详细信息,请参阅 [LICENSE](LICENSE) 文件。
## 🙏 致谢
- Rust 的 `detour` crate 提供的函数挂钩功能
- Windows XP 源代码泄露,为 cmd.exe 内部结构提供了深刻的见解
- 安全研究社区的启发与指导
## ⚖️ 免责声明
本工具旨在用于:
- 安全研究
- 在受控环境中进行恶意软件分析
- 教育目的
- 合法的批处理文件调试
**用户需自行确保符合适用的法律法规。对于滥用本软件所造成的后果,作者不承担任何责任。**
**切记:批处理文件将会真实执行!请采取适当的安全措施!**
标签:DAST, DNS 反向解析, Python, Rust, 代码反混淆, 可视化界面, 恶意软件分析, 无后门, 端点可见性, 网络流量审计, 逆向工具