主要內容
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...