MalwareAnalysisLabs/malware-unpacking-anti-analysis

GitHub: MalwareAnalysisLabs/malware-unpacking-anti-analysis

记录对真实恶意软件样本进行脱壳、绕过反分析技术并提取 payload 的逆向分析实战实验室。

Stars: 0 | Forks: 0

# 恶意软件脱壳与反分析绕过 [![逆向工程](https://img.shields.io/badge/Field-Malware%20Analysis-red)](https://github.com/topics/malware-analysis) [![工具](https://img.shields.io/badge/Tools-x64dbg%20%7C%20IDA%20Pro%20%7C%20REMnux-blue)](https://remnux.org/) [![许可证](https://img.shields.io/badge/License-MIT-green.svg)](LICENSE) ## 概述 本仓库记录了我深入探索现代恶意软件脱壳以及绕过试图阻止我们的反分析技术的过程。这里涉及的样本采用了多层防御:调试器检测、字符串混淆、进程傀儡、沙箱规避、SEH 操纵、TLS 回调以及向合法进程注入代码。 每个部分都剖析了相关技术,展示了汇编级别的运作机制,并提供了我用来提取真实 payload 的确切步骤和命令。 ## 本仓库涵盖内容 | 技术 | 样本 | 关键工具 | |-----------|--------|-----------| | **调试器检测绕过** | `getdown.exe` | x64dbg, NOP patching | | **字符串去混淆** | `getdown.exe`, `hubert.dll`, `9.exe` | XORSearch, brxor.py, bbcrack.py, FLOSS, strdeob.pl | | **运行时解压** | `drtg.exe` | x32dbg, `RtlDecompressBuffer` breakpoint, ScyllaHide | | **进程傀儡** | `WinHost32.exe` | IDA Pro, x32dbg, Memory Map dumping | | **反沙箱(鼠标钩子)** | `vbprop.exe` | IDA Pro, `SetWindowsHookExA` analysis | | **基于连接的规避** | `winhost32-dumped.exe` | x32dbg, JNE→JMP patching, fakedns | | **工具包检测绕过** | `raas.exe` | x32dbg, ScyllaHide, register manipulation | | **SEH 滥用与脱壳** | `windowsxp2.exe` | x32dbg, stack breakpoints, OllyDumpEx, Scylla | | **TLS 回调反调试** | `lansrv.exe` | x32dbg, hardware breakpoints, manual ECX manipulation | | **内存取证** | `known.exe` | Volatility `malfind`, Process Hacker, pe_unmapper | | **实时注入捕获** | `known.exe` | Dual x32dbg instances, Thread Entry breakpoints | | **IAT 重构** | `yep.exe`, `windowsxp2.exe` | Scylla, pe_unmapper, OllyDumpEx | ## 前置条件 ### 实验室环境 | 组件 | 用途 | |-----------|---------| | **Windows REM Workstation** | 运行恶意软件样本的目标系统 | | **REMnux VM** | 用于静态分析和字符串解码的 Linux 工具包 | | **x64dbg / x32dbg** | 动态调试和实时 patching | | **IDA Pro** | 静态反汇编和交叉引用分析 | | **PeStudio** | PE 结构验证和导入分析 | | **Process Hacker** | 实时内存检查和提取 | | **ProcDOT** | 进程行为可视化 | | **Volatility** | 对内存转储进行取证 | ### 关键工具安装 **REMnux(预安装):** - `xorsearch` - `brxor.py`, `bbcrack.py` - `strdeob.pl` - `floss` - `pescanner.py` - `vol.py` **Windows:** - [x64dbg](https://x64dbg.com/) - [IDA Pro](https://hex-rays.com/ida-pro/) - [PeStudio](https://www.winitor.com/) - [Process Hacker](https://processhacker.sourceforge.io/) - [ProcDOT](https://www.procdot.com/) - `pe_unmapper` (Rekall 框架的一部分) ## 快速开始 ### 1. 绕过调试器检测 ``` ; Locate in x64dbg via Search for > Current Region > Intermodular calls call qword ptr ds:[<&IsDebuggerPresent>] test eax, eax jne getdown.140001216 ; <-- patch this to NOPs ``` **Patch:** 选择 `JNE` → 空格键 → `NOP` → 启用 "Fill with NOP's" → OK。 ### 2. 通过 RtlDecompressBuffer 脱壳 ``` # 静态 recon floss drtg.exe > drtg-floss.txt # 在 x32dbg 中: SetBPX RtlDecompressBuffer # 运行,跟随 UncompressedBuffer,当出现 MZ 时 dump 内存区域 ``` ### 3. 进程傀儡提取 ``` ; Breakpoint at WriteProcessMemory in x32dbg ; Follow lpBuffer in Dump → MZ header confirms payload ; Memory Map → Dump Memory to File → winhost32-dumped.exe ``` ### 4. 修复 Dump 出的文件 ``` # 修复 base address pe_unmapper yep-dumped.exe 400000 yep-dumped-fixed.exe # 修复 import(在 x32dbg 内) Plugins > Scylla > IAT Autosearch > Get Imports > Fix Dump ``` ## 关键技术解析 ### 进程傀儡模式 ``` CreateProcessA("legit.exe", ..., CREATE_SUSPENDED) ↓ NtUnmapViewOfSection(hollowed_process) ↓ VirtualAllocEx(hollowed_process, ..., PAGE_EXECUTE_READWRITE) ↓ WriteProcessMemory(hollowed_process, payload_buffer) ↓ ResumeThread(hollowed_process) ``` **拦截点:** 在 `WriteProcessMemory` 上设置断点。`lpBuffer` 参数指向未压缩的 payload。 ### 反调试“千层饼” | 层级 | 技术 | 检测方法 | |-------|-----------|----------------| | 1 | `IsDebuggerPresent` | PEB.BeingDebugged flag | | 2 | `NtQueryInformationProcess` (class 7) | Debug port number | | 3 | `CheckRemoteDebuggerPresent` | 外部调试器检测 | | 4 | `FindWindowW` | 调试器窗口标题 | | 5 | `GetModuleHandleW` | 安全工具 DLL | | 6 | `CreateToolhelp32Snapshot` | 枚举运行中的进程 | | 7 | `KdDebuggerEnabled` | 内核调试器标志 | | 8 | TLS callbacks | 前置入口点执行 | | 9 | Timing checks | `rdtsc`, `QueryPerformanceCounter` | ### 用于控制流的 SEH 操纵 恶意软件设置一个虚假的异常处理程序,然后故意引发异常。这个“处理程序”实际上是真正的 payload 入口点: ``` push offset real_payload_entry ; 519870 push dword ptr fs:[0] ; previous SEH mov dword ptr fs:[0], esp ; register new SEH ; ... cause access violation ... ; Windows calls 519870 — our real code ``` **反制技术:** 在处理程序地址上设置硬件断点并强制进入异常路径。 ## 结果与发现 ### 提取的 IOC | 样本 | IOC 类型 | 值 | |--------|----------|-------| | `getdown.exe` | C2 IP | `1.234.27.146:80` | | `getdown.exe` | Affiliate ID | *(通过 XOR 0x83 解码)* | | `hubert.dll` | Registry Key | 伪造的 AV 相关路径 | | `winhost32-dumped.exe` | C2 Domains | `callereb.com`, `supketwron.ru` | | `known.exe` | C2 Domains | `.onion` 地址 | ### 验证脱壳后的 Payload | 样本 | Dump 出的文件 | PE 有效 | 暴露的字符串 | IAT 已修复 | |--------|-------------|----------|-----------------|-----------| | `drtg.exe` | `drtg-dumped.exe` | ✅ | ✅ | 手动 | | `WinHost32.exe` | `winhost32-dumped.exe` | ✅ | ✅ | 手动 | | `windowsxp2.exe` | `windowsxp2_dump_SCY.exe` | ✅ | ✅ | Scylla | | `yep.exe` | `yep-dumped-fixed_SCY.exe` | ✅ | ✅ | Scylla | | `known.exe` | `explorer-dumped-fixed.exe` | ✅ | ✅ | pe_unmapper | ## 经验总结 1. **反调试绝不是单一的检查。** 最偏执的样本会叠加 `IsDebuggerPresent`、`NtQueryInformationProcess`、窗口枚举、模块枚举、进程枚举和内核标志检查。ScyllaHide 可以捕获大多数情况,但有时仍需要手动 patching。 2. **脱壳在于预判 API。** 在 `VirtualProtect`、`WriteProcessMemory`、`RtlDecompressBuffer` 和意外的 `LoadLibraryA` 调用上设置断点。这些是 payload 即将被揭示或执行的信号。 3. **字符串混淆简单但无处不在。** 单字节 XOR、栈字符串和运行时构造是常态。FLOSS 和 `strdeob.pl` 能捕获很多内容,但手动检查 IDA 可以填补空白。 4. **进程傀儡是一种模式,而不是谜团。** `CREATE_SUSPENDED` → `NtUnmapViewOfSection` → `VirtualAllocEx` (RWX) → `WriteProcessMemory`。识别它,并在 `WriteProcessMemory` 处拦截。 5. **SEH 和 TLS 是障眼法层。** 恶意软件会在异常处理程序和 TLS 回调中执行真正的代码——就在你以为程序还没启动之前。务必使用 `pescanner.py` 检查 TLS 回调。 6. **内存取证验证实时分析。** Volatility 的 `malfind` 可以在内存 dump 中找到注入的代码;Process Hacker 可以实时提取。交叉检查两者可以建立信心。 7. **文档将一次性经验转化为技能。** 记录下你为什么在那里设置断点、那个寄存器值意味着什么,以及你是如何 patch 执行流的——正是这些让分析下一个样本变得更容易。 ## 资源与参考 | 资源 | 链接 | |----------|------| | x64dbg | https://x64dbg.com/ | | IDA Pro | https://hex-rays.com/ida-pro/ | | REMnux | https://remnux.org/ | | FLOSS | https://github.com/mandiant/flare-floss | | Volatility | https://www.volatilityfoundation.org/ | | Process Hacker | https://processhacker.sourceforge.io/ | | Scylla | https://github.com/NtQuery/Scylla | | OllyDumpEx | https://low-priority.appspot.com/ollydumpex/ | | ProcDOT | https://www.procdot.com/ | | PEiD | https://www.aldeid.com/wiki/PEiD | ## 免责声明 **所有分析均在隔离的虚拟机(Windows REM Workstation + REMnux)中进行。** 所讨论的样本均为恶意样本。请勿在妥善隔离的实验室环境之外运行。本仓库仅供教育和研究目的使用。 ## 许可证 MIT License — 详情请见 [LICENSE](LICENSE)。 ## 相关文章 📖 [在 Dev.to 上阅读完整文章](https://dev.to/almahmudkhalif/malware-unpacking-anti-analysis-bypass-a-deep-dive-into-real-world-techniques-89a) ## 🌐 与我联系 [![LinkedIn](https://img.shields.io/badge/LinkedIn-Connect-blue?logo=linkedin)](https://www.linkedin.com/in/almahmudkhalif/) [![Dev.to](https://img.shields.io/badge/Dev.to-Articles-black?logo=devdotto)](https://dev.to/almahmudkhalif/)
标签:DAST, DNS 反向解析, DOM解析, SecList, 云资产清单, 内存取证, 反调试, 恶意软件分析, 脱壳解密, 逆向工程