如何提取ARM64(ARMv8.5-A)指令操作码并创建匹配通配符?
ARM64 LDRB指令匹配通配符构建指南
1. 核心差异:ARM64 vs x86指令编码
ARM64(A64)指令是固定32位长度,操作码并非像x86那样集中在连续整字节,而是分散在多个位段中。这就是两条LDRB指令字节编码看似无关联的原因——可变字段(寄存器号、偏移量)的字节分布打乱了视觉规律,但从位段层面看,固定的操作码位是统一的。
2. 拆解LDRB的固定操作码位段
以两种最常用的LDRB格式为例(基于ARMv8架构规范):
格式1:LDRB <Wt>, [<Xn>, #<imm12>](寄存器基址+12位立即数偏移)
固定必须匹配的位段:
- 位31-28:
0b0011(十六进制0x3,加载类指令标识) - 位27-25:
0b010(无符号字节加载的操作码子段) - 位20:
0b0(SZ位,标识操作宽度为8位)
可变位段(需通配的部分):
- 位19-16:基址寄存器号(Rn)
- 位15-12:目标寄存器号(Rt)
- 位11-0:12位立即数偏移(imm12)
格式2:LDRB <Wt>, [<SP>, #<imm12>](SP基址+12位立即数偏移)
固定必须匹配的位段:
- 位31-28:
0b1111(十六进制0xF,SP基址专属标识) - 位27-25:
0b010 - 位20:
0b0 - 位19-16:
0b1111(固定对应SP寄存器)
可变位段:
- 位15-12:目标寄存器号(Rt)
- 位11-0:12位立即数偏移(imm12)
3. 转换为可使用的匹配规则
根据逆向工具的支持能力,有两种匹配方式:
方式1:位掩码匹配(精准推荐)
大部分专业逆向工具(如IDA、Ghidra)支持位掩码匹配,能精确区分固定位和可变位:
- 寄存器基址LDRB:匹配值
0x38000000,掩码0xFE100000 - SP基址LDRB:匹配值
0xF8F00000,掩码0xFFF00000
方式2:字节通配符匹配(快速初步匹配)
若工具仅支持字节级通配,可基于观察到的固定字节特征编写规则:
- 寄存器基址LDRB(大端机器码表示):
?? ?? ?? 38 - SP基址LDRB(大端机器码表示):
?? ?? ?? 39
注:这种方式可能存在少量误匹配,需结合指令上下文验证。
4. 实操验证步骤
- 用汇编器生成不同参数的LDRB指令,导出机器码;
- 用你编写的匹配规则测试,确认能命中所有目标指令;
- 检查是否误匹配非LDRB指令,若有则调整位掩码或通配规则。
内容的提问来源于stack exchange,提问作者IRP_HANDLER
相关产品推荐
相关产品推荐

