iOS逆向-arm64匯編學習

搗鼓了一段時間的iOS逆向相關(guān)的東西,在動態(tài)分析過程中會閱讀匯編代碼,分析代碼的執(zhí)行流程,在此記錄下閱讀匯編代碼過程中經(jīng)常遇到的一些指令账忘。

當然如果不玩逆向也有必要學習匯編,在定位某些crash問題的時候會很有幫助蝙昙,比如有時候程序掛在系統(tǒng)庫里面闪萄,如果能讀懂匯編代碼,再利用一些調(diào)試技巧奇颠,可會達到意想不到的效果败去。

除此之外,學習匯編有利于幫助自己更深層次的理解程序烈拒,理解計算機圆裕。

說明:下面所描述的都是在arm64架構(gòu)的匯編指令,在arm32或者x86架構(gòu)會有所區(qū)別荆几。


寄存器

arm64架構(gòu)下吓妆,所有的寄存器都是64位,并且每個寄存器都有名字的吨铸,按照功能來劃分行拢,可分為一下幾類,分別為:

  1. 通用寄存器
  2. 程序計數(shù)器
  3. 堆棧指針
  4. 鏈接寄存器
  5. 程序狀態(tài)寄存器
  6. 零寄存器

下面分別說明這些寄存器的作用

通用寄存器

64bit : x0 ~ x28 诞吱,每個寄存器都是64bit
32bit:w0 ~ w28舟奠,實際上是x0~x28寄存器的低32bit
x0~x7:通過用來存儲函數(shù)的參數(shù),如果函數(shù)有更多的參數(shù)使用堆棧來傳遞
x0:通常用來存放函數(shù)的返回值

register.png

程序計數(shù)器

程序計數(shù)器叫Program Counter房维,俗稱PC沼瘫,也就是x32寄存器,存儲著CPU當前正在執(zhí)行的地址咙俩。

堆棧指針

SP (Stack Pointer)耿戚,就是x31寄存器,存儲的是棧頂的地址
FP (Frame Pointer)阿趁,FP也就是x29寄存器膜蛔,存儲著棧底的地址
隨著函數(shù)的調(diào)用,SP脖阵、FP會不斷的變化飞几。

鏈接寄存器

LR(Link Register),也就是x30寄存器独撇,存儲著函數(shù)的返回地址屑墨。
當函數(shù)結(jié)束時,就是通過LR寄存器的值纷铣,跳轉(zhuǎn)到調(diào)用函數(shù)的位置繼續(xù)往下執(zhí)行卵史。

程序狀態(tài)寄存器

CPSR (Current Program Status Register),各個bit的含義如下圖:

cpsr.jpeg

SPSR (Saved Program Status Register)搜立,在異常狀態(tài)下使用以躯,當發(fā)生異常時,會把CPSR的內(nèi)容寫入SPSR, 等異匙挠唬恢復之后忧设,又會把SPSR寫會到CPSR中。

零寄存器

WZR
XZR
里面存儲的值都是0颠通。


常用指令

算術(shù)運算指令

mov 賦值指令

mov x0, #2  // 把2這個值賦值給x0寄存器
mov x0, x1  // 把x1寄存器中的值賦值給x0寄存器中

add
兩個操作數(shù)相加址晕,相加的結(jié)果存放到一個寄存器中

add, x2, x0, x1 //把x0的值與x1的值相加,得到的結(jié)果存放到x2寄存器中
add, x2, x0, #3 // 把x0的值與3相加顿锰,得到的結(jié)果存放到x2寄存器中

sub
第一個操作數(shù)減第一個操作數(shù)谨垃,得到的結(jié)果存放到一個寄存器中

sub, x2, x1, x0 // x1的值減去x0的值,得到的結(jié)果存放到*x2*寄存器中
sub, x2, x1, #4 // x1的值減去4硼控,得到的結(jié)果存放到x2寄存器中

mul 乘法指令

mul x3, x1, x2  // x1 乘以 x2 的結(jié)果存放在 x3 中

sdiv 除法指令

sdiv    w0, w0, w1 // w0 除以 w1 的結(jié)果存放在 w0 中

