Android ARM組合語言

2021-09-09 00:24:31 字數 4593 閱讀 5868

簡介

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 常數 立即運算元...