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` 运行结果示例——实际截图经过像素化马赛克处理: ![截图示例](https://static.pigsec.cn/wp-content/uploads/repos/2026/06/53d5d00ec1184323.png) 实际运行时,会以完整分辨率(如 1920×1080)的 24 位 BMP 格式保存到同一目录下,文件名为 `screenshot_YYYYmmdd_HHMMSS.bmp`。 ## 许可证 [MIT License](LICENSE)。但本资料仅限用于 **教育目的**。
标签:32位, AI合规, DAST, Libemu, Linux, Win32, Windows API, Windows XP, 云资产清单, 入门学习, 功能示例, 学习材料, 恶意代码分析, 恶意软件分析, 技术栈, 示例代码, 逆向工程, 配置文件