天天看點

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指令集