WHots/Daydream
GitHub: WHots/Daydream
一款用 Rust 编写的 Windows x64 进程与 PE 文件取证分析工具,为防御性逆向工程提供结构化的初步分析数据。
Stars: 0 | Forks: 0
Daydream
用于防御性逆向工程的 Windows x64 PE 与进程内存取证分析。
## 目录
- [概述](#overview)
- [项目状态](#project-status)
- [预期用途](#intended-usage)
- [当前功能](#current-capabilities)
- [环境要求](#requirements)
- [构建与测试](#build-and-test)
- [使用说明](#usage)
- [输出结构](#output-structure)
- [特征码与 opcode 目录](#pattern-and-opcode-catalogs)
- [项目结构](#project-layout)
- [准确性与局限性](#accuracy-and-limitations)
- [开发原则](#development-principles)
- [贡献指南](#contributing)
## 概述
Daydream 是一个仅适用于 Windows 的 x86-64 Rust 应用程序,用于从以下来源收集结构化的取证分析
数据:
- 正在运行的进程及其映射的主镜像。
- 磁盘上原始的 x64 PE(Portable Executable)文件。
该项目旨在为恶意软件分析师、逆向工程师、安全研究人员、学生和防御者提供有用的初步视角,
以便在进行更深入的分析(如使用调试器或反汇编器)之前了解情况。它将 PE 结构、导入表、字符串、调试
元数据、进程结构、特征码匹配、opcode 命中以及精确的位置元数据整合在一个工作流中。
Daydream 是一个取证分析工具。它不打算自动判定文件或进程是否为恶意。收集到的值应当作
分析师的证据,并结合周围的代码、来源、行为以及其他工具进行综合研判。
## 项目状态
| 领域 | 当前状态 |
| --- | --- |
| 开发阶段 | 积极开发中 / 原型阶段 |
| 支持的操作系统 | 仅限 Windows |
| 支持的架构 | x86-64 / PE32+ |
| Rust 工具链 | 稳定版 `x86_64-pc-windows-msvc` |
| 进程输出 schema | 版本 1 |
| 公共 API 稳定性 | 不作保证 |
| 主要接口 | 命令行应用 |
目前请不要将当前的输出格式、模块边界或收集器行为视为稳定的公共 API。
## 预期用途
Daydream 旨在用于合法的防御性工作,例如:
- 在受控的分析环境中检查恶意软件样本。
- 为事件响应收集指标和结构性证据。
- 在授权的安全评估期间检查二进制文件。
- 调查您拥有或获得授权进行逆向工程的软件。
- 学习 Windows 进程结构、PE 内部原理、导入表、PDB 记录以及 x64 代码
模式。
- 生成 JSON 产物,以便日后审查、比较或集成到防御性
分析 pipeline 中。
不得使用 Daydream 未经授权访问系统或进程、部署 payload、逃避防御者或造成
破坏。进程内存检查是一项双用途技术能力;合法和合规使用的责任由
操作者承担。
## 当前功能
### 运行中进程的取证分析
进程模式使用查询和内存读取权限打开目标,验证其身份,
并在其各个收集器之间重复使用一份已验证的主镜像快照。
当前的进程收集器包括:
- 进程身份、可执行文件路径、句柄访问权限以及 PEB 验证。
- 主模块基址、镜像大小、入口点 RVA 以及区段表。
- 稀疏映射镜像读取,并明确跟踪不可用的范围。
- 基于 PE 结构、入口点、`BaseOfCode` 和运行时函数
信息的证据的 x64 代码段选择。
- 标准 PE 导入表以及直接的 RIP 相对 IAT 调用/跳转引用。
- 支持的 `RSDS` 和 `NB10` 记录的 CodeView PDB 发现。
- 来自映射主镜像的 ASCII、UTF-8 和 UTF-16LE 字符串。
- 包含身份和 PEB 指针检查的逐线程 TEB 收集。
- 在受信任的 TEB `StackLimit` 和 `StackBase`
值之间逐区域进行字符串扫描。
- 来自 `patterns64.rs` 的每个已配置的 x64 分析师特征码。
- 来自 `opcodes64.rs` 的断点、调试陷阱和调试寄存器 opcode 命中。
- 适用情况下的 RVA、进程地址、区段和原始文件偏移量元数据。
进程模式在正常收集过程中保持终端安静。它会显示一条不断更新的
进度条,其中包含当前阶段和总体百分比,同时详细结果将
写入 JSON。
### 原始文件的取证分析
文件模式分析磁盘上的字节,而无需将目标作为进程加载。
当前的文件收集器包括:
- 严格的 x64 PE 验证。
- 文件标识、SHA-256、Shannon 熵、原始大小以及 PE 头元数据。
- 区段布局、内容分类、内存特征、RVA 和文件偏移量。
- 标准导入表以及受支持的直接 IAT 调用/跳转引用。
- 调试目录检查和带类型的调试 payload 元数据。
- 在支持的情况下,提供 `RSDS`、`NB10`、POGO、VC feature、可复现构建 (reproducible-build)、校验和、杂项以及
内嵌的与 portable PDB 相关的记录。
- ASCII、UTF-8 和 UTF-16LE 字符串提取。
- 通过 `X64_FILE_SCAN_SIGNATURES` 进行支持通配符的可执行段扫描。
文件模式目前会将收集到的摘要打印到控制台,并且还会保存整理好的
JSON 输出。
## 环境要求
- Windows x64。
- 通过 [rustup](https://rustup.rs/) 安装的 Rust。
- 稳定版 Rust 工具链。
- `x86_64-pc-windows-msvc` 目标。
- Microsoft Visual Studio Build Tools,包含 MSVC 链接器和 Windows SDK。
- 足够的权限以打开选定进程进行查询和虚拟内存读取
访问。
该仓库的 `rust-toolchain.toml` 指定了:
```
[toolchain]
channel = "stable"
targets = ["x86_64-pc-windows-msvc"]
components = ["rustfmt", "clippy"]
```
一些受保护的、提权的、跨会话的、对安全敏感的或架构不匹配的
进程可能仍然无法访问,即使 Daydream 本身运行正常。
## 构建与测试
从 Windows 终端克隆或打开仓库并运行:
```
cargo build
cargo test
```
进行优化构建:
```
cargo build --release
```
发布版的二进制文件将位于:
```
target\release\daydream.exe
```
实用的开发检查包括:
```
cargo check
cargo test
cargo clippy
```
## 使用说明
### 分析当前的 Daydream 进程
不带参数运行将回退到对 Daydream 自身的进程分析:
```
cargo run
```
或者使用编译好的二进制文件:
```
.\target\release\daydream.exe
```
### 通过 PID 分析正在运行的进程
```
cargo run -- -p 1234
```
```
.\target\release\daydream.exe -p 1234
```
目标必须是 Daydream 有权查询和读取的进程。对于已授权的提权目标,可能
需要运行提权的终端,但提权并不会
绕过 Windows 的安全边界或受保护进程的限制。
### 分析原始 PE 文件
```
cargo run -- -f "C:\Samples\target.exe"
```
```
.\target\release\daydream.exe -f "C:\Samples\target.exe"
```
当前的 CLI 仅接受确切的一个目标模式和目标值:
```
usage: daydream [-f
| -p ]
```
## 输出结构
输出将在终端的当前工作目录下生成。JSON 文件将以
美化打印(pretty-printed)的形式写入。
### 进程输出
进程输出根目录使用目标可执行文件的文件名主体和 SHA-256 标识:
```
_procdmp_/
├── PE/
│ ├── image.json
│ ├── sections.json
│ └── pdb.json
├── Imports/
│ └── imports.json
├── PEB/
│ ├── peb.json
│ └── tebs.json
├── Patterns/
│ ├── code_section.json
│ ├── pattern_hits64.json
│ └── opcode_hits64.json
└── strings.json
```
关键的特征码输出包括:
- `code_section.json` — 选定的代码段证据和置信度。
- `pattern_hits64.json` — 标志性的 CRT 入口特征码以及每个配置过的
`X64_ANALYST_SIGNATURES` 匹配项。
- `opcode_hits64.json` — 每个配置过的断点/调试 opcode 匹配项,包括
在需要时的 ModR/M 元数据。
进程 JSON 会保留带类型的失败或部分读取信息,而不是直接静默
丢弃不可用的数据。重用相同的进程输出根目录会更新生成的
JSON 文件并删除过时的旧特征码文件名。
### 原始文件输出
原始文件输出根目录使用目标的文件名主体和 SHA-256:
```
_/
├── PE/
│ ├── file_metadata.json
│ └── sections.json
├── Imports/
│ └── imports.json
├── PEB/
│ └── debug_directory.json
├── Scanning/
│ └── signature_hits.json
└── strings.json
```
当再次扫描相同的目标内容时,现有的原始文件输出根目录会被重新创建。
## 特征码与 opcode 目录
### 添加 x64 分析师特征码
x64 特征码目录位于:
```
src/core/data/patterns64/patterns64.rs
```
特征码使用 `x64_signature!` 并接受精确的字节以及单字节通配符。贡献者
可以将通配符表示为 `??`、`?` 或 `WILDCARD`:
```
pub const EXAMPLE_SIGNATURE: Signature = x64_signature!(
"example signature",
[0x48, 0x8B, ??, 0xE8, WILDCARD, WILDCARD, WILDCARD, WILDCARD]
);
```
每个通配符恰好消耗一个字节;它不是变长的间隙。声明
特征码后,将其添加到符合其预期作用域的目录中:
- `X64_CRT_STARTUP_SIGNATURES`
- `X64_RUNTIME_ANCHOR_SIGNATURES`
- `X64_ANTI_ANALYSIS_SIGNATURES`
- `X64_FILE_SCAN_SIGNATURES`
- `X64_ANALYST_SIGNATURES`
进程特征码收集会消耗 `X64_ANALYST_SIGNATURES`。原始文件扫描会消耗
`X64_FILE_SCAN_SIGNATURES`。
### 添加 x64 opcode 记录
断点和与调试相关的 opcode 数据位于:
```
src/core/data/opcode_specific64/opcodes64.rs
```
每个 `OpcodeBytecode` 都提供一个名称、一个精确的 opcode 前缀以及一个 `requires_modrm`
标志。用于进程扫描的记录必须包含在
`X64_BREAKPOINT_OPCODE_BYTECODES` 中。
对于 `0F 21` 和 `0F 23` 等 opcode,收集器在记录命中之前,
需要并验证一个尾随的寄存器形式 ModR/M 字节。
## 项目结构
```
src/
├── main.rs CLI parsing and mode dispatch
└── core/
├── data/
│ ├── opcode_specific64/
│ │ └── opcodes64.rs x64 breakpoint/debug opcode catalog
│ └── patterns64/
│ └── patterns64.rs wildcard-aware x64 signature catalog
├── file_ops/
│ ├── file_processing.rs raw-file orchestration and console presentation
│ ├── outputs/
│ │ ├── configs.rs raw-file output layout
│ │ └── file_triage_saves.rs
│ └── utils/
│ ├── apis.rs imports and direct IAT references
│ ├── pdb.rs debug-directory and CodeView parsing
│ ├── scanning.rs executable-section signature scanning
│ ├── sections.rs section metadata and traits
│ ├── strings.rs raw-file string collection
│ ├── supports.rs checked PE byte/RVA helpers
│ └── validate.rs x64 raw-file validation
├── process_ops/
│ ├── process_processing.rs process orchestration and progress reporting
│ ├── outputs/
│ │ ├── config.rs process dump layout and filenames
│ │ └── process_triage_saves.rs
│ └── utils/
│ ├── detect_code_section_utils.rs
│ ├── foundation/
│ │ └── validate_pe.rs mapped-image validation and snapshotting
│ ├── importutils.rs process imports and IAT references
│ ├── memutils.rs memory reads and region queries
│ ├── pdbutils.rs process main-module PDB metadata
│ ├── pe_utils.rs sections, locations, patterns, and opcodes
│ ├── processutils.rs process, PEB, and main-module validation
│ ├── stringdumputils.rs main-image and TEB-stack strings
│ ├── strings.rs shared string decoding primitives
│ └── tebutils.rs per-thread TEB collection
├── internal/
│ ├── imports/imports.rs
│ └── utils/handles.rs owned Win32 handle wrapper
└── global_utils/
└── fileutils.rs SHA-256, entropy, and JSON writing
```
`src/core/internal/saves/structure.rs` 也存在于仓库中,但目前
未被 `src/main.rs` 声明。
## 准确性与局限性
- 特征码或 opcode 命中仅证明扫描
范围内存在匹配的字节。这并不能证明具有恶意意图或已被执行。
- 短的 opcode 特征码——尤其是 `INT3` (`0xCC`)——也可能代表编译器填充、
对齐、内嵌在可执行段中的数据,或者是合法的调试器行为。
- 通配符特征码属于字节模式,而不是解码后的指令语义。
- 对于没有对应原始文件数据作为Backing的映射字节,可能无法获取
文件偏移量。
- 在收集运行期间,进程内存可能会发生改变。线程可能会退出,堆栈可能会
改变,页面可能会变得不可访问。
- 由加载器丢弃的、受保护的、保留的、受保护的或不可读的范围可能会产生部分
结果。当收集器形态支持时,Daydream 会记录这些情况。
- 栈字符串可能是函数返回后留下的过期产物。
- TEB 栈扫描会使用已提交的可读区域,并跳过受保护或不可访问的
页面。跨越不可读边界的字符串可能无法恢复。
- 直接的 IAT 交叉引用收集目前主要关注受支持的 x64 RIP 相对 call 和 jump
形式;它不是一个完整的反汇编器或控制流引擎。
- Daydream 不能替代调试器、反汇编器、沙箱、YARA 引擎、EDR 产品
或分析师的判断。
## 开发原则
- 验证一次并重复使用结构化的 PE/进程状态。
- 保留 RVA、进程地址、文件偏移量、区段和完整性元数据。
- 将原始文件操作与目标进程操作分开。
- 保留带类型的部分失败,而不是将每一个不可访问的页面视为整个扫描
的失败。
- 将进程访问权限限制在查询和内存检查所需的范围内。
- 优先考虑精确的、上下文相关的证据,而不是通用的字节片段。
- 保持大型扫描在限制范围内,并为耗时的阶段报告进度。
- 直接假定环境为 Windows x64;该项目故意不提供跨平台的
兜底方案(fallback stubs)。
## 贡献指南
Daydream 正在快速迭代。在进行更改之前:
1. 阅读 `AGENTS.md` 和 `CLAUDE.md` 以了解仓库特定的规则。
2. 将新的原始文件收集器放在 `file_ops` 下,将进程内存收集器放在
`process_ops` 下。
3. 复用已验证的文件或进程快照,而不是在没有
明确需求的情况下重新解析或重新读取。
4. 为匹配、范围、解析器或输出行为添加专注的测试。
5. 至少运行:
cargo check
cargo test
cargo build
6. 将检测结果视为证据,并记录已知的误报情况。
贡献必须保持在项目用于防御、授权的恶意软件分析和
逆向工程的目的范围内。标签:DAST, Homebrew安装, PE结构分析, Rust, 可视化界面, 安全意识培训, 恶意软件分析, 网络流量审计, 进程分析, 逆向分析, 通知系统