Android逆向 ARM汇编简介

内容纲要

Arm汇编简单介绍

控制指令

  1. 跳转指令: B(Branch) => 分支的意思
    • B 无条件跳转
    • BL 带链接的无条件跳转
    • BX 带状态切换的无条件跳转 根据目标地址最低位切换状态(arm/thumb)
    • BLX 带链接和状态切换的无条件跳转
    • B loc_地址
    • BEQ,BNE

存储器与寄存器交互数据指令 核心

  1. 存储器/寄存器: 内存,存储数据(小数据:寄存器,大数据:栈)
    • 内存: 都是为数据服务
  2. LDR/STR
    • LDR: 从存储器中加载数据到寄存器中 => LOAD
      • LDR R8,[R9,#4],R8为待加载数据的寄存器,加载值为 R9+0x4 所指向的存储单元, 伪代码 R8 = *(R9+4)
    • LDR: 将寄存器的火速据存储到存储区 => Store
      • STR R8,[R9,#4],将R8寄存器的数据存储到 R9+0x4指向的存储单元,伪代码: *(R9+4) = R8
  3. LDM/STM
    • LDM: 将存储器的数据加载到一个寄存器列表
      • LDM R0,{R1,R3},将R1指向的存储单元的数据一次加载到 R1,R2,R3寄存器
    • STM: 将一个寄存器列表的数据存储到指定的存储器
  4. PUSH/POP
    • PUSH: 将寄存器的值压入堆栈 压栈==>
    • POP 将堆栈值弹出到寄存器 出栈<==
  5. SWP: 将寄存器与存储器之间的数据进行交换
    • SWP R1,R1 [R0],将R1寄存器与R0指向的存储单元的内容进行交换
  6. 堆,队列:
    • 数据结构:
      • 栈是竖的,后进先出,且只能从栈顶一次填入数据

数据传输指令

MOV 将立即数或寄存器的数据传送到目标寄存器
MOV R0,#8 => R0 = 8

数据算数运算指令

ADD,SUB,MUL,DIV
有符号,无符号运算,带进位运算

数据逻辑运算指令

  1. 与: AND
  2. 或: ORR
  3. 异或: EOR
  4. 移位: 实质是乘/除,类似与小数点移位,但相反.小数点左移变小,右移变大.但逻辑移位,左移变大,右移变小.且按2的倍数进行
    • LSL:逻辑左移
    • LSR: 逻辑右移

      LSL R0,R1,#2 => R0 = R1*4
      LSR R0,R1,#2 => R0 = R1*2

比较指令

CMP: 比较

CMP R0 #0, => R0寄存器中的值与0比较
标志位: 如z位,这个都可以在动态调式时,寄存器窗口看到

其他指令

  1. 协处理指令: SWT (切换用户模式)
  2. 伪指令: DCB

寄存器寻址方式:

  1. 立即寻址: MOV R0,#1234 => R0 = 0x1234
  2. 寄存器寻址: MOV R0,R1 => R0=R1
  3. 寄存器移位寻址: MOV R0,R1,LSL #2 => R0=R1*4
  4. 寄存器间接寻址: LDR R0,[R1] => 将R1寄存器中的值作为地址,去除地址中的值赋予R0
  5. 寄存器间接基质偏移寻址: LDR R0,[R1,#-4] => 将R1寄存器的值 -0x4的值作为地址,取出地址中的值给R0

int a =0这句话简单高级语言的汇编理解,首先会开辟一个内存存储单元,然后把0x0这个数放入R0寄存器,然后再把0x0这个数放入R0寄存器,然后再把R0寄存器的数据放入内存存储单元,
ARM汇编:

MOV R0, #0
STR R0, [R11, #0x14+var_20]