利用Ghidra分析恶意软件Emotet
字数 1563 2025-08-05 11:39:26
使用Ghidra分析恶意软件Emotet的详细教学文档
1. 工具和恶意软件简介
1.1 Ghidra简介
Ghidra是由美国国家安全局(NSA)开发的开源逆向工程工具套件,提供反汇编、反编译、脚本编写等功能。主要特点包括:
- 完全免费开源
- 支持多种处理器架构
- 提供Python和Java API
- 内置脚本管理器
- 具有强大的反编译能力
1.2 Emotet简介
Emotet是一种高度复杂的银行木马恶意软件,特点包括:
- 最初于2014年被发现
- 主要通过垃圾邮件传播
- 具有模块化结构
- 使用多种反分析技术
- 不断更新进化
2. 分析准备工作
2.1 创建Ghidra项目
- 启动Ghidra
- 选择"File" > "New Project"
- 创建名为"Emotet"的项目
- 通过"File" > "Import File"导入样本文件
2.2 初始分析设置
- 双击文件名在CodeBrowser中打开
- 在Symbol Tree窗口(Window > Symbol Tree)中过滤"entry"找到入口点
- 熟悉Ghidra界面:
- 左侧:符号树、函数列表
- 中间:反汇编视图(Listing)
- 右侧:反编译视图(Decompile)
3. 分析加密字符串
3.1 识别字符串解密函数
- 在反汇编视图中查找可疑函数调用
- 识别出位于0x00401b70的字符串解密函数
- 重命名函数为"decode_strings"(右键 > Edit Label)
3.2 解密函数分析
函数特征:
- 参数1(ECX):加密字符串偏移量
- 参数2(EDX):XOR密钥
- 返回值(EAX):解密后字符串的堆内存地址
解密算法:
- 第一个DWORD与密钥异或得到字符串长度
- 后续DWORD与密钥异或得到实际字符串内容
3.3 自动化解密脚本
使用Ghidra Python脚本自动解密字符串:
from ghidra.program.model.symbol import SourceType
from ghidra.program.model.listing import CodeUnit
# 查找所有引用decode_strings的地方
refs = getReferencesTo(toAddr(0x00401b70))
for ref in refs:
# 获取引用位置
from_addr = ref.getFromAddress()
# 向前查找MOV ECX和MOV EDX指令
# 这里需要实现查找逻辑...
# 获取加密字符串和密钥
# 实现解密逻辑...
# 添加注释
cu = currentProgram.getListing().getCodeUnitAt(from_addr)
cu.setComment(CodeUnit.EOL_COMMENT, decrypted_str)
# 修补二进制
# 实现修补逻辑...
完整脚本见:ghidra_emotet_decode_strings.py
4. 分析API哈希解析
4.1 识别API解析函数
- 查找处理API哈希的函数(位于0x401230)
- 重命名为"decodeAPINames"
4.2 解析机制分析
- 获取DLL句柄:
- kernel32.dll和ntdll.dll通过PEB枚举获取
- 其他DLL通过LoadLibraryW加载(名称已加密)
- 读取DLL导出表
- 计算每个API名称的哈希值
- 与传入哈希比较,匹配则保存API地址
4.3 自动化解析脚本
-
准备DLL导出函数列表:
- 为每个DLL创建导出函数列表文件
- 如kernel32.list、ntdll.list等
-
使用Python脚本解析哈希:
# 查找所有引用decodeAPINames的地方
refs = getReferencesTo(toAddr(0x00401230))
for ref in refs:
from_addr = ref.getFromAddress()
# 确定处理的是哪个DLL
# 实现DLL识别逻辑...
# 加载对应的API列表文件
with open(dll_name + ".list") as f:
apis = f.read().splitlines()
# 计算每个API的哈希并比较
# 实现哈希计算和比较逻辑...
# 标记解析出的API名称
# 实现标记逻辑...
完整脚本见:ghidra_emotet_decode_hash.py
5. 实用技巧
5.1 使用脚本管理器
- 通过工具栏图标或Window > Script Manager打开
- 可以运行、管理和创建脚本
- 提供大量示例脚本
5.2 常用操作
- 重命名符号:右键 > Edit Label 或按L
- 添加注释:右键 > Comments 或按;
- 查看交叉引用:右键 > References
- 创建可重复注释:右键 > Comments > Set Repeatable Comment
5.3 调试技巧
- 结合Ollydbg或WinDbg动态分析
- 使用Ghidra的静态分析与动态调试互补
- 对复杂函数先在调试器中运行理解功能
6. 总结
本教程详细介绍了使用Ghidra分析Emotet恶意软件的关键技术:
- 识别并自动化解密XOR加密的字符串
- 解析API名称哈希并还原实际API调用
- 利用Ghidra脚本提高分析效率
- 结合静态和动态分析技术
通过掌握这些技术,分析人员可以更高效地分析Emotet及其他使用类似混淆技术的恶意软件。