最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

一、Thumb指令與ARM指令

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

二、ARM的寄存器初步了解

  R0-R3:        用于函數(shù)參數(shù)及返回值的傳遞,超過4個參數(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)用寄存器,動態(tài)鏈接時會用到,不必深究
  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 裝載半字到寄存器(一個字是32位)
  LSL 邏輯左移這是一個選項(xiàng),不是指令
  LSR 邏輯右移這是一個選項(xiàng),不是指令
  MOV 傳送值/寄存器到一個寄存器
  STR 存儲一個寄存器,寄存器值存到內(nèi)存
  STRB 存儲一個字節(jié)
  STRH 存儲一個半字
  SUB 減法
  PUSH POP 堆棧操作

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

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

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

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

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

  1)LR入棧;

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

  3)R7 = SP地址;

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

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

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

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

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

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

  第四行:給當(dāng)前函數(shù)開辟??臻g。

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

  1)釋放??臻g;

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

  3)恢復(fù)R7;

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

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

  第一行:釋放??臻g;

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

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

相關(guān)文章

  • iOS實(shí)現(xiàn)通過按鈕添加和刪除控件的方法

    iOS實(shí)現(xiàn)通過按鈕添加和刪除控件的方法

    這篇文章主要為大家詳細(xì)介紹了iOS通過按鈕添加和刪除控件的方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-03-03
  • iOS開發(fā)之如何獲取視圖在屏幕中顯示的位置

    iOS開發(fā)之如何獲取視圖在屏幕中顯示的位置

    這篇文章主要給大家介紹了關(guān)于iOS開發(fā)之如何獲取視圖在屏幕上顯示的位置,以及ios 獲取控件相對屏幕的位置的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。
    2017-11-11
  • iOS實(shí)現(xiàn)類似格瓦拉電影的轉(zhuǎn)場動畫

    iOS實(shí)現(xiàn)類似格瓦拉電影的轉(zhuǎn)場動畫

    這篇文章主要給大家介紹了利用iOS如何實(shí)現(xiàn)類似格瓦拉電影的轉(zhuǎn)場動畫,文中給出了詳細(xì)步驟實(shí)現(xiàn)代碼,對大家的學(xué)習(xí)和理解很有幫助,有需要的朋友們可以參考借鑒,下面來一起看看吧。
    2016-11-11
  • IOS小組件實(shí)現(xiàn)時鐘按秒刷新功能

    IOS小組件實(shí)現(xiàn)時鐘按秒刷新功能

    小組件運(yùn)行在單獨(dú)的進(jìn)程,如果異常會導(dǎo)致小組件進(jìn)程卡死了,一個小組件出問題,其他小組件都不刷新了。既然刷新這么難控制,怎么實(shí)現(xiàn)數(shù)字時鐘按秒刷新呢?接下來通過代碼給大家介紹下ios小組件刷新功能的實(shí)現(xiàn),一起看看吧
    2021-05-05
  • IOS 中NSUserDefaults讀取和寫入自定義對象的實(shí)現(xiàn)方法

    IOS 中NSUserDefaults讀取和寫入自定義對象的實(shí)現(xiàn)方法

    這篇文章主要介紹了IOS 中NSUserDefaults讀取和寫入自定義對象的實(shí)現(xiàn)方法的相關(guān)資料,希望通過本文大家能夠理解掌握這部分內(nèi)容,需要的朋友可以參考下
    2017-09-09
  • LRecyclerView側(cè)滑iOS阻塞效果不完整的解決辦法

    LRecyclerView側(cè)滑iOS阻塞效果不完整的解決辦法

    這篇文章主要介紹了LRecyclerView側(cè)滑iOS阻塞效果不完整的解決辦法,非常不錯,具有參考借鑒價值,需要的朋友參考下
    2016-12-12
  • iOS應(yīng)用腳本重簽名的實(shí)現(xiàn)方法

    iOS應(yīng)用腳本重簽名的實(shí)現(xiàn)方法

    這篇文章主要介紹了iOS應(yīng)用腳本重簽名的實(shí)現(xiàn)方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-01-01
  • iOS實(shí)現(xiàn)第三方微信登錄方式實(shí)例解析(最新最全)

    iOS實(shí)現(xiàn)第三方微信登錄方式實(shí)例解析(最新最全)

    這篇文章主要介紹了iOS實(shí)現(xiàn)第三方微信登錄方式實(shí)例解析(最新最全),非常不錯,具有參考借鑒價值,需要的朋友可以參考下
    2016-12-12
  • iOS App開發(fā)中使用設(shè)計(jì)模式中的單例模式的實(shí)例解析

    iOS App開發(fā)中使用設(shè)計(jì)模式中的單例模式的實(shí)例解析

    單例模式是最簡單和基本的一種設(shè)計(jì)模式,下面我們就簡單解讀一下iOS中單例設(shè)計(jì)模式的用法,示例代碼還是為傳統(tǒng)的Objective-C,主要為了體現(xiàn)單例模式的思想,需要的朋友可以參考下
    2016-05-05
  • 利用iOS繪制圖片生成隨機(jī)驗(yàn)證碼示例代碼

    利用iOS繪制圖片生成隨機(jī)驗(yàn)證碼示例代碼

    驗(yàn)證碼的功能一般是防止使用程序惡意注冊、暴力破解或批量發(fā)帖而設(shè)置的。所謂驗(yàn)證碼,就是將一串隨機(jī)產(chǎn)生的數(shù)字或符號,生成一幅圖片,圖片里加上一些干擾象素(防止OCR),圖片驗(yàn)證碼相信大家都見到過,這篇文章用示例代碼給大家介紹iOS繪制圖片生成隨機(jī)驗(yàn)證碼的方法。
    2016-11-11

最新評論

大厂| 萨嘎县| 孙吴县| 广河县| 包头市| 曲松县| 鄱阳县| 旬阳县| 常州市| 布拖县| 高雄市| 嘉鱼县| 荔波县| 台南市| 喀什市| 焉耆| 永仁县| 泰宁县| 东兴市| 沾益县| 潼南县| 西乡县| 余庆县| 中江县| 双峰县| 南平市| 长泰县| 景宁| 丰宁| 垫江县| 额尔古纳市| 遂宁市| 修水县| 承德市| 息烽县| 溧水县| 阿克陶县| 延安市| 成武县| 齐齐哈尔市| 宿松县|