逆向工程实战:通过硬件断点提取恶意软件中的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. 初始调试设置
- 使用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,为进一步的威胁分析提供关键数据。