簡介
arm是advanced risc machine的首字母縮寫,它可以稱之為一家嵌入式處理器的提供商,也可以理解為一種處理器的架構,還可以將它作為一套完整的處理器指令集。
原生程式與arm組合語言
對於使用arm處理器的android手機來說,它最終會生成相應的arm elf可執行檔案,分析軟體的核心功能只能從這個elf檔案入手。
乙個arm原生程式如下:
export main //main函式
main
var_c= -0xc //識別出的棧變數
var_8 = -8
stmfd sp!, //指令 壓入堆疊
add r11,sp,#4
sub sp,sp,#8
str r0,[r11,#var_8]
str r1,[r11,#var_c]
ldr r3,=(ahelloarm - 0x8300)
add r3,pc,r3
mov r0,r3
bl puts
mov r3,#0
mov r0,r3
sub sp,r11,#4
ldmfd sp!, //堆疊定址指令
對應的**:
int main(int argc, char* ar**)
原生程式的生成過程
1、預處理
2、編譯
3、彙編
4、鏈結
必須了解的arm知識
1、arm組合語言是一門低階語言,它能夠與系統的底層打交道,直接訪問底層硬體資源。
2、arm組合語言與c語言共用同一套原生程式開發的api介面。
3、暫存器是處理器特有的高速存貯部件,它們可用來暫存指令、資料和位址。arm微處理器共有37個32位暫存器,其中31個為通用暫存器,
6個為狀態暫存器。arm處理器支援七種執行模式,它們分別為:使用者模式、快速中斷模式、外部中斷模式、管理模式、資料訪問終止模式、
系統模式、未定義指令中止模式。
指令格式
arm指令的基本格式如下:
{},
opcode為指令助記符,cond為執行條件。
跳轉指令
1、b跳轉指令
b label 簡單的分支指令
2、bl帶鏈結的跳轉指令
bl label
3、bx帶狀態切換的跳轉指令
bx rm
4、blx帶鏈結和狀態切換的跳轉指令
blx rm
儲存器訪問指令
ldr 用於從儲存器中載入資料到暫存器中。它的格式如下:
ldr rd,label
ldrd rd,rd2,label
str rd,label
strd rd,rd2,label
ldm 從指定的儲存單元載入多個資料到乙個暫存器列表。它的格式如下:
ldm{addr_mode} rn reglist
stm 將乙個暫存器列表的資料儲存到指定的儲存單元。它的格式如下:
stm rn reglist
push 將暫存器推入滿遞減堆疊。它的格式如下:
push {cond} reglist
pop 從滿遞減堆疊中彈出資料到暫存器。它的格式如下:
pop reglist
swp 用於暫存器與儲存器之間的資料交換。它的格式如下:
swp{b} rd,rm,[rn]
資料處理指令
mov 將8位的立即數或暫存器的內容傳送到目標暫存器中。它的格式如下:
mov rd,operand2
mvn 資料非傳送指令。它的格式如下:
mvn rd,operand2
add 加法指令。它的格式如下:
addrd,rn,operand2
adc 帶進製加法指令。它的格式如下:
adcrd,rn,operand2
sub 減法指令。它的格式如下:
subrd,rn,operand2
rsb 逆向減法指令。它的格式如下:
rsbrd,rn,operand2
sbc 帶進製減法指令。它的格式如下:
sbcrd,rn,operand2
rsc 帶進製逆向減法指令。它的格式如下:
rsc rd,rn,operand2
mul 32位乘法指令。它的格式如下:
mul rd,rm,rn
mls 將rm暫存器和rn暫存器中的值相乘,然後再從ra暫存器的值中減去乘積,最後將所得結果的低32位存入rd暫存器中。它的格式如下:
mls {cond} rd,rm,rn,ra
mla 將rm暫存器和rn暫存器中的值相乘,然後再將乘積與ra暫存器中的值想家,最後將所得結果的低32位存入rd暫存器中。它的格式如下:
mla {cond} rd,rm,rn,ra
umull 64 位無符號乘法指令。指令將rm 和rs 中的值作無符號數相乘,結果的低32 位儲存到rslo 中,而高32 位儲存到rdhi 中。指令格式如下:
umull rdlo,rdhi,rm,rs
umull 指令舉例如下:
umull r0,r1,r5,r8 ;(r1、r0)=r5×r8
umlal 64 位無符號乘加指令。指令將rm 和rs 中的值作無符號數相乘,64 位乘積與rdhi、rdlo 相加,結果的低32 位儲存到rdlo 中,而高32 位保 存到rdhi 中。
指令格式如下:
umlal rdlo,rdhi,rm,rs
umlal 指令舉例如下:
umlal r0,r1,r5,r8 ;(r1,r0)=r5×r8+(r1,r0)
smull 64 位有符號乘法指令。指令將rm 和rs 中的值作有符號數相乘,結果的低32 位儲存到rdlo 中,而高32 位儲存到rdhi 中。指令格式如下:
smull rdlo,rdhi,rm,rs
smull 指令舉例如下:
smull r2,r3,r7,r6 ;(r3,r2)=r7×r6
smlal 64 位有符號乘加指令。指令將rm 和rs 中的值作有符號數相乘,64 位乘積與rdhi、rdlo,相加,結果的低32 位儲存到rdlo 中,而高32 位保 存到rdhi 中。
指令格式如下:
smlal rdlo,rdhi,rm,rs
smlal 指令舉例如下:
smlal r2,r3,r7,r6 ;(r3,r2)=r7×r6+(r3,r2)
smlad 將rm暫存器的低半字和rn暫存器的低半字相乘,然後將rm暫存器的高半字和rn的高半字相乘,最後將兩個乘積與ra暫存器的值相加並存入rd暫存器。它的格式如下:
smlad{cond}{s}rd,rm,rn,ra
sdiv 有符號數除法指令。它的格式如下:
sdiv rd,rm,rn
udiv 無符號數除法指令。它的格式如下:
udiv rd,rm,rn
asr 算術右移指令。它的格式如下:
asr rd,rm,operader2
and 邏輯與指令。它的格式如下:
and rd,rm,operader2
orr 邏輯或指令。它的格式如下:
orr rd,rm,operader2
eor 異或指令。它的格式如下:
eor rd,rm,operader2
bic 位清除指令。它的格式如下:
bic rd,rm,operader2
lsl 邏輯左移指令。它的格式如下:
lsl rd,rm,operader2
……
小結
了解了arm處理器完整的指令集,為進一步破解android又打下了乙個基礎。
Android ARM組合語言
簡介 arm是advanced risc machine的首字母縮寫,它可以稱之為一家嵌入式處理器的提供商,也可以理解為一種處理器的架構,還可以將它作為一套完整的處理器指令集。原生程式與arm組合語言 對於使用arm處理器的android手機來說,它最終會生成相應的arm elf可執行檔案,分析軟體...
Android ARM組合語言
簡介 arm是advanced risc machine的首字母縮寫,它可以稱之為一家嵌入式處理器的提供商,也可以理解為一種處理器的架構,還可以將它作為一套完整的處理器指令集。原生程式與arm組合語言 對於使用arm處理器的android手機來說,它最終會生成相應的arm elf可執行檔案,分析軟體...
組合語言 AT T組合語言
這兩天的pwn題環境都是在linux中,採用的組合語言是 at t 格式。之前學習的是intel格式的8086彙編,今天學習了下at t組合語言。基於x86 架構的處理器所使用的彙編指令一般有兩種格式 操作intel格式at t格式 暫存器命名 push eax pushl eax 常數 立即運算元...