gasbugs/win32-malware-analysis-101
GitHub: gasbugs/win32-malware-analysis-101
一个面向初学者的 Win32 API 恶意代码分析示例集合,包含 18 个独立 XP 兼容的 32 位程序,演示恶意软件常用技术。
Stars: 0 | Forks: 0
# win32 malware 分析 101
恶意代码分析/逆向工程入门学习用的 **Windows API 示例集合**。将恶意代码中频繁出现的 18 个核心 Win32 API 分别独立为单个文件,以便一眼看出每个调用会产生什么行为。
## 快速开始
如果是初次接触,按照下面的顺序操作即可顺利完成。
以下所有命令基于 **PowerShell**(Win+R → `powershell` → 回车)。操作在用户主目录(`$HOME`,通常为 `C:\Users\<你的用户名>`)中进行。
### ⚡ 一键完成(PowerShell 单块)
已安装 [VirtualBox](https://www.virtualbox.org/) + [Vagrant](https://developer.hashicorp.com/vagrant/install) 的情况下,复制并执行以下全部内容:
```
cd $HOME
git clone https://github.com/gasbugs/win32-malware-analysis-101.git
cd .\win32-malware-analysis-101
powershell -ExecutionPolicy Bypass -File .\quickstart.ps1
```
`quickstart.ps1` 会依次进行 (1) 前置工具检查 → (2)(可选)下载分析工具包 → (3) 执行 `vagrant up`。
如果想手动操作,请参考下面的分步指南。
### 1) 获取仓库
```
cd $HOME
git clone https://github.com/gasbugs/win32-malware-analysis-101.git
cd .\win32-malware-analysis-101
```
如果没有 Git,可在 GitHub 页面右上角点击 **`Code` → `Download ZIP`** → 解压到 `$HOME`,然后执行 `cd $HOME\win32-malware-analysis-101-main`。
### 2)(可选)获取分析工具包
PEview / Procmon / Wireshark / RegShot 等学习用标准分析工具包(约 458MB)。可在虚拟机内一起使用:
```
# 从 repo 根目录 (curl.exe / tar 是 Windows 10/11 默认内置)
curl.exe -L -o samples.zip https://github.com/gasbugs/win32-malware-analysis-101/releases/download/samples-v1.0/malware_analysis_samples.zip
tar -xf samples.zip
Remove-Item samples.zip
```
→ `malware_analysis_samples/` 会解压到仓库根目录下(已被 `.gitignore` 忽略,不会进入 git)。
### 3) 启动 XP 学习环境
根据自己的环境选择其中一种:
| 环境 | 前置安装 | 命令(PowerShell,在仓库根目录执行) | 详细指南 |
|------|----------|---------------------------|--------------|
| **Vagrant + VirtualBox**(推荐) | [VirtualBox](https://www.virtualbox.org/), [Vagrant](https://developer.hashicorp.com/vagrant/install) | `vagrant up` | **[VAGRANT.md](VAGRANT.md)** |
| **仅 VirtualBox**(无 Vagrant) | [VirtualBox](https://www.virtualbox.org/) | VBox 菜单 → 导入(`.ova`) | **[IMPORT-VBOX.md](IMPORT-VBOX.md)** |
| **直接在宿主机 Windows 上运行** | (无 — 使用预编译版本) | `.\target\01_messagebox.exe` | 以下 [构建方法](#빌드-방법) |
上面第 1、2 种选项在首次运行时会自动下载约 1.4GB 的 box 文件。
### 4) 在虚拟机内运行示例
虚拟机启动后,在客户机 cmd 窗口中(开始 → 运行 → `cmd`):
```
:: 두 공유 폴더가 보입니다
dir \\vboxsvr\repo :: repo 전체 (읽기 권장)
dir \\vboxsvr\exchange :: 양방향 교환 폴더 (빈 상태)
:: 본 repo의 예제 18개 (prebuilt)
\\vboxsvr\repo\target\01_messagebox.exe
\\vboxsvr\repo\target\05_process_list.exe
\\vboxsvr\repo\target\10_anti_debug.exe
:: 분석 도구 (2번에서 samples 풀었으면)
\\vboxsvr\repo\malware_analysis_samples\2_malware_basic_analysis\basic_dyanamic_analysis_tools\procexp.exe
:: 분석 결과를 호스트로 내보내기 (exchange 폴더에 저장 = 호스트 ./exchange/ 에 보임)
echo "분석 메모" > \\vboxsvr\exchange\result.txt
```
### 5) 关闭 / 重新启动(PowerShell,在仓库根目录执行)
```
vagrant halt # 종료 (다음에 vagrant up 으로 빠르게 재개)
vagrant up # 다시 시작 (box 재다운 없음, 수십 초)
vagrant destroy # 완전 제거 (box 캐시는 유지)
```
## 仓库结构
本仓库的核心是从 `01_messagebox/` 到 `18_screenshot/` 的 **18 个独立的 Win32 API 示例**。每个目录包含独立的 `.cpp` 文件和 `build.bat`,全部构建由 `build-all.ps1` 管理。
此外,`yara-tutorial/` 包含用于练习 YARA 规则编写和基本扫描流程的 **辅助学习资料**。它与 WinAPI 示例构建流程相互独立,使用 Python + `yara-python` 运行。
## 涉及的 18 个 API
| # | 目录 | 核心 API | 类别 |
|---|---------|----------|---------|
| 01 | `01_messagebox` | `MessageBoxW` | 基础 |
| 02 | `02_network` | `InternetOpenW` / `InternetOpenUrlW` / `InternetReadFile` | C2 通信 |
| 03 | `03_file` | `CreateFileW` + `WriteFile` | 文件释放 |
| 04 | `04_registry` | `RegSetValueExW` (`HKCU\...\Run`) | 持久化 |
| 05 | `05_process_list` | `CreateToolhelp32Snapshot` / `Process32First` | 侦察 |
| 06 | `06_directory_list` | `FindFirstFileA` / `FindNextFileA` | 侦察 |
| 07 | `07_sysinfo` | `GetUserNameA` / `GetComputerNameA` | 侦察 |
| 08 | `08_self_copy` | `GetModuleFileNameW` + `CopyFileW` | 持久化 |
| 09 | `09_mutex` | `CreateMutexW` | 防多开 |
| 10 | `10_anti_debug` | `IsDebuggerPresent` / `CheckRemoteDebuggerPresent` | 对抗 |
| 11 | `11_hide_file` | `SetFileAttributesW` (HIDDEN+SYSTEM) | 对抗 |
| 12 | `12_sleep` | `Sleep` (绕过沙箱时间检测) | 对抗 |
| 13 | `13_create_process` | `CreateProcessW` | 执行 |
| 14 | `14_dynamic_api` | `LoadLibraryW` + `GetProcAddress` | IAT 绕过 |
| 15 | `15_virtualalloc` | `VirtualAlloc(PAGE_EXECUTE_READWRITE)` | Shellcode 模式 |
| 16 | `16_keylog` | `GetAsyncKeyState` + `ToAscii` + `GetForegroundWindow` | 数据收集 |
| 17 | `17_clipboard` | `OpenClipboard` + `GetClipboardData` | 数据收集 |
| 18 | `18_screenshot` | `GetDC` + `BitBlt` + `GetDIBits` (BMP 保存) | 数据收集 |
## 构建环境
| 项目 | 值 |
|------|----|
| 编译器 | MSYS2 **mingw32** g++ (i686, MSVCRT) |
| 架构 | 32 位 (i386) |
| 兼容 OS | **Windows XP** 及以上 (PE Subsystem 5.01) |
| CRT | 静态链接 (`-static -static-libgcc -static-libstdc++`) → 无需额外运行时 |
### 安装编译器(仅一次)
```
powershell -ExecutionPolicy Bypass -File .\install-gpp-32bit.ps1
```
此脚本会:
- 若未安装 MSYS2,则通过 winget 安装
- 安装 `mingw-w64-i686-gcc` 包
- **不修改**系统 `PATH`(避免冲突)
- 仅在 PowerShell `$PROFILE` 中注册 `g++32` 函数 → 调用方式:`g++32 hello.cpp -o hello.exe`
设计上避免与已有 64 位 `g++`(ucrt64)环境冲突。关于 PATH 分离策略的详细说明请参考 [问题指南](#path-분리-전략-요약)。
构建方法
### 1) 逐个构建(建议学员使用)
每个目录下都有 `build.bat`。在对应文件夹中双击运行,或:
```
cd 01_messagebox
build.bat
```
→ 会在同一目录下生成 `messagebox.exe`。
### 2) 全部一次构建
```
powershell -ExecutionPolicy Bypass -File .\build-all.ps1
```
→ 在 `target/` 目录下输出全部 18 个 `.exe` 文件。
### 3) 跳过构建,直接使用预编译版本
`target/` 中已提交了 32 位且兼容 XP 的 18 个预编译 `.exe` 文件,无需安装 MSYS2 即可直接运行。
```
target\01_messagebox.exe
target\05_process_list.exe
:: ...
```
按学习流程建议自行构建,但如果不想在环境配置上花费时间,也可以使用这些预编译文件。
## 运行注意事项
| 示例 | 注意 |
|------|------|
| `02_network` | `http://example.com` 如果重定向到 HTTPS,XP 的 WinINet 会失败(仅支持 TLS 1.0)。请改用纯文本 HTTP 服务器进行测试 |
| `04_registry` | 会在 `HKCU\...\Run` 下注册键值。建议学习后手动删除。在安装了韩国安全软件(WIZVERA delfino、CrossEX 等)的 PC 上,regedit GUI 可能不显示包含 "Malware" 关键词的值——但实际上已经注册,通过 `reg query` 或 PowerShell 可以查看到 |
| `08_self_copy` | 会在 `%APPDATA%\malware_copy.exe` 生成副本。学习后请删除 |
| `11_hide_file` | 会在同一目录下创建带有隐藏属性的文件 |
| `15_virtualalloc`| 使用 RWX 内存 → 部分杀毒软件可能会立即检测/拦截 |
| `16_keylog` | 会将按键、Shift 组合键、特殊键([ENTER]/[TAB]/[BS]/[F1])以及活动窗口标题输出到控制台。按 ESC 退出。由于韩语实际输入字符需要 IME 钩子,仅会显示切换键(如 [한/영]) |
| `18_screenshot` | 会截取当前屏幕并保存为 `screenshot_YYYYmmdd_HHMMSS.bmp`(24 位 BMP,未压缩)。在 1920×1080 分辨率下约为 6MB |
## PE 头验证
验证生成的 `.exe` 确实为 32 位且兼容 XP:
```
$objdump = 'C:\msys64\mingw32\bin\objdump.exe'
& $objdump -f .\target\01_messagebox.exe # architecture: i386
& $objdump -p .\target\01_messagebox.exe | Select-String 'SubsystemVersion'
# MajorSubsystemVersion 5 / MinorSubsystemVersion 1 → XP OK
```
## PATH 分离策略摘要
当 64 位 ucrt64 g++ 和 32 位 mingw32 g++ 共存于同一系统时,若两者都在 PATH 中,则无法确定 `g++` 命令会调用哪一个。本仓库遵循以下原则:
1. **系统 PATH**:仅保留 `ucrt64\bin`(64 位)(或两者都不保留也可)
2. **构建脚本**(`build.bat`、`build-all.ps1`):仅在执行时临时将 `mingw32\bin` 添加到 PATH 前面,执行完毕后恢复
3. **交互使用**:通过 `g++32` 配置文件函数明确调用 32 位 g++
→ 彻底避免冲突。详细说明请参阅 [install-gpp-32bit.ps1](install-gpp-32bit.ps1) 头部注释。
## 截图示例
`18_screenshot` 运行结果示例——实际截图经过像素化马赛克处理:

实际运行时,会以完整分辨率(如 1920×1080)的 24 位 BMP 格式保存到同一目录下,文件名为 `screenshot_YYYYmmdd_HHMMSS.bmp`。
## 许可证
[MIT License](LICENSE)。但本资料仅限用于 **教育目的**。
标签:32位, AI合规, DAST, Libemu, Linux, Win32, Windows API, Windows XP, 云资产清单, 入门学习, 功能示例, 学习材料, 恶意代码分析, 恶意软件分析, 技术栈, 示例代码, 逆向工程, 配置文件