邏輯運算指令

這里的運算是指位運算

  1. LSL 邏輯左移
    按操作數(shù)所指定的數(shù)量向左移位刘陶,低位用零來填充
  2. ASL 算術(shù)左移
    通邏輯左移,ASLLSL等價
lsl x0, x0, #1
asl x1, x1, x0
  1. LSR 邏輯右移
    按操作數(shù)所指定的數(shù)量向右移位牢撼,左端用來填充匙隔。

  2. ASR 算術(shù)右移
    按操作數(shù)所指定的數(shù)量向右移位,左端用最高位位的值來填充 熏版,如果是負數(shù)纷责,最高位為1

lsr w1, w2, #1
asr x1, x2, #2
  1. ROR 循環(huán)右移
    按操作數(shù)所指定的數(shù)量向右循環(huán)移位, 左端用右端移出的位來填充纳决。其中碰逸,操作數(shù)可以是通用寄存器,也可以是立即數(shù)阔加。 當進行寄存器bit位數(shù)的循環(huán)右移操作時饵史,通用寄存器中的值不改變。
ror x0, #6
ror w0, #32  // 循環(huán)移動了32位胜榔,w0的值不變

跳轉(zhuǎn)指令

ret
相當于高級編程語言的return胳喷,函數(shù)返回。

cmp
將兩個操作數(shù)相減夭织,相減的結(jié)果會影響cpsr 寄存器的標志位吭露,當結(jié)果小于0時,CPSR寄存器的N位為1尊惰, 等于0時讲竿, CPSR寄存器的Z為位1泥兰。
cmp x0, x1

b
跳轉(zhuǎn)指令,跳轉(zhuǎn)找指定的標記處執(zhí)行题禀;可以帶條件跳轉(zhuǎn)鞋诗,一般跟cmp配合使用,使用到的條件域如下:

  1. EQ:equal
  2. NE:not equal
  3. GT:great than
  4. GE:great equal
  5. LT:less than
  6. LE:less equal

普通跳轉(zhuǎn)
b testCode迈嘹,testCode是匯編代碼中的一個標記

條件跳轉(zhuǎn)削彬,當x0x1的值相等時,才跳轉(zhuǎn)到testCode標記處執(zhí)行代碼

cmp x0, x1
beq testCode

bl
帶返回值的跳轉(zhuǎn)指令秀仲,這個指令會做兩個操作

  1. 將下一條指令的地址存儲到lr (x30)寄存器中
  2. 跳轉(zhuǎn)到標記處開始執(zhí)行代碼
    bl testCode融痛,當執(zhí)行完testCode標記處代碼后,又會返回來執(zhí)行bl指令下面的指令神僵。

內(nèi)存操作

load從內(nèi)存中讀取數(shù)據(jù)

  1. ldr 地址沒有偏移或者偏移為正數(shù)時使用
  2. ldur 地址偏移為負數(shù)時使用
    a) str x5 [x0] x0中是內(nèi)存的地址雁刷,讀取的值存放在x5寄存器中, x寄存器讀取8個字節(jié)
    b)str w6 [x0] x0中是內(nèi)存的地址,讀取的值存放在w5寄存器中, w寄存器讀取4個字節(jié)

