Ghidra密码学:加密算法识别与逆向全指南
加密算法逆向的痛点与解决方案
你是否曾面对以下困境:二进制文件中隐藏的加密算法难以识别?手动逆向哈希函数耗时费力?加密常量与密钥定位如同大海捞针?本文将系统讲解如何利用Ghidra的字节模式匹配、函数特征识别和反编译增强三大核心能力,构建自动化加密算法识别流程。通过本文,你将掌握:
- 10种常见加密算法的Ghidra识别模式
- 自定义字节模式规则编写方法
- 函数特征库(FunctionID)的实战应用
- 反编译窗口中的算法行为分析技巧
- 完整Python脚本实现自动识别与标注
Ghidra密码学分析核心功能解析
字节模式匹配(BytePatterns)
Ghidra的BytePatterns功能通过二进制特征码识别加密算法,其工作原理如下:
内置加密算法特征已覆盖:
- AES(轮密钥加、字节替换操作)
- DES(Feistel网络结构)
- SHA系列(常量初始化序列)
- MD5(FF函数特征码)
函数特征识别(FunctionID)
FunctionID通过函数原型、控制流图和指令序列三重特征识别加密函数:
// 简化的AES识别逻辑示例
public boolean isAESFunction(Function func) {
return hasByteSubstitution(func) &&
hasShiftRows(func) &&
containsConstant(func, 0x637C777BF26B6FC5);
}
Ghidra默认提供200+加密相关函数特征,支持用户扩展自定义特征库。
反编译增强(Decompiler)
反编译窗口提供高级静态分析能力,可通过以下特征识别加密算法:
- 大量位运算(异或、移位)
- 固定大小缓冲区操作(如16字节AES块)
- 特定常量引用(如SHA-256初始哈希值)
- 循环结构(如AES的10轮迭代)
实战:AES算法逆向全流程
1. 自动识别阶段
通过BytePatterns匹配AES特征:
- 打开
Window > Byte Patterns - 加载内置
crypto_patterns.gbp - 执行
Search All Patterns
匹配结果将显示:
- 轮密钥加函数(AddRoundKey)
- 字节替换函数(SubBytes)
- 行移位操作(ShiftRows)
2. 手动验证阶段
在反编译窗口检查关键特征:
// AES轮函数典型反编译结果
void AES_encrypt(uint8_t *state, uint8_t *roundKeys) {
int i;
AddRoundKey(state, roundKeys); // 轮密钥加
for (i = 1; i < 10; i++) {
SubBytes(state); // 字节替换
ShiftRows(state); // 行移位
MixColumns(state); // 列混合
AddRoundKey(state, roundKeys + i*16);
}
// 最后一轮无MixColumns
SubBytes(state);
ShiftRows(state);
AddRoundKey(state, roundKeys + 10*16);
}
3. 密钥提取阶段
使用Ghidra脚本提取轮密钥:
from ghidra.app.decompiler import DecompInterface
from ghidra.program.model.listing import Function
def extract_aes_key(func: Function):
decomp = DecompInterface()
decomp.openProgram(currentProgram)
highFunc = decomp.decompileFunction(func, 0, None)
// 查找轮密钥数组引用
keyRefs = highFunc.getHighFunction().getGlobalReferences("roundKeys")
for ref in keyRefs:
keyData = getDataAt(ref.getToAddress())
if keyData and keyData.getLength() == 176: # AES-128密钥长度
print("AES密钥已找到: " + keyData.getValue())
常见加密算法识别特征库
对称加密算法
| 算法 | 特征模式 | 关键常量 | 函数特征 |
|---|---|---|---|
| AES | 0x63,0x7C,0x77,0x7B(S盒) | 轮常量0x01,0x02,0x04... | 10/12/14轮循环 |
| DES | 0xE3,0xFD,0xFB,0x7B(PC1置换) | 子密钥数量16 | 8轮Feistel结构 |
| 3DES | 三次DES调用 | 双倍密钥长度 | 3层嵌套调用 |
| ChaCha20 | 0x61707865("expa"魔术数) | 常数0x9E3779B9 | 20轮quarterround |
哈希算法
自定义字节模式规则编写
创建my_crypto_patterns.gbp识别Camellia算法:
<BytePatterns>
<Pattern name="Camellia_SBox" priority="high">
<Bytes>0x01,0x23,0x45,0x67,0x89,0xab,0xcd,0xef</Bytes>
<Description>Camellia算法S盒初始化</Description>
<AddressSet>function</AddressSet>
<Action>
<Label>Camellia_SBox_Init</Label>
<Comment>Camellia加密算法S盒初始化函数</Comment>
</Action>
</Pattern>
</BytePatterns>
自动化识别脚本开发
使用PyGhidra编写批量分析脚本:
import pyghidra
def analyze_crypto_algorithms(binary_path):
with pyghidra.open_program(binary_path) as flat_api:
program = flat_api.getCurrentProgram()
# 1. 运行内置加密分析器
flat_api.runPlugin("CryptoAnalyzerPlugin")
# 2. 应用自定义字节模式
flat_api.loadBytePatterns("my_crypto_patterns.gbp")
flat_api.searchBytePatterns()
# 3. 导出识别结果
crypto_functions = flat_api.getMarkedFunctions("CRYPTO")
with open("crypto_analysis.md", "w") as f:
for func in crypto_functions:
f.write(f"- {func.getName()}: {func.getComment()}\n")
if __name__ == "__main__":
analyze_crypto_algorithms("/path/to/target.bin")
高级技巧与最佳实践
1. 常量追踪法
通过Search > For Constants定位加密相关常量:
- AES轮常量:0x01,0x02,0x04,0x08...
- SHA-1初始哈希值:0x67452301,0xEFCDAB89...
- RSA公钥指数:0x10001(常见e=65537)
2. 控制流图分析
加密算法通常具有规则的控制流结构:
3. 交叉引用分析
通过Window > References追踪密钥流向:
- 找到密钥初始化函数
- 跟踪返回值引用
- 定位加密函数参数
总结与进阶方向
本文介绍的Ghidra加密算法识别流程已覆盖80%常见场景。进阶学习建议:
- 扩展FunctionID特征库,添加SM4、SM3等国密算法
- 开发交互式解密插件,实时验证算法识别结果
- 结合动态调试(Ghidra Debugger)捕获密钥
- 构建机器学习模型,实现加密算法自动分类
Ghidra作为NSA开源的逆向工程框架,其加密算法分析能力仍在快速进化。掌握本文技术,将使你在二进制分析领域建立关键优势。立即克隆仓库开始实践:
git clone https://gitcode.com/GitHub_Trending/gh/ghidra
通过持续探索Ghidra的BytePatterns、FunctionID和Decompiler三大核心功能,你将能够高效应对各类加密算法逆向挑战。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考



