欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

使用ARM匯編破解iOS程序基礎(chǔ)知識(shí)分享

 更新時(shí)間:2015年11月10日 09:42:41   投稿:hebedich  
最近對iOS逆向工程很感興趣。但查到的資料中都涉及到有ARM匯編,但都只是很泛地用到,并沒有對iOS上的ARM匯編進(jìn)行比較詳細(xì)的講解。因此,經(jīng)過一系列的學(xué)習(xí)對iOS下的ARM有了一定的理解。在此打算用幾篇文字記錄下來, 限于本人水平有限,如有錯(cuò)誤請不吝賜教。

一、Thumb指令與ARM指令

  Thumb指令為16位,因此存儲(chǔ)代碼的密度高,節(jié)省存儲(chǔ)空間。但是功能不全,它只是ARM指令(32位)集的補(bǔ)充,是ARM指令集下的一個(gè)子集。在初級(jí)階段我們不需要了解這些知識(shí),只要有個(gè)概念知道有這么個(gè)東西就可以。

二、ARM的寄存器初步了解

  R0-R3:        用于函數(shù)參數(shù)及返回值的傳遞,超過4個(gè)參數(shù),其它參數(shù)存在棧中,在ARM中棧是向下生長的,R0還可以作為返回值。
  R4-R6, R8,R10-R11: 沒有特殊規(guī)定,就是普通的通用寄存器
  R7:          棧幀指針,指向母函數(shù)與被調(diào)用子函數(shù)在棧中的交界。
  R9:          在iOS3.0被操作系統(tǒng)保留
  R12:         內(nèi)部過程調(diào)用寄存器,動(dòng)態(tài)鏈接時(shí)會(huì)用到,不必深究
  R13:         SP(stack pointer),是棧頂指針
  R14:         LR(link register),存放函數(shù)的返回地址。
  R15:         PC(program counter),指向當(dāng)前指令地址。
  CPSR:        當(dāng)前程序狀態(tài)寄存器,在用戶狀態(tài)下存放像condition標(biāo)志中斷禁用等標(biāo)志的。
  另外還有VFP(向量浮點(diǎn)運(yùn)算)相關(guān)的寄存器,不在列舉。

三、常用匯編

  助記符  說明
  ADC  帶進(jìn)位的加法
  ADD  加法
  AND  邏輯與
  B    分支跳轉(zhuǎn),很少單獨(dú)使用
  BL 分支跳轉(zhuǎn),跳轉(zhuǎn)后返回地址存入r14
  BX 分支跳轉(zhuǎn),并切換指令模式(Thumb/ARM)
  CMP 比較值,結(jié)果存在程序狀態(tài)寄存器,一般用于分支判斷
  BEQ 結(jié)果為0則跳轉(zhuǎn)
  BNE 結(jié)果不為0跳轉(zhuǎn)
  LDR 加寄存器,從內(nèi)存加載到寄存器
  LDRB 裝載字節(jié)到寄存器
  LDRH 裝載半字到寄存器(一個(gè)字是32位)
  LSL 邏輯左移這是一個(gè)選項(xiàng),不是指令
  LSR 邏輯右移這是一個(gè)選項(xiàng),不是指令
  MOV 傳送值/寄存器到一個(gè)寄存器
  STR 存儲(chǔ)一個(gè)寄存器,寄存器值存到內(nèi)存
  STRB 存儲(chǔ)一個(gè)字節(jié)
  STRH 存儲(chǔ)一個(gè)半字
  SUB 減法
  PUSH POP 堆棧操作

四、函數(shù)調(diào)用

  函數(shù)的參數(shù)、局部變量、返回地址都在棧上存著,這部分棧上的內(nèi)存稱為棧幀。和R0~R15(不一定全部)、CPSR等一起構(gòu)成了函數(shù)的運(yùn)行環(huán)境。每一個(gè)函數(shù)系統(tǒng)都會(huì)分配一個(gè)棧幀,執(zhí)行完成后系統(tǒng)自動(dòng)收回。每個(gè)函數(shù)都以為R0~R15、CPSR等CPU相關(guān)寄存器為自己一人享有,所以要做一些必要操作。

  舉個(gè)例子:假設(shè)A調(diào)用B時(shí),那么A要保存自己的運(yùn)行環(huán)境(保存現(xiàn)場),B執(zhí)行完后,要恢復(fù)A的運(yùn)行環(huán)境(恢復(fù)現(xiàn)場);另外A還可以通過R0—R4來傳遞參數(shù),參數(shù)超過4個(gè)可以通過棧,B返回時(shí)可以通過R0傳遞返回值。其中主要涉及的就是棧的操作和寄存器的操作。下圖為函數(shù)調(diào)用前后棧的布局,左邊為調(diào)用前,右邊為調(diào)用后,當(dāng)B返回時(shí)應(yīng)回到左邊狀態(tài)(A調(diào)用B之前的狀態(tài),就像沒有調(diào)用B一樣)。

  在上圖中,一個(gè)棧幀除了已經(jīng)提到的參數(shù)區(qū)域(parameter area)、鏈接區(qū)域(linkage area)、局部變量存儲(chǔ)區(qū)(local storage area)外還有棧幀指針存放區(qū)域(saved frame pointer)、寄存器存儲(chǔ)區(qū)(saved registers area),棧幀寄存器就不再解釋,寄存器存儲(chǔ)區(qū):保存非易失寄存器(R4,R5,R6,R8,R10,R11),后面的匯編代碼例子會(huì)介紹。

  開始調(diào)用(現(xiàn)場保護(hù)):

  1)LR入棧;

  2)R7入棧,包存要恢復(fù)的寄存器入棧;

  3)R7 = SP地址;

  4)將callee會(huì)修改且在返回caller時(shí)需要恢復(fù)的寄存器入棧;

  5)分配??臻g給子程序使用。

  下圖為匯編代碼(使用hopper disassemble反編譯的代碼),分析如下:

  第一行:將LR, R7, R4-R6入棧;

  第二行:r7=sp-0xc(指向old R7),之所以減去0xc因?yàn)镻USH后,r4,r5,r6占去12個(gè)字節(jié);

  第三行:保存要恢復(fù)的寄存器;

  第四行:給當(dāng)前函數(shù)開辟棧空間。

  函數(shù)返回(恢復(fù)現(xiàn)場):

  1)釋放??臻g;

  2)恢復(fù)所保存的寄存器;

  3)恢復(fù)R7;

  4)將之前存放的LR從棧上彈出到PC,這樣函數(shù)就返回了。

  下圖為匯編代碼(使用hopper disassemble反編譯的代碼),分析如下:

  第一行:釋放棧空間;

  第二行:恢復(fù)保存的寄存器;

  第三行:恢復(fù)保存的寄存器,恢復(fù)R7,將之前存放的LR從棧上彈出到PC。