說明: 地址還可以偏移 str x5 [x0, #0x4] , stur x5 [x0, #-0x4] , 偏移量為正數(shù)高地址偏移挑豌,使用str指令安券、偏移量為負數(shù)低地址偏移,使用stur指令氓英。

  1. ldp 從指定內(nèi)存中讀取數(shù)據(jù)到一對寄存器中侯勉, ppair的意思,這一對寄存器必須是同類型的铝阐,要么x類型, 要么w類型址貌。其中低位讀取到第一個寄存器、高位讀取到第二個寄存器
    ldp w5, w6, [x0] , 地址可以偏移 ldp x5, x6, [x0, #-x04]

store 往指定的內(nèi)存寫入數(shù)據(jù)

  1. str
str x1, [x0]
str w2, [x1]
str w3, [x1, #4]
  1. stur
stur x3, [x0, #-4]
stur w2, [x1, #-4]
  1. stp
stp x2, x3, [x0]
stp w4, w5, [x0]

使用方法與從內(nèi)存中讀取數(shù)據(jù)類似徘键,只不過是往內(nèi)存寫入數(shù)據(jù)练对。


總結(jié)

本文整理了一些在逆向iOS程序時常見的一些匯編指令,當然在實際逆向的過程所看到的匯編指令更加復雜吹害,比如還有函數(shù)調(diào)用棧螟凭,這是下篇的內(nèi)容。如有錯誤請指正它呀。

Refrence

  1. iOS開發(fā)同學的arm64匯編入門 - 劉坤的技術(shù)博客
  2. ARM匯編電子書
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末螺男,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子纵穿,更是在濱河造成了極大的恐慌下隧,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,039評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件谓媒,死亡現(xiàn)場離奇詭異淆院,居然都是意外死亡,警方通過查閱死者的電腦和手機句惯,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,426評論 3 395
  • 文/潘曉璐 我一進店門土辩,熙熙樓的掌柜王于貴愁眉苦臉地迎上來支救,“玉大人,你說我怎么就攤上這事拷淘÷蓿” “怎么了?”我有些...
    開封第一講書人閱讀 165,417評論 0 356
  • 文/不壞的土叔 我叫張陵辕棚,是天一觀的道長。 經(jīng)常有香客問我邓厕,道長逝嚎,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,868評論 1 295
  • 正文 為了忘掉前任详恼,我火速辦了婚禮补君,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘昧互。我一直安慰自己挽铁,他們只是感情好,可當我...
    茶點故事閱讀 67,892評論 6 392
  • 文/花漫 我一把揭開白布敞掘。 她就那樣靜靜地躺著叽掘,像睡著了一般。 火紅的嫁衣襯著肌膚如雪玖雁。 梳的紋絲不亂的頭發(fā)上更扁,一...
    開封第一講書人閱讀 51,692評論 1 305
  • 那天,我揣著相機與錄音赫冬,去河邊找鬼浓镜。 笑死,一個胖子當著我的面吹牛劲厌,可吹牛的內(nèi)容都是我干的膛薛。 我是一名探鬼主播,決...
    沈念sama閱讀 40,416評論 3 419
  • 文/蒼蘭香墨 我猛地睜開眼补鼻,長吁一口氣:“原來是場噩夢啊……” “哼哄啄!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起辽幌,我...
    開封第一講書人閱讀 39,326評論 0 276
  • 序言:老撾萬榮一對情侶失蹤增淹,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后乌企,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體虑润,經(jīng)...
    沈念sama閱讀 45,782評論 1 316
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,957評論 3 337
  • 正文 我和宋清朗相戀三年加酵,在試婚紗的時候發(fā)現(xiàn)自己被綠了拳喻。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片哭当。...
    茶點故事閱讀 40,102評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖冗澈,靈堂內(nèi)的尸體忽然破棺而出钦勘,到底是詐尸還是另有隱情,我是刑警寧澤亚亲,帶...
    沈念sama閱讀 35,790評論 5 346
  • 正文 年R本政府宣布彻采,位于F島的核電站,受9級特大地震影響捌归,放射性物質(zhì)發(fā)生泄漏肛响。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,442評論 3 331
  • 文/蒙蒙 一惜索、第九天 我趴在偏房一處隱蔽的房頂上張望特笋。 院中可真熱鬧,春花似錦巾兆、人聲如沸猎物。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,996評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽嚼蚀。三九已至解藻,卻和暖如春老厌,著一層夾襖步出監(jiān)牢的瞬間暮芭,已是汗流浹背朴肺。 一陣腳步聲響...
    開封第一講書人閱讀 33,113評論 1 272
  • 我被黑心中介騙來泰國打工黔牵, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留留攒,地道東北人煤惩。 一個月前我還...
    沈念sama閱讀 48,332評論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像炼邀,于是被迫代替她去往敵國和親魄揉。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,044評論 2 355

推薦閱讀更多精彩內(nèi)容