第七章 ARM 反汇编基础(七)(AArch64 汇编指令集)

文章目录

  • AArch64 汇编指令集
    • AArch64 指令编码
    • AArch64 指令格式解析

AArch64 汇编指令集

  • arm64-v8a 对应两套架构的指令集
    • AArch32(简称“A32”)的 ARM、Thumb、Thumb-2 指令集
    • AArch64(简称“A64”)的 64 位指令集

AArch64 指令编码

  • AArch64 指令根据指令不同的位域分布将指令集分成了编码组(Encoding Group),在每个编码组下细分指令所属的类别:
28 27 26 25 24 编码组
0 0 - - - 不可预料
1 0 0 - - 数据处理(立即数)指令
1 0 1 - - 分支、异常生成与系统指令
- 1 - 0 - 加载与存储指令
- 1 0 1 - 数据处理(寄存器)指令
0 1 1 1 - 数据处理 SIMD 与浮点指令
1 1 1 1 - 数据处理 SIMD 与浮点指令
  • 可看出,只有 bits[28:24] 这五个位会影响指令的编码组,最后的 0b0111 与 0b1111 同属 SIMD 与浮点指令编码组
  • AArch64 虽属 64 位指令系统,但指令长度仍为 32 位。AArch64 与 AArch32 最大的不同体现在寄存器的使用上。如,AArch32 中,将 R1 寄存器的值传入 R0 寄存器,对应的指令为 MOV R0, R1;而在 AArch64 中,对应的指令有 32 位的 MOV W0, W1 和 64 位的 MOV X0, X1。用 32 位还是 64 位的寄存器,主要根据指令最高位 bit[31] 的 sf 域的值是否为 1 决定,若为 1,使用 64 位寄存器;否则使用 32 位寄存器。通常在具体指令的伪代码描述部分会有如下一行,用来说明寄存器使用位数的判断方法:
    integer datasize = if sf == '1' then 64 else 32;
  • 执行如下命令,可将 app2.c 编译成 AArch64 汇编代码:
    第七章 ARM 反汇编基础(七)(AArch64 汇编指令集)_第1张图片

AArch64 指令格式解析

  • 以十六进制数 0x321D03E7 为例,分析其指令编码,找到其对应的 AArch64 汇编指令
  • 用计算器查看其二进制编码:
    第七章 ARM 反汇编基础(七)(AArch64 汇编指令集)_第2张图片
  • bits[28:26] 的值为 0b100,对应数据处理(立即数)指令编码组
  • 数据处理(立即数)指令编码组中所有的指令类别:
28 27 26 25 24 23 指令类别
1 0 0 0 0 - 相对于 PC 寄存器,取地址指令
1 0 0 0 1 - 加/减(立即数)指令
1 0 0 1 0 0 逻辑(立即数)指令
1 0 0 1 0 1 宽移动(立即数)指令
1 0 0 1 1 0 位域(Bitfield)指令
1 0 0 1 1 1 提取(Extract)指令
  • bits[28:23] 的值为 0b100100,对应逻辑(立即数)指令,其位域分布:
    第七章 ARM 反汇编基础(七)(AArch64 汇编指令集)_第3张图片
  • 所有可选的指令:
sf opc N 指令 寄存器位数
0 00 0 AND(立即数) 32 位
0 01 0 ORR(立即数) 32 位
0 10 0 EOR(立即数) 32 位
0 11 0 ANDS(立即数) 32 位
1 00 - AND(立即数) 64 位
1 01 - ORR(立即数) 64 位
1 10 - EOR(立即数) 64 位
1 11 - ANDS(立即数) 64 位
  • bit[31] 的 sf 域值为 0,表示这是用 32 位寄存器的指令。bits[30:29] 的 opc 域值为 0b01,表示这是 ORR(立即数)指令
  • 使用 32 位寄存器的 ORR 指令格式:
    ORR , , #
  • 指令的位域分布:
    第七章 ARM 反汇编基础(七)(AArch64 汇编指令集)_第4张图片
  • ORR 指令的伪代码描述:
integer d = UInt(Rd);
integer n = UInt(Rn);
integer datasize = if sf == '1' then 64 else 32;
boolean setflags;
LogicalOp op;
case opc of
    when '00' op = LogicalOp_AND; setflags = FALSE;
    when '01' op = LogicalOp_ORR; setflags = FALSE;
    when '10' op = LogicalOp_EOR; setflags = FLASE;
    when '11' op = LogicalOp_AND; setflags = TRUE;

bits(datasize) imm;
if sf == '0' && N != '0'
    then ReservedValue();
(imm, -) = DecodeBitMasks(N, imms, immr, TRUE);
  • 通过上述伪代码可计算出:d 的值为 Rd 域对应的整型数值,位于 bits[4:0],值为 0b00111,即数值 7,可知指令格式中的 Wd 为 W7;n 的值为 Rn 域对应的整型数值,位于 bits[9:5],值为 0b11111,全为 1 表示 0 寄存器,即 Wn 对应 WZR 寄存器。接下来只要知道指令格式中的 imm 的计算方法,就能得到完整的指令

  • 可通过 DecodeBitMasks() 计算出 imm,伪代码如下:
// DecodeBitMasks()
// ================

// Decode AArch64 bitfield and logical immediate 
//  masks which use a similar encoding structure

(bits(M), bits(M)) DecodeBitMasks(bit immN, bits(6) imms, bits(6) immr, boolean immediate)
    bits(M) tmask, wmask;
    bits(6) levels;

    // Compute log2 of element size
    // 2^len must be in range [2, M]
    len = HighestSetBit(immN:NOT(imms));
    if len < 1 then ReservedValue();
    assert M >= (1 << len);

    // Determine S, R and S - R parameters
    levels = ZeroExtend(Ones(len), 6);

    // For logical immediate an all-ones value of S is reserved
    // since it would generate a useless all-ones result (many times)
    if immediate && (imms AND levels) == levels
        then ReservedValue();

    S = UInt(imms AND levels);
    R = UInt(immr AND levels);
    diff = S - R;    // 6-bit subtract with borrow

    esize = 1 << len;
    d = UInt(diff);
    welem = ZeroExtend(Ones(S + 1), esize);
    telem = ZeroExtend(Ones(d + 1), esize);
    wmask = Replicate(ROR(welem, R));
    tmask = Replicate(telem);
    return (wmask, tmask);
  • 整个 imm 的计算过程较复杂,不展开推算,直接给出计算结果 8(PS:书上这么写的,故不知如何计算的,但是个人认为这不是重点)
  • 综上,0x321D03E7 对应的 AArch64 汇编指令为 ORR W7, WZR, #8
  • 可用 rasm2 命令验证(小端字节序):
    第七章 ARM 反汇编基础(七)(AArch64 汇编指令集)_第5张图片

  • 若用 IDA Pro 分析这段指令,会发现 0x321D03E7 对应的指令为 MOV W7, #8。关于这点,可在 ARM 指令参考手册看到如下描述:
Bitwise inclusive OR (immediate): Rd = Rn OR imm
This instruction is used by the alias MOV (bitmask immediate).
  • 将 Rn 与 imm 按位或的结果传给 Rd,在本质上与执行 MOV Rd, Rn, #imm 一样,只是 IDA Pro 觉得用 MOV 代替 ORR 能让汇编代码更易读

你可能感兴趣的:(《Android,软件安全权威指南》学习笔记)