相關(guān)文章

  • IOS程序開發(fā)之禁止輸入表情符號(hào)實(shí)例代碼

    IOS程序開發(fā)之禁止輸入表情符號(hào)實(shí)例代碼

    如何禁止輸入表情符號(hào)呢?下面腳本之家小編給大家分享IOS程序開發(fā)之禁止輸入表情符號(hào)實(shí)例代碼,感興趣的朋友參考下吧
    2016-04-04
  • iOS利用手機(jī)攝像頭測心率

    iOS利用手機(jī)攝像頭測心率

    這篇文章主要為大家詳細(xì)介紹了iOS利用手機(jī)攝像頭測心率的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2016-09-09
  • 解決JSON數(shù)據(jù)因?yàn)閚ull導(dǎo)致數(shù)據(jù)加載失敗的方法

    解決JSON數(shù)據(jù)因?yàn)閚ull導(dǎo)致數(shù)據(jù)加載失敗的方法

    前段時(shí)間發(fā)現(xiàn)一個(gè)問題,當(dāng)JSON數(shù)據(jù)中有null會(huì)導(dǎo)致數(shù)據(jù)加載失敗,后來解決了,現(xiàn)在將解決方法分享給大家,有同樣問題的朋友們可以參考。下面來一起看看吧。
    2016-09-09
  • iOS中如何使用iconfont圖標(biāo)實(shí)例詳解

    iOS中如何使用iconfont圖標(biāo)實(shí)例詳解

    iconfont大家在開發(fā)中應(yīng)該會(huì)經(jīng)常用到,下面這篇文章主要給大家介紹了在iOS中如何使用iconfont圖標(biāo)實(shí)例的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考借鑒,下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2018-07-07
  • IOS textField限制字節(jié)長度

    IOS textField限制字節(jié)長度

    這篇文章主要介紹了IOS textField限制字節(jié)長度的相關(guān)資料,需要的朋友可以參考下
    2016-02-02
  • iOS?StoreKit?2?新特性盤點(diǎn)解析

    iOS?StoreKit?2?新特性盤點(diǎn)解析

    這篇文章主要為大家介紹了iOS?StoreKit?2?新特性盤點(diǎn)及要點(diǎn)解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-07-07
  • iOS Swift利用UICollectionView實(shí)現(xiàn)無限輪播功能(原理)詳解

    iOS Swift利用UICollectionView實(shí)現(xiàn)無限輪播功能(原理)詳解

    無線輪播圖的實(shí)現(xiàn)方式有很多,下面這篇文章主要給大家介紹了關(guān)于iOS Swift利用UICollectionView實(shí)現(xiàn)無限輪播功能(原理)的相關(guān)資料,需要的朋友可以參考下
    2018-09-09
  • Flutter?Widgets之標(biāo)簽類控件Chip詳解

    Flutter?Widgets之標(biāo)簽類控件Chip詳解

    這篇文章主要為大家介紹了Flutter?Widgets之標(biāo)簽類控件Chip詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-10-10
  • iOS實(shí)現(xiàn)抽屜效果

    iOS實(shí)現(xiàn)抽屜效果

    這篇文章主要為大家詳細(xì)介紹了iOS實(shí)現(xiàn)抽屜效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-02-02
  • iOS實(shí)現(xiàn)比例拼圖的方法示例

    iOS實(shí)現(xiàn)比例拼圖的方法示例

    這篇文章主要給大家介紹了關(guān)于iOS實(shí)現(xiàn)比例拼圖的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家學(xué)習(xí)或者開發(fā)iOS具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考借鑒,下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2018-07-07

最新評(píng)論