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的运行模式

        模式简写作用
        用户模式usrARM处理器正常的执行状态
        快速中断模式fiq高速数据传输或通道处理
        外部中断模式irq通用中断处理
        管理模式svcARM操作系统使用的保护模式
        数据访问终止模式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为执行条件

      条件码助记符标志含义
      EQZ=1相等
      NEZ=0不相等
      CS/HSC=1无符号数大于或等于
      CC/LOC=0无符号数小于
      MIN=1负数
      PLN=0正数或0
      VSV=1溢出
      VCV=0没有溢出
      HIC=1, Z=0无符号数大于
      LSC=0, Z=1无符号数小于或等于
      GEN=V有符号数大于或等于
      LTN!=V有符号数小于
      GTZ=0, N=V符号数大于
      LEZ=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指令集
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值