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

2021-10-12 05:07:05 字數 2375 閱讀 6901

主要內容

1.thumb指令集詳解

2.thumb直接訪問的暫存器

3.thumb指令集組成部分詳解

4.thumb和arm狀態卻換

5.thumb的常見應用場景

•arm處理器支援兩種指令集:arm指令集和thumb指令集。

•arm指令集指令長度為32位,thumb指令集指令長度為16位。在16位外部資料匯流排寬度下,arm處理器上使用thumb指令的效能要比使用arm指令的效能更好。

•存在thumb指令的意義:相容資料匯流排寬度為16為的應用系統。

•3.1.thumb資料處理指令

•3.2.分支跳轉指令

•3.3.暫存器載入儲存指令(單暫存器、多暫存器)

•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

•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 狀態。

•在ida中識別thumb指令和arm指令的方法

•code32表示的採用arm彙編指令,code16表示採用的是thumb彙編指令。

•thumb彙編的主要應用場景:逆向除錯so檔案的時候,編寫arm的shellcode**的時候。

•以下是arm的shellcode的應用

安卓逆向 ARM常見彙編指令總結

跳轉指令 b 無條件跳轉 bl 帶鏈結的無條件跳轉 bx 帶狀態切換的無條件跳轉 blx 帶鏈結和狀態的無條件跳轉 儲存器與暫存器互動資料指令 核心 儲存器 主存和記憶體 ldr 從儲存器中載入資料到儲存器 load ldr r8,r9,04 r8為待載入資料的暫存器,載入值為r9 0x4所指向的儲...

安卓逆向 二

基礎位元組碼 名稱字尾 位元組碼字尾 目的暫存器 源暫存器 move wide from16 vaa,vbbb dalvik指令集中大多數指令用到了暫存器作為目的運算元或源運算元,其中 a b c d e f g h 代表乙個4位的數值,aa bb hh 代表乙個8位的數值,aaaa bbbb hh...

逆向 彙編指令整理

跳轉指令 1 無條件跳轉 jmp 2 根據 cx ecx 暫存器的值跳轉 jcxz cx 為 0則跳轉 jecxz ecx 為 0則跳轉 3 根據 eflags標誌位跳轉 je 等於則跳轉 jne 不等於則跳轉 jz 為 0則跳轉 jnz 不為 0則跳轉 js 為負則跳轉 jns 不為負則跳轉 jc...