安卓逆向:重溫Thumb彙編指令細節

主要內容

1.Thumb指令集詳解
2.Thumb直接訪問的寄存器
3.Thumb指令集組成部分詳解
4.Thumb和arm狀態卻換
5.Thumb的常見應用場景



1.Thumb指令集詳解

  • ARM處理器支持兩種指令集:ARM指令集和Thumb指令集。

  • ARM指令集指令長度爲32位,Thumb指令集指令長度爲16位。在16位外部數據總線寬度下,ARM處理器上使用Thumb指令的性能要比使用ARM指令的性能更好。

  • 存在Thumb指令的意義:兼容數據總線寬度爲16爲的應用系統。

2.Thumb直接訪問的寄存器

安卓逆向:重溫Thumb彙編指令細節

3.Thumb指令集組成部分

安卓逆向:重溫Thumb彙編指令細節

3.1.Thumb數據處理指令

安卓逆向:重溫Thumb彙編指令細節

3.2.分支跳轉指令

安卓逆向:重溫Thumb彙編指令細節

3.3.寄存器加載存儲指令(單寄存器、多寄存器)

安卓逆向:重溫Thumb彙編指令細節

3.4.雜項指令

SWI:軟中斷指令

指令格式如下:

SWI  immed_8
  其中:immed_8 8 位立即數,值爲0~255 之間的整數。
  SWI 指令舉例如下:
  SWI 1 ;軟中斷,中斷立即數爲0
  SWI 0x55 ;軟中斷,中斷立即數爲0x55
  使用SWI 指令時,通常使用以下兩種方法進行傳遞參數,SWI 異常中斷處理程序可以提供相關的服務,這兩種方法均是用戶軟件協定。SWI 異常中斷處理程序要通過讀取引起軟中斷的SWI 指令。以取得8 位立即數。
  (A)指令中8 位的立即數指定了用戶請求的服務類型,參數通過用寄存器傳遞。
            MOV R0,#34 ;設置子功能號爲34
            SWI 18 ;調用18 號軟中斷
  (B)指令中的8 位立即數被忽略,用戶請求的服務類型由寄存器R0 的值決定,參數通過其它的通用寄存器傳遞。
          MOV R0,#18 ;調用18 號軟中斷
          MOV R1,#34 ;設置子功能號爲34
          SWI 0

4.Thumb和ARM狀態卻換

•ARM/Thumb之間的狀態切換是通過一條專用的轉移交換指令BX來實現的

彙編格式: BX{} Rm
功能: BX 指令跳轉到指令中所指定的目標地址,並實現狀態的切換。 Rm 是一個表達目標地址的寄存器。當Rm 中的最低位Rm[0] 爲 1 時,強制程序從ARM 指令狀態跳到Thumb 指令狀態;當 Rm 中的最低位Rm[0]爲0 時,強制程序從Thumb 指令狀態跳到ARM 指令狀態。

BX 指令示例

  CODE32      ;ARM 程序段,32 位編碼
  arm1   ADR R0,thumb1+1  ;把thumb1 所在地址賦給R0 ,末位R0[0] 置1 ,要跳轉THUMB 指令集
  MOV LR,PC   ;設置返回地址
  BX R0     ;跳轉
  ADD R1,R2,#2    ;返回地址處,第4 條指令
  CODE16  ;THUMB 程序段, 16 位編碼
  thumb1  ADD R1,R3,#1   ;THUMB 程序
  BX LR ;跳轉到返回地址處,執行第4 條指令

以上示例分析:說明了帶狀態切換的子程序調用和返回結構,ARM 程序段執行MOV LR,PC 語句時將返回地址保存到了LR 寄存器中。 執行到BX 語句時 ,PC 指向下一個要執行的語句,此時PC(R15) 中的值爲下一個語句ADD 指令所在的地址,並根據R0 中的bit[0] 實現了由ARM 狀態切換到Thumb 狀態。 從而調用Thumb 子程序,子程序調用完後使用BX LR 指令,從而實現了子程序調用的返回並切換到ARM 狀態。

5.Thumb指令一些應用情況

•在ida中識別Thumb指令和ARM指令的方法

•CODE32表示的採用ARM彙編指令,CODE16表示採用的是THUMB彙編指令。

安卓逆向:重溫Thumb彙編指令細節

•Thumb彙編的主要應用場景:逆向調試So文件的時候,編寫ARM的shellcode代碼的時候。

•以下是arm的shellcode的應用

安卓逆向:重溫Thumb彙編指令細節

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章