通过对某安全SDK的ARM64执行日志(Trace)进行深度分析,完整还原签名算法流程。本文重点介绍从汇编指令中扣取算法的分析方法。
从汇编日志提取的VM结构:
JNI传入的签名输入字符串格式:
示例:
MD5 (初始化常量已确认)
SHA1 (轮常量已确认)
XOR混淆
自定义Base64编码
Base64解码后的76字节结构:
在trace日志中搜索重复出现的指令模式,定位VM主循环:
分析要点:
通过handler内部的指令特征识别功能:
示例1:识别XOR Handler (Opcode 0x274)
示例2:识别NOT Handler (Opcode 0x272)
MD5识别 - 搜索初始化常量:
SHA1识别 - 搜索轮常量:
从输入到输出追踪数据变换:
从trace中提取SHA1单轮计算的关键指令:
通过在trace中批量搜索,提取算法使用的所有常量:
在trace末尾追踪最终输出的组装过程:
x23 = 0x752a4ff870 -> Handler地址表 (约600个handler)
x25 = 0x78b7586080 -> VM虚拟寄存器数组 (32个64位寄存器)
x21 = 字节码程序计数器
x27 = VM上下文指针
x23 = 0x752a4ff870 -> Handler地址表 (约600个handler)
x25 = 0x78b7586080 -> VM虚拟寄存器数组 (32个64位寄存器)
x21 = 字节码程序计数器
x27 = VM上下文指针
ldrh w5, [x21,
ldr x4, [x23, x5, lsl
br x4 // 跳转执行handler
ldrh w5, [x21,
ldr x4, [x23, x5, lsl
br x4 // 跳转执行handler
| Opcode |
Handler地址 |
功能 |
| 0x000 |
0x752a2a9070 |
ADD指令 |
| 0x006 |
0x752a3b6bfc |
ADD+K (SHA1轮计算) |
| 0x202 |
0x752a3bc1e0 |
MOV/ORR指令 |
| 0x272 |
0x752a3b7c30 |
XOR+NOT变换 |
| 0x274 |
0x752a38fa28 |
XOR变换 |
{token}&{appKey}&&{uid}&{md5_data}&{timestamp}&{api}&{apiVersion}&{sid}&{deviceId}&&&&{openappkey}&{extParams}&&&&&&&
{token}&{appKey}&&{uid}&{md5_data}&{timestamp}&{api}&{apiVersion}&{sid}&{deviceId}&&&&{openappkey}&{extParams}&&&&&&&
{YOUR_TOKEN}&{APP_KEY}&&{USER_ID}&{MD5_HASH}&1704067200&api.example.method&1.0&{SESSION_ID}&{DEVICE_ID}&&&&openappkey=DEFAULT_AUTH&27&&&&&&&
{YOUR_TOKEN}&{APP_KEY}&&{USER_ID}&{MD5_HASH}&1704067200&api.example.method&1.0&{SESSION_ID}&{DEVICE_ID}&&&&openappkey=DEFAULT_AUTH&27&&&&&&&
[输入字符串]
↓
↓ L102135-L102150: XOR + NOT 变换
↓ 观察: 每8字节与 0x2626... XOR,再取反
↓
[XOR变换后数据]
↓
↓ L12468961-L12469182: MD5压缩
↓ 特征: 64轮运算,4个32位状态变量
↓
[MD5哈希 16字节]
↓
↓ L16501050-L16501180: SHA1-HMAC
↓ 特征: 80轮运算,5个32位状态变量
↓
[HMAC签名 20字节 × 3]
↓
↓ 组装76字节结构
↓
[Base64编码输出]
[输入字符串]
↓
↓ L102135-L102150: XOR + NOT 变换
↓ 观察: 每8字节与 0x2626... XOR,再取反
↓
[XOR变换后数据]
↓
↓ L12468961-L12469182: MD5压缩
↓ 特征: 64轮运算,4个32位状态变量
↓
[MD5哈希 16字节]
↓
↓ L16501050-L16501180: SHA1-HMAC
↓ 特征: 80轮运算,5个32位状态变量
传播安全知识、拓宽行业人脉——看雪讲师团队等你加入!
最后于 2小时前
被wx_插曲编辑
,原因: