nguyenduchuywork23-sudo/Malware_Analysis_Tesla

GitHub: nguyenduchuywork23-sudo/Malware_Analysis_Tesla

一份完整的恶意软件逆向分析报告,详细记录了从 NSIS 外壳脱壳到核心 Shellcode 提取及多层混淆机制剖析的全过程。

Stars: 0 | Forks: 0

# 恶意软件分析报告 ## I. 环境与工具 - **初步识别与静态分析:** Detect It Easy v3.10 - **进程与内存空间监控:** System Informer - **网络流量模拟与监控:** INetSim - **逆向工程 (Disassembler/Decompiler):** Ghidra - **动态调试器 (Debugger):** x32dbg ## II. 阶段 1:静态分析 (STATIC ANALYSIS) - 外壳层 ### 1. 文件信息 - **格式:** PE32 - **架构 (Architecture):** 32-bit - **编译器 (Compiler):** Microsoft Visual C/C++ - **语言 (Language):** C - **打包器/安装程序 (Installer):** Nullsoft Scriptable Install System (3.11) [lzma] - **Overlay 数据:** 存在 (NSIS data) ### 2. 初步技术分析 #### 2.1. 架构与语言分析 - 文件结构属于 PE32 格式。调试过程需要使用 32 位调试器 (x32dbg),排除了 x64dbg。 - 文件使用 C/C++ 编译,未使用 .NET 平台。逆向过程排除了 dnSpy 工具,因为架构不兼容。 #### 2.2. 打包器/安装程序分析 - 分析的文件具有 Dropper/Wrapper 的特征,不包含原始的 payload 代码。 - 文件结构集成了 Nullsoft NSIS 安装程序来封装 payload。Payload 使用 LZMA 算法压缩,并存储在 Overlay 分区中。 - 文件的执行过程将触发以下指令链:从 Overlay 区域解压数据,将 payload 释放 (drop) 到系统中并启动该 payload 文件。 ![使用 Detect It Easy 的分析结果](https://raw.githubusercontent.com/nguyenduchuywork23-sudo/Malware_Analysis_Tesla/main/../Screenshot%202026-07-31%20202839.png) ## III. 阶段 2:动态分析 (DYNAMIC ANALYSIS) - 解包与提取 ### 1. 解包过程与反调试 (Anti-Debugging) 机制 #### 2.1. 表面与入口点 (Entry Point) 静态分析 - **操作:** 将可执行文件加载到 x32dbg 调试器中。跳过系统断点 (System Breakpoint) 以到达原始入口点 (Original Entry Point, OEP)。 - **收集的数据:** 在 OEP 处,内存中包含静态字符串:`"Error writing temporary file. Make sure your temp folder is valid."` - **结论:** 可执行文件使用 NSIS 安装程序结构作为外壳 (Wrapper/Dropper)。 ![OEP 处的 NSIS 标识字符串](https://raw.githubusercontent.com/nguyenduchuywork23-sudo/Malware_Analysis_Tesla/main/../images/proofnsis.png) #### 1.2. 监控内存分配 API - **目标:** 确定 RAM 上分配的用于包含 Payload 的内存区域。 - **操作:** - 在 API `VirtualAlloc` 处设置软件断点 (Software Breakpoint) (`bp VirtualAlloc`)。 - 继续运行进程 (Run)。 - **结果:** 进程在调用 `VirtualAlloc` 函数时停止。 - **下一步操作:** 执行直至返回 (Execute till return) 并步过 (Step Over) 指令。检查 `EAX` 寄存器中的返回值。 - **收集的数据:** `EAX` 寄存器包含新分配内存区域的基地址。检查内存 (Follow in Dump) 确认该区域值为 `00`,并在首字节包含部分 NSIS System 插件的 Metadata。 ![从 EAX 寄存器引用的已分配空内存地址](https://raw.githubusercontent.com/nguyenduchuywork23-sudo/Malware_Analysis_Tesla/main/../images/clean_ram.png) #### 1.3. 反调试机制分析 (SEH Manipulation) - **目标:** 在数据写入已分配内存时提取 Payload。 - **操作:** 在刚确定的空内存区域设置写入 (Write) 类型、Dword (4 bytes) 大小的硬件断点 (Hardware Breakpoint)。继续执行进程。 - **结果:** 硬件断点未被触发。进程引发了异常 (Exception)。 - **收集的数据 (异常 1):** - 调试器记录了 First chance exception:`EXCEPTION_ACCESS_VIOLATION` (错误代码:`C0000005`)。 - 引发异常的指令:`mov dword ptr ds:[edi], edi`。寄存器 `EDI` 包含无效的内存地址。 - **机制结论:** 恶意软件执行错误的内存写入指令,以触发结构化异常处理 (SEH - Structured Exception Handling) 机制。这是一种基于进程异常处理响应来检测调试器的技术。 ![引发错误的指令代码与 First chance exception 报告标志](https://raw.githubusercontent.com/nguyenduchuywork23-sudo/Malware_Analysis_Tesla/main/../images/EXCEPTION_ACCESS_VIOLATION.png) - **下一步操作:** 忽略异常 (Pass Exception) 以将异常处理权交还给进程。 - **收集的数据 (异常 2):** 调试器记录了 Last chance exception:`STATUS_USER_CALLBACK_EXCEPTION`。 - **最终状态:** 进程终止执行 (Process Terminated)。通过硬件断点监控的区域未记录到 Payload 数据。 ![Last chance exception 报告标志与测试执行结束状态](https://raw.githubusercontent.com/nguyenduchuywork23-sudo/Malware_Analysis_Tesla/main/../images/destroy_process_callback.png) ### 2. 独立进程监控 动态分析过程转向使用专门的工具 (Process Hacker / System Informer) 在操作系统环境中监控独立进程,以绕过之前的反调试机制。 #### 2.1. 初步网络行为分析 - **操作:** 终止 x32dbg 上的调试会话并独立执行样本。启动 INetSim 工具模拟响应 TLS/SSL 证书的服务器。 - **收集的数据:** 系统记录了有关证书不匹配的“安全警报”。 - **结论:** 进程启动后立即执行了网络连接 (C2 Callback) 的函数调用。 ![被 INetSim 拦截的网络连接](https://raw.githubusercontent.com/nguyenduchuywork23-sudo/Malware_Analysis_Tesla/main/../images/image_159678.png) #### 2.2. 内存空间 (Memory Space) 探测 - **操作:** 使用 System Informer 监控进程。执行静态字符串搜索 (Strings search) 技术,使用 DOS Stub 的特征关键字 (`This program cannot be run`)。 - **收集的数据:** 查询返回了 65 个结果。所有这些结果的 Base Address 都指向原始外壳的内存 (`0x400000`) 以及 Windows 的标准动态链接库 (DLL) (`0x6...`, `0x7...`)。 - **结论:** 解压后的 Payload 不以原始可执行文件 (PE file) 的形式存在 (不包含 DOS Header)。该对象使用了清除标头 (Wipe PE Header) 技术或直接加载 Shellcode,以规避字符串扫描机制。 #### 2.3. Payload 提取 (Memory Dump) - **操作:** 根据大小和保护属性 (Protection) 过滤并检查进程的内存分区列表。 - **收集的数据:** 系统记录了一个动态分配的内存分区,大小为 31.96 MB,具有 `RWX` (Read/Write/Execute) 属性。检查该分区的 Base Address 显示起始字节为 `E9` (Assembly 中 `JMP` 指令的 Opcode)。 - **结论:** `RWX` 内存分区结合起始字节 `E9` 是 Shellcode 执行空间特征结构的标志。该内存区域被确定为包含恶意软件核心功能 (Payload) 的位置。 ![具有 RWX 权限的 31.96 MB 内存分区](https://raw.githubusercontent.com/nguyenduchuywork23-sudo/Malware_Analysis_Tesla/main/../images/dump31mb_rwx.png) - **下一步操作:** 提取 (dump) 该 31.96 MB 分区的所有数据,并保存为 `shellcode_payload.bin` 文件,以便用于后续的静态分析步骤。 ![Base Address 处带有 JMP Opcode (E9) 的 Shellcode 数据](https://raw.githubusercontent.com/nguyenduchuywork23-sudo/Malware_Analysis_Tesla/main/../images/shellcode_memory_dump.png) ## IV. 阶段 3:静态分析 (STATIC ANALYSIS) - 剖析恶意软件核心 (SHELLCODE) ### 1. 初始化静态分析环境 - **工具:** Ghidra - **操作:** 将原始二进制数据块 (`shellcode_payload.bin`) 加载到工作区。设置文件加载参数 (Import Format) 和处理器结构为 `x86:LE:32:default:windows` 格式 (x86 架构,Little Endian,32 位,Windows 编译器)。特别地,**跳过自动分析过程 (Auto Analyze)**,以防止系统错误识别入口点 (Entry Point)。 - **结果:** 数据成功映射到 CodeBrowser 模块的虚拟内存空间中,从基地址 `0x00000000` 开始。 ![在 Ghidra 上配置 Shellcode (Raw Binary) 逆向参数](https://raw.githubusercontent.com/nguyenduchuywork23-sudo/Malware_Analysis_Tesla/main/../images/setting_ghidra.png) ### 2. 数据验证与收集失陷指标 (IoC) - **操作:** 通过 Ghidra 的 "Import Results Summary" 对话框确认文件加载成功。 - **收集的数据:** Ghidra 自动计算并提取了 `payload.bin` 文件的哈希值。这些是极其重要的失陷指标 (Indicators of Compromise - IoC),用于在威胁情报 系统上识别恶意核心: - **MD5:** `05c958ec9f79091f582d9b7ee2c20da4` - **SHA256:** `79c48473073d43d36bf4b9c93125ccc9894b4107eb9e7f547ab30eb0df08e235` - **结论:** Shellcode 文件已成功以 Raw Binary 格式和 x86 (Little Endian) 架构加载到工作区。 ![在 Ghidra 上的文件加载结果与哈希值](https://raw.githubusercontent.com/nguyenduchuywork23-sudo/Malware_Analysis_Tesla/main/../images/import_result.png) ### 3. 初始化控制流 (Initial Control Flow) 分析 - **操作:** 在基地址 `0x00000000` 处手动执行强制反汇编 (Force Disassembly)。 - **收集的数据:** - 基地址处的起始字节记录为 `66` (而不是动态分析过程中记录的 `E9`)。 - 输出的汇编 (Assembly) 代码块包含前 3 条算术指令:`PCMPGTD`, `PADDUSB`, `PADDSW`。 - 就在地址 `0x0000000a` 处,控制流遇到了无条件跳转指令:`JMP LAB_00000055`。 - **结论:** - 初始算术指令集具有垃圾代码 (Junk Code) 的特征。插入这种技术的目的是为了混淆 控制流,并绕过安全软件的静态签名识别机制。 - `JMP` 指令起到了中断线性控制流的作用,将指令指针 (EIP) 重定向越过垃圾代码区,跳转至 `0x00000055` 处真正的核心指令分区。 ![初始 Assembly 指令集与越过 Junk Code 的 JMP 跳转指令](https://raw.githubusercontent.com/nguyenduchuywork23-sudo/Malware_Analysis_Tesla/main/../images/jump.png) ### 4. 跳转点 (0x00000055) 处的指令块分析 - **操作:** 将分析指针移动到从前一个跳转指令引用 (XREF) 的标签 `LAB_00000055` (地址 `0x00000055`)。执行强制 Assembly 反汇编。 - **收集的数据:** - 在地址 `0x00000055`,执行的第一条指令是 `AND EAX, EAX`。 - 紧接着调用了 `PMULHW MM0, MM5` 指令。 - 就在地址 `0x0000005a` 处,控制流再次遇到另一条无条件跳转指令:`JMP LAB_0000006e`。 - 从地址 `0x0000005c` 开始,Ghidra 无法插值出有效的 Assembly 代码 (显示为 `??` 符号以及诸如 `C3h`, `E1h` 的垃圾字节)。 - **结论:** - 与 Entry Point 类似,`0x00000055` 处的代码区继续使用了 Obfuscation (混淆) 技术。诸如 `AND EAX, EAX` 和 `PMULHW` 之类的指令在逻辑上没有意义,它们扮演着空指令 (NOP Sled) 或垃圾代码的角色,旨在欺骗静态分析算法。 - `JMP LAB_0000006e` 指令表明该对象继续将真正的控制流隐藏到另一个地址 (0x0000006e)。跳转指令之后紧接着存在垃圾字节块 (从 0x0000005c 开始),这证实了该 Shellcode 经过了多层加密/混淆的假设。 ![LAB_00000055 处的 Assembly 代码与混淆技术分析](https://raw.githubusercontent.com/nguyenduchuywork23-sudo/Malware_Analysis_Tesla/main/../images/afterjump.png) ### 5. Shellcode 中的规避技术 (Evasion Techniques) 分析 - **操作:** 跨越离散的内存分区追踪控制流字符串 (从 `LAB_00000055` 到 `LAB_000000f8`)。 - **收集的数据:** - 控制流被一系列无条件跳转指令 (JMP) 高度碎片化。 - 跳转指令之间的空间被对程序逻辑毫无贡献的 SIMD/MMX 算术指令集 (如 `PUNPCKHBW`, `PSUBW`, `PSUBD`) 填充。 - 核心数据的初始化过程分散进行的:`MOV EDI, 0x5744fc15` 指令 (位于 `0x0000006e`) 结合了 `ROL EDI, 0x5` 指令 (位于 `0x000000c2`)。 - **结论:** - 恶意软件样本使用了 **Spaghetti Code** (碎片化跳转指令链) 结合 **Dead Code Insertion** (插入垃圾代码) 的技术,以破坏 Assembly 流的线性特征。其目的是使静态签名扫描 机制失效。 - 在 `EDI` 寄存器上操作的算法 (`MOV` 结合 `ROL`) 是正在初始化 **API Hashing** (哈希函数) 机制的明显证据,用于解析系统 API 函数而无需使用明文字符串。 - *(参考:下方体现 Jump Chaining 和 Dead Code Insertion 行为的文件证据链)。* ![JMP 链的起始:0x0000000a 处的 JMP 指令指向 LAB_00000055](https://raw.githubusercontent.com/nguyenduchuywork23-sudo/Malware_Analysis_Tesla/main/../images/jump1.png) ![Assembly 混淆技术 (图示 1)](https://raw.githubusercontent.com/nguyenduchuywork23-sudo/Malware_Analysis_Tesla/main/../images/afterjump1.png) ![指令流碎片 2:从 LAB_00000055 继续跳转 (JMP) 指向 LAB_0000006e](https://raw.githubusercontent.com/nguyenduchuywork23-sudo/Malware_Analysis_Tesla/main/../images/jump2.png) ![Assembly 混淆技术 (图示 2)](https://raw.githubusercontent.com/nguyenduchuywork23-sudo/Malware_Analysis_Tesla/main/../images/afterjump2.png) ![指令流碎片 3:连续的 JMP Chaining 与垃圾代码](https://raw.githubusercontent.com/nguyenduchuywork23-sudo/Malware_Analysis_Tesla/main/../images/jump3.png) ![Assembly 混淆技术 (图示 3)](https://raw.githubusercontent.com/nguyenduchuywork23-sudo/Malware_Analysis_Tesla/main/../images/afterjump3.png) ### 6. 解密存根 (Decryptor Stub) 循环与自修改代码 (Self-Modifying Code) 分析 - **操作:** 在使用脚本 `GhidraJmpBypass.java` 扫描规避跳转链后,调查并静态逆向位于地址 `0x00001835` 的目标内存区域。 - **收集的数据:** - 通过向后控制流确认循环结构 (从 `0x00001872` 的 XREF)。 - 指令流包括推进内存指针的操作 (`INC ECX`)。 - 记录了直接交互和修改内存的指令:`XCHG dword ptr [ECX], EBX` (将寄存器内容与内存地址交换)。 - 通过条件分支指令确认循环出口:`JA LAB_0000187e`。 00001835 2b dc SUB EBX,ESP 00001837 a0 89 72 d4 69 MOV AL,[DAT_69d47289] 0000183c 77 40 JA LAB_0000187e 0000183e 41 INC ECX 0000183f 87 19 XCHG dword ptr [ECX],EBX - **结论:** - 这段代码是一个使用 **Self-Modifying Code** (自修改代码) 技术的 **Decryptor Stub** (解密外壳)。 - 恶意软件执行循环,直接将核心 Payload 覆盖、解压或解密到正在执行的内存空间中 (In-memory Decryption),以规避静态分析工具的检测。 - 核心 Payload 的执行点预计位于循环出口地址 `0x0000187e`。 ![自动脚本执行结果:在 0x00001835 处发现循环](https://raw.githubusercontent.com/nguyenduchuywork23-sudo/Malware_Analysis_Tesla/main/../images/final_result_jmp.png) ### 7. 静态分析的局限性与方法论的转换 - **操作:** 评估解密循环出口 (从地址 `0x00001835` 起) 的 Assembly 指令流和 C 伪代码。 - **收集的数据:** - 静态反编译器 返回异常警告:`WARNING: Control flow encountered bad instruction data`。 - 伪代码流出现错误中断函数 `halt_baddata();`。 - Assembly 分析器 在地址 `0x00001841` 处标记了结构错误。 - **结论:** - 由于 **Self-Modifying Code** 的特性,静态分析技术已达到极限。当前的内存数据块尚未被解密,导致反汇编器 错误地将垃圾数据编译成了指令集。 - 必须将流程转换为 **模拟执行** 或 **动态调试** 方法,以迫使恶意软件在虚拟内存中自动完成外壳解密 过程。 ![静态分析的局限性:Ghidra Decompiler 显示 Bad Instruction 错误](https://raw.githubusercontent.com/nguyenduchuywork23-sudo/Malware_Analysis_Tesla/main/../images/limited_ofstatic.png) ### 8. Shellcode 的反模拟 (Anti-Emulation) 技术 - **操作:** 通过模拟器 `scdbg` (Libemu) 启动二进制代码块的动态分析。 - **收集的数据:** - 模拟器在第一步执行 (`step: 0`) 时突然停止。 - 错误信息记录了指令集异常:`opcode 0f 66 not supported`。 - Terminal 上的详细执行日志: C:\Users\malware\Desktop\malware\43e7...94a>scdbg.exe -f payload.bin -s -1 Loaded 1ff5000 bytes from file payload.bin Initialization Complete.. Max Steps: -1 Using base offset: 0x401000 0 opcode 0f 66 not supported 0 ???? No memory At Address step: 0 foffset: 0 eax=0 ecx=0 edx=0 ebx=0 esp=12fe00 ebp=12fff0 esi=0 edi=0 EFL 0 Stepcount 0 - **结论:** - 恶意软件应用了复杂的 **Anti-Emulation** (反模拟) 技术。将 SIMD/MMX 指令集 (如 `PCMPGTD` - 对应 opcode `0F 66`) 插入到执行链中,旨在利用常见的 Shellcode 模拟器 (如 Libemu) 不支持扩展指令集的弱点。 - 结果,自动化分析过程在第一步就被“击垮”,彻底阻止了 Sandbox 系统提取 API call。 ![启动 BlobRunner 将 Shellcode 加载到内存以准备动态调试](https://raw.githubusercontent.com/nguyenduchuywork23-sudo/Malware_Analysis_Tesla/main/../images/blobruner.png) ### 9. 动态调试参数配置 (Dynamic Debugging Setup) - **操作:** 使用 `BlobRunner` 工具分配虚拟内存并加载原始字节串 (Shellcode) 以准备调试环境。 - **收集的数据:** - 加载器 返回分配参数:`|-Base: 0x03600000`。这是操作系统为包含恶意代码的内存区域分配的基地址。 - 对比静态分析过程 (阶段 3),解密循环的出口 (核心 Payload 的 Entry Point) 记录在偏移量 为 `0x187e` 处。 - **结论:** - 核心 Payload 在 RAM 内存上的实际绝对地址 通过基本数学运算提取得出:`0x03600000 (Base) + 0x187e (Offset) = 0x0360187e`。 - 需要在调试器 (x32dbg) 中的地址 `0x0360187e` 处设置断点 (硬件/软件)。此操作旨在内存解密 完成时立即拦截 控制流,从而转储 核心 Payload 的全部内容。 ![在 x32dbg 上于目标地址 (0x0360187e) 设置断点](https://raw.githubusercontent.com/nguyenduchuywork23-sudo/Malware_Analysis_Tesla/main/../images/first_breakpoint.png) ### 10. 反分析规避机制 (Anti-Analysis Evasion) 评估 - **操作:** - 在 x32dbg 上部署 `ScyllaHide` 插件 (配置 Profile:VMProtect/Themida;针对 `NtGetContextThread` 和 `NtSetContextThread` 函数补充 hook)。 - 在解密循环的目标地址处的调试寄存器上设置硬件断点,取决于分配的基地址,例如 `0x02EE187E`)。 - 授予 `BlobRunner.exe` 进程的线程 继续执行的权限。 - **观察数据:** - x32dbg 界面记录进程状态转为 "Terminated" (已终止)。 - 在 EIP 寄存器达到设置硬件断点的地址之前,执行流自动中断。 - 在进程终止之前,调试器没有捕获到任何异常。 - **技术分析:** - 收集到的数据显示,在用户态 空间的 API Hooking 机制 (通过 ScyllaHide 作用于如 `ntdll.dll` 等系统 DLL) 无法阻止恶意代码的自毁逻辑。 - 在尚未提取到退出函数 调用分支处的具体 Assembly 指令流时,进程自动终止的现象可能源于以下规避机制 (按可行性程度排序): 1. **直接内核通信:** Shellcode 执行机器码 `syscall`/`sysenter` 将系统中断直接下推至 Kernel-Mode,从而绕过调试器在 User-Mode 层的 hook 点。 2. **执行时间测量:** 使用硬件指令 (如 `RDTSC`) 计算 CPU 周期的增量,从而检测由手动调试过程引起的延迟。 3. **内部异常处理:** 主动制造内存分配错误 (或除零错误) 以便操作系统返回 `CONTEXT` 结构。Shellcode 在内部级别自行分析此结构,在 ScyllaHide 进行干预之前读取 `DR0-DR7` 寄存器的状态。 4. **环境检查:** Shellcode 查询虚拟机的标识信息 (MAC 地址、VMWare/VirtualBox 的注册表键) 或通过不在默认监视列表中的 API 函数探测进程列表 (`x32dbg.exe`)。 ![失败的调试过程:进程在触及断点前被终止](https://raw.githubusercontent.com/nguyenduchuywork23-sudo/Malware_Analysis_Tesla/main/../images/antide-bug_proof.png)
标签:DAST, DNS 反向解析, JS文件枚举, 云安全监控, 云资产清单, 域名枚举, 安全研究报告, 恶意软件分析, 网络信息收集, 逆向工程, 静态分析