天天看点

Android逆向分析基础-ARM 汇编语言基础

  1. Android与ARM处理器
    1. ARM处理器架构概述
    2. ARM处理器家族
    3. Android支持的处理器架构
      • ARM
      • x86
      • MIPS
  2. 原生程序与ARM汇编语言
    1. 逆向初步
    2. 原生程序的生成过程
      1. 预处理 gcc -E hello.c hello.i
      2. 编译 gcc -S hello.i -o hello.s
      3. 汇编 gcc -c hello.s -o hello.o
      4. 链接 gcc hello.o -o hello
    3. ARM知识
      1. ARM有31个通用寄存器和6个状态寄存器
      2. ARM的运行模式
        模式 简写 作用
        用户模式 usr ARM处理器正常的执行状态
        快速中断模式 fiq 高速数据传输或通道处理
        外部中断模式 irq 通用中断处理
        管理模式 svc ARM操作系统使用的保护模式
        数据访问终止模式 abt 数据或指令预取终止, 用于虚拟存储和存储保护
        系统模式 sys 运行具有特权的操作系统任务
        未定义指令中止模式 und 执行未定义指令时进入
  3. ARM汇编语言程序结构
    1. 完整的ARM汇编程序
    2. 处理器架构定义
      1. .arch 处理器架构
      2. .fpu 协处理器类型
      3. .eabi_attribute 接口属性
    3. 段定义
      1. .section
      2. .rodata
      3. .text
    4. 注释与标号

      @

    5. 汇编器指令
      指令 说明
      .file 源文件名
      .align 代码对齐方式
      .ascii 声明字符串
      .global 声明全局符号
      .type 指定符号的类型
      .size 指定符号的大小
      .ident 无实际用途
    6. 子程序和参数传递

      .global 函数名

      .type 函数名, %function

      函数名:

      <函数体>

  4. ARM处理器寻址方式
    寻址方式 说明 举例
    立即数寻址 多用于赋初值, 立即数以#作为前缀 MOV R0, #1234
    寄存器寻址 操作数的值在寄存器中 MOV R0, R1 执行后R0=R1
    寄存器移位寻址 操作前对源寄存器进行移位 MOV R0, R1, LSL #2
    移位寻址RRX 带扩展的循环右移 操作数右移一位, 高位用C标志值填充
    寄存器间接寻址 寄存器值是操作数的地址指针 LDR R0, [R1]
    基址寻址 将地址码给出的基址寄存器与偏移量相加形成操作数的地址 LDR R0, [R1, #-8]
    多寄存器寻址 一条指令最多可以完成16个通用寄存器值的传送 LDMIA R0, {R1, R2, R3, R4}
    堆栈寻址 STMFD SP!, {R1-R7, LR} 将R1-R7 LR入栈, 用于保护现场
    块拷贝寻址 连续地址数据从存储器某一位置拷贝到另一个位置 LDMIA R0!, {R1-R3}从R0寄存器指向的存储单元开始取三个字到R1-R3
    相对寻址 以PC当前值为基址, 指令中的地址标号作为偏移量, 相加得到操作数地址
  5. ARM与Thumb指令集
    1. 指令格式

      opcode{cond}{S}{.W|.N} Rd, Rn{, operand2}

      opcode为助记符

      cond为执行条件

      条件码助记符 标志 含义
      EQ Z=1 相等
      NE Z=0 不相等
      CS/HS C=1 无符号数大于或等于
      CC/LO C=0 无符号数小于
      MI N=1 负数
      PL N=0 正数或0
      VS V=1 溢出
      VC V=0 没有溢出
      HI C=1, Z=0 无符号数大于
      LS C=0, Z=1 无符号数小于或等于
      GE N=V 有符号数大于或等于
      LT N!=V 有符号数小于
      GT Z=0, N=V 符号数大于
      LE Z=1, N!=V 有符号数小于或等于
      AL 任何 相等

      S 指定指令是否影响CPSR的值

      .W .N为指令宽度说明符

      Rd为目的寄存器

      Rn为第一个操作数寄存器

      operand2为第二个操作数

    2. 跳转指令
      助记符 含义 举例
      B{cond} label 简单的分支指令, 跳转到指定地址处执行 BNE label
      BL{cond} label 带链接的跳转, 将当前指令的下条指令地址拷贝到LR(R14), 然后跳转到label处执行, 通常用于子程序调用, 通过MOV PC, LR返回主程序
      BX{cond} Rm 带状态切换的跳转指令, 如果条件满足, 处理器判断Rm的位[0]是否为1, 是则将CPSR标志T置位, 并将目标地址处代码解释为Thumb代码, 否则将CPSR的标志T复位, 按ARM方式执行.
      BLX{cond} Rm 集合了BL和BX的功能
    3. 存储器访问指令
    4. 数据处理指令
    5. 其他指令
  6. 多媒体编程与浮点计算的NEON与VFP指令集