逆向工程实战:通过硬件断点提取恶意软件中的shellcode并分析
字数 1562 2025-08-19 12:41:03

逆向工程实战:通过硬件断点提取并分析恶意软件中的Shellcode

前言

在恶意软件分析过程中,经常会遇到恶意软件在内存中加载Shellcode的行为。本文将详细介绍如何通过硬件断点技术提取恶意软件中的Shellcode并进行深入分析。

前置知识

硬件断点

硬件断点(Hardware Breakpoint)是一种由处理器提供的调试功能,特点包括:

  • 不依赖代码中插入特殊指令(如INT 3)
  • 利用处理器的调试寄存器(x86架构中的DR0-DR7)
  • 可以监控内存地址的读写操作
  • 数量有限(通常4-6个)

关键Windows API函数

VirtualAlloc

  • 功能:在进程虚拟地址空间中分配内存
  • 恶意软件用途:为解压后的代码或数据预留空间
  • 重要参数:可指定内存大小和属性(可读、可写、可执行)

VirtualProtect

  • 功能:更改内存区域的保护属性
  • 恶意软件用途:动态调整内存权限(如从可写改为可执行)
  • 常见模式:先以可写方式存储代码,执行前改为可执行

实战分析

样本信息

  • 文件类型:64位DLL
  • 关键导出函数:DllRegisterServer(Shellcode加载点)
  • 哈希值:
    • SHA256: 08ec3f13e8637a08dd763af6ccb46ff8516bc46efaacb1e5f052ada634a90c0e
    • MD5: 95cfc3dd3c9ac6713202be2fbc0ffd2d
    • SHA1: 66dc4ca8d51d03c729d70b888bc57fec44738f0d

分析步骤

1. 初始调试设置

  1. 使用x64dbg加载DLL
  2. 直接运行到EntryPoint
  3. 跳转到导出函数DllRegisterServer(设置新的RIP位置)

2. 设置API断点

  1. 在kernelbase.VirtualAlloc设置断点(bp kernelbase.VirtualAlloc)
  2. F9运行到断点处
  3. Ctrl+F9运行到函数返回
  4. 观察RAX寄存器,包含新分配缓冲区的地址

3. 硬件断点设置

  1. 在内存窗口显示RAX指向的缓冲区
  2. 右键缓冲区第一个字节,设置硬件断点(访问断点)
  3. F9运行,程序将在填充缓冲区时中断
  4. Ctrl+F9运行到函数返回,完成缓冲区填充

4. Shellcode提取

  • 方法1:从内存窗口复制十六进制数据
  • 方法2:直接在调试器中分析

Shellcode分析方法

1. CyberChef分析

  1. 复制Shellcode的十六进制数据
  2. 在CyberChef中进行各种解码操作(常用功能:ROT13、XOR解密等)

2. Speakeasy模拟器

  1. 将Shellcode保存为shellcode.bin
  2. 使用Mandiant的Speakeasy二进制模拟器执行分析
  3. GitHub地址:https://github.com/mandiant/speakeasy

3. x64dbg动态分析

  1. 在Shellcode起始处设置新的RIP
  2. 进入第一个call指令
  3. 对所有"call rbp"指令设置断点
  4. 多次运行后可能获取C2域名等关键信息

API哈希解析技巧

  1. 查找"call rbp"前一条指令中的哈希值
  2. 常见哈希算法:ROT13(0xD=13)
  3. 分析Shellcode如何遍历TEB/PEB表并计算API哈希

关键技巧总结

  1. 硬件断点优势:相比软件断点更难被恶意软件检测
  2. 内存监控时机:在VirtualAlloc分配后、代码执行前设置断点
  3. Shellcode提取:关注内存填充过程,特别是权限变更时
  4. 动态分析:结合多种工具验证分析结果
  5. API解析:通过哈希算法识别Shellcode调用的API

通过以上方法,可以有效提取和分析恶意软件中的Shellcode,为进一步的威胁分析提供关键数据。

逆向工程实战:通过硬件断点提取并分析恶意软件中的Shellcode 前言 在恶意软件分析过程中,经常会遇到恶意软件在内存中加载Shellcode的行为。本文将详细介绍如何通过硬件断点技术提取恶意软件中的Shellcode并进行深入分析。 前置知识 硬件断点 硬件断点(Hardware Breakpoint)是一种由处理器提供的调试功能,特点包括: 不依赖代码中插入特殊指令(如INT 3) 利用处理器的调试寄存器(x86架构中的DR0-DR7) 可以监控内存地址的读写操作 数量有限(通常4-6个) 关键Windows API函数 VirtualAlloc 功能:在进程虚拟地址空间中分配内存 恶意软件用途:为解压后的代码或数据预留空间 重要参数:可指定内存大小和属性(可读、可写、可执行) VirtualProtect 功能:更改内存区域的保护属性 恶意软件用途:动态调整内存权限(如从可写改为可执行) 常见模式:先以可写方式存储代码,执行前改为可执行 实战分析 样本信息 文件类型:64位DLL 关键导出函数:DllRegisterServer(Shellcode加载点) 哈希值: SHA256: 08ec3f13e8637a08dd763af6ccb46ff8516bc46efaacb1e5f052ada634a90c0e MD5: 95cfc3dd3c9ac6713202be2fbc0ffd2d SHA1: 66dc4ca8d51d03c729d70b888bc57fec44738f0d 分析步骤 1. 初始调试设置 使用x64dbg加载DLL 直接运行到EntryPoint 跳转到导出函数DllRegisterServer(设置新的RIP位置) 2. 设置API断点 在kernelbase.VirtualAlloc设置断点(bp kernelbase.VirtualAlloc) F9运行到断点处 Ctrl+F9运行到函数返回 观察RAX寄存器,包含新分配缓冲区的地址 3. 硬件断点设置 在内存窗口显示RAX指向的缓冲区 右键缓冲区第一个字节,设置硬件断点(访问断点) F9运行,程序将在填充缓冲区时中断 Ctrl+F9运行到函数返回,完成缓冲区填充 4. Shellcode提取 方法1:从内存窗口复制十六进制数据 方法2:直接在调试器中分析 Shellcode分析方法 1. CyberChef分析 复制Shellcode的十六进制数据 在CyberChef中进行各种解码操作(常用功能:ROT13、XOR解密等) 2. Speakeasy模拟器 将Shellcode保存为shellcode.bin 使用Mandiant的Speakeasy二进制模拟器执行分析 GitHub地址:https://github.com/mandiant/speakeasy 3. x64dbg动态分析 在Shellcode起始处设置新的RIP 进入第一个call指令 对所有"call rbp"指令设置断点 多次运行后可能获取C2域名等关键信息 API哈希解析技巧 查找"call rbp"前一条指令中的哈希值 常见哈希算法:ROT13(0xD=13) 分析Shellcode如何遍历TEB/PEB表并计算API哈希 关键技巧总结 硬件断点优势 :相比软件断点更难被恶意软件检测 内存监控时机 :在VirtualAlloc分配后、代码执行前设置断点 Shellcode提取 :关注内存填充过程,特别是权限变更时 动态分析 :结合多种工具验证分析结果 API解析 :通过哈希算法识别Shellcode调用的API 通过以上方法,可以有效提取和分析恶意软件中的Shellcode,为进一步的威胁分析提供关键数据。