iOS逆向 05:匯編總結(jié)

iOS 底層原理 + 逆向 文章匯總

到此為止,匯編部分就理解完成了狞谱,其中需要重點掌握的是 函數(shù)刁赖,因為這與我們?nèi)粘i_發(fā)是息息相關(guān)的。

下面是所有匯編知識的一個匯總,如果不想看前面文章的锦亦,也可以直接查看這里

匯編初識

  • 1、匯編概述

    • 使用助記符代替機器指令的一種編程語言

    • 匯編和機器指令是一一對應(yīng)的關(guān)系令境,拿到二進制就可以反匯編

    • 由于匯編和CPU的指令集是對應(yīng)的杠园,所以匯編不具備移植性

  • 2、總線:是由一堆導(dǎo)線的集合

    • 地址總線:其寬度決定了尋址能力

    • 數(shù)據(jù)總線:其寬度決定了CPU數(shù)據(jù)的吞吐量

    • 控制總線:其寬度決定了CPU對其他器件的控制能力

  • 3舔庶、進制

    • 任意進制都是由對應(yīng)個數(shù)的符號組成的抛蚁,符號可以自定義

    • 2/8/16是相對完美的進制,他們之間的關(guān)系

      • 3個二進制 使用一個8進制標(biāo)識

      • 4個二進制 使用一個16進制標(biāo)識

      • 兩個16進制可以標(biāo)識一個字節(jié)惕橙,即8位

    • 數(shù)量單位

      • 1024 = 1k瞧甩,1024k = 1M,1024M = 1G
    • 容量單位

      • 1024 = 1KB弥鹦,1024KB = 1MB肚逸,1024MB = 1GB
    • 數(shù)據(jù)的寬度

      • 計算機中的數(shù)據(jù)是有寬度的,超過了就會溢出
  • 4、寄存器:CPU為了性能朦促,自內(nèi)部開辟了一小塊臨時存儲區(qū)域

    • 浮點向量寄存器:用于浮點數(shù)/向量的存儲及運算

    • 異常狀態(tài)寄存器

    • 通用寄存器:除了存放數(shù)據(jù)有時也有特殊的用途

      • ARM64擁有32個64位的通用寄存器X0-X30以及XZR(零寄存器)

      • 為了兼容32位犬钢,所以arm64位擁有W0-W28以及WZR 30個32位寄存器

      • 32位寄存器并不是獨立存在的,例如 W0是X0的低32位

    • PC寄存器:指令指針寄存器

      • PC寄存器里面的保存的就是CPU接下來需要執(zhí)行的指令地址

      • 改變PC的值可以改變程序的執(zhí)行流程

      • mov指令不能更改PC寄存器的值思灰,需要通過bl跳轉(zhuǎn)指令來改變PC寄存器的值

函數(shù)本質(zhì)(重點掌握g栌獭!H骶巍4跬恰!)

  • 1油湖、棧:是一種具有特殊的訪問方式的存儲空間(后進先出巍扛,Last in First out, LIFO

    • ARM64里面對棧的操作16字節(jié)對齊
  • 2乏德、SPFP寄存器

    • SP寄存器在任意時刻會保存棧頂?shù)牡刂?/code>
    • FP寄存器也稱為x29寄存器撤奸,屬于通用寄存器,但是在某些時刻利用它保存棧底的地址
  • 3喊括、棧的讀寫指令

    • 讀:ldr(load register)指令 LDR胧瓜、LDP

    • 寫:str(store register)指令 STR、STP

  • 4郑什、bl指令

    • 跳轉(zhuǎn)指令:bl 標(biāo)號府喳,表示程序執(zhí)行到標(biāo)號處,將下一條指令的地址保存到lr寄存器

    • B代表著跳轉(zhuǎn)

    • L表示lr(x30)寄存ios_reverse_02器

  • 5蘑拯、ret指令

    • 類似函數(shù)的return
    • 讓CPU執(zhí)行l(wèi)r寄存器所指向的指令
  • 6钝满、避免嵌套函數(shù)無法回去:需要保護bl(即lr寄存器,存放回家的路)申窘,保存在當(dāng)前函數(shù)自己的椡溲粒空間

  • 7、函數(shù)參數(shù)

    • arm64中剃法,參數(shù)是放在x0-x7的8個寄存器中

    • 如果是浮點數(shù)碎捺,就會用浮點數(shù)寄存器

    • 如果超過8個參數(shù)就會用棧傳遞

  • 8、函數(shù)返回值

    • 一般函數(shù)的返回值使用x0寄存器保存

    • 如果返回值大于了8個字節(jié)(x0寄存器大小是8個字節(jié))玄窝,就會利用內(nèi)存?zhèn)鬟f返回值

  • 9牵寺、函數(shù)局部變量

    • 局部變量存儲在空間
  • 10悍引、函數(shù)的嵌套調(diào)用:會將x29恩脂、x30寄存器入棧保護

  • 11、狀態(tài)(標(biāo)志)寄存器 - CPSR

    • arm64中cpsr寄存器(32位)為狀態(tài)寄存器

    • 最高4位(28趣斤、29俩块、30、31)為標(biāo)志位

      • N標(biāo)志(負(fù)標(biāo)記位)
        • 執(zhí)行結(jié)果為負(fù)數(shù)N=1

        • 執(zhí)行結(jié)果非負(fù)數(shù)N=0

      • Z標(biāo)志(0標(biāo)記位)
        • 結(jié)果為0則Z=1

        • 結(jié)果非0則Z=0

      • C標(biāo)志(無符號溢出)
        • 加法:進位 C=1,否則C=0

        • 減法:借位 C=0玉凯,否則C=1

      • V標(biāo)志(有符號溢出)
        • 正數(shù)+正數(shù)=負(fù)數(shù)势腮,則V=1

        • 正數(shù)+負(fù)數(shù)=正數(shù),則V=0

循環(huán)選擇指令(需要多實際操作)

1漫仆、全局變量和常量

  • 獲取全局變量和常量時捎拯,會出現(xiàn)adrpadd兩條指令獲得一個地址的情況

  • ADRP(Address Page)

    • adrp x0,1
      • PC寄存器的低12位清零

      • 將1的值盲厌,左移12位

      • 以上兩個結(jié)果相加放入x0寄存器

  • 通過ADD指令獲取這頁內(nèi)存中的偏移值

2署照、條件判斷

  • CMP把一個寄存器的內(nèi)容和另一個寄存器的內(nèi)容或立即數(shù)進行比較,但不存儲結(jié)果吗浩,只是正確的更改標(biāo)志(CMP后面跟的是B.LE建芙,即else的條件)
  • 一般CMP做完判斷后會進行跳轉(zhuǎn),后面通常會跟上B指令
    • BL 標(biāo)號:跳轉(zhuǎn)到標(biāo)號處執(zhí)行

    • B.LT 標(biāo)號:比較結(jié)果是小于(less than )懂扼,執(zhí)行標(biāo)號禁荸,否則不跳轉(zhuǎn)

    • B.LE 標(biāo)號:比較結(jié)果是小于等于(less than or equal to),執(zhí)行標(biāo)號阀湿,否則不跳轉(zhuǎn)

    • B.GT 標(biāo)號:比較結(jié)果是大于(greater than)赶熟,執(zhí)行標(biāo)號,否則不跳轉(zhuǎn)

    • B.GE 標(biāo)號:比較結(jié)果是大于等于(greater than or equal to)陷嘴,執(zhí)行標(biāo)號钧大,否則不跳轉(zhuǎn)

    • B.EQ 標(biāo)號:比較結(jié)果是等于,執(zhí)行標(biāo)號罩旋,否則不跳轉(zhuǎn)

    • B.NE 標(biāo)號:比較結(jié)果是不等于(not equal),執(zhí)行標(biāo)號啊央,否則不跳轉(zhuǎn)

    • B.HI 標(biāo)號:比較結(jié)果是無符號大于,執(zhí)行標(biāo)號涨醋,否則不跳轉(zhuǎn)

    • B.HS 標(biāo)號:比較結(jié)果是無符號大于等于瓜饥,執(zhí)行標(biāo)號,否則不跳轉(zhuǎn)

3浴骂、循環(huán)

  • do-while循環(huán):判斷條件在后面乓土,滿足條件往外跳

  • for循環(huán)和while循環(huán)很像:判斷條件在里面,不滿足就往外跳

4溯警、switch

  • 1趣苏、假設(shè)switch語句的分支比較少時(例如3,少于4的時候沒有意義)梯轻,沒有必要使用次結(jié)構(gòu)食磕,相當(dāng)于if-else

  • 2、各個分支常量的差值較大時喳挑,編譯器會在效率還是內(nèi)存進行取舍彬伦,這時編譯器還是會編譯成類似于if-else的結(jié)構(gòu)

  • 3滔悉、在分支比較多的時候,在編譯的時候會生成一個表(跳轉(zhuǎn)表每個地址四個字節(jié))单绑。

OC反匯編(需要多實際操作)

  • 1回官、編譯器優(yōu)化:

    • 1、設(shè)置:BuildSetting->Optimization Level

    • 2搂橙、優(yōu)化原則:對結(jié)果沒有任何影響的代碼會被編譯器優(yōu)化

    • 3歉提、編譯器優(yōu)化,本質(zhì)是LLVM的優(yōu)化過程区转,實際上優(yōu)化的是匯編代碼(可以理解為匯編指令會減少

  • 2唯袄、指針:

    • 1、指針的自增自減和指向的數(shù)據(jù)類型寬度有關(guān)蜗帜,是按照指向的數(shù)據(jù)類型來運算的(即指針的寬度 - 步長

    • 2恋拷、指針的運算單位是指向的數(shù)據(jù)類型的寬度

    • 3、指針可以通過if-else比大小厅缺,因為類型是可以相互轉(zhuǎn)換的

  • 3蔬顾、[[self alloc] init] 優(yōu)化過程

    • 在最初的版本(iOS9)中,相當(dāng)于兩次消息發(fā)送 objc_msgSend

    • iOS11版本 是一次消息發(fā)送 objc_alloc + objc_msgSend

    • iOS13.5.1以上版本湘捎,已經(jīng)沒有objc_msgSend诀豁,而是objc_alloc_init

  • 4、反匯編分析方式:

    • 通過LLDB動態(tài)調(diào)試

    • 通過Hopper + MachOView 靜態(tài)分析

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末窥妇,一起剝皮案震驚了整個濱河市舷胜,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌活翩,老刑警劉巖烹骨,帶你破解...
    沈念sama閱讀 218,755評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異材泄,居然都是意外死亡沮焕,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,305評論 3 395
  • 文/潘曉璐 我一進店門拉宗,熙熙樓的掌柜王于貴愁眉苦臉地迎上來峦树,“玉大人,你說我怎么就攤上這事旦事】” “怎么了?”我有些...
    開封第一講書人閱讀 165,138評論 0 355
  • 文/不壞的土叔 我叫張陵姐浮,是天一觀的道長谷遂。 經(jīng)常有香客問我,道長单料,這世上最難降的妖魔是什么埋凯? 我笑而不...
    開封第一講書人閱讀 58,791評論 1 295
  • 正文 為了忘掉前任点楼,我火速辦了婚禮扫尖,結(jié)果婚禮上白对,老公的妹妹穿的比我還像新娘。我一直安慰自己换怖,他們只是感情好甩恼,可當(dāng)我...
    茶點故事閱讀 67,794評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著沉颂,像睡著了一般条摸。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上铸屉,一...
    開封第一講書人閱讀 51,631評論 1 305
  • 那天钉蒲,我揣著相機與錄音,去河邊找鬼彻坛。 笑死顷啼,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的昌屉。 我是一名探鬼主播钙蒙,決...
    沈念sama閱讀 40,362評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼间驮!你這毒婦竟也來了躬厌?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,264評論 0 276
  • 序言:老撾萬榮一對情侶失蹤竞帽,失蹤者是張志新(化名)和其女友劉穎扛施,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體屹篓,經(jīng)...
    沈念sama閱讀 45,724評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡煮嫌,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,900評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了抱虐。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片昌阿。...
    茶點故事閱讀 40,040評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖恳邀,靈堂內(nèi)的尸體忽然破棺而出懦冰,到底是詐尸還是另有隱情,我是刑警寧澤谣沸,帶...
    沈念sama閱讀 35,742評論 5 346
  • 正文 年R本政府宣布刷钢,位于F島的核電站,受9級特大地震影響乳附,放射性物質(zhì)發(fā)生泄漏内地。R本人自食惡果不足惜伴澄,卻給世界環(huán)境...
    茶點故事閱讀 41,364評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望阱缓。 院中可真熱鬧非凌,春花似錦、人聲如沸荆针。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,944評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽航背。三九已至喉悴,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間玖媚,已是汗流浹背箕肃。 一陣腳步聲響...
    開封第一講書人閱讀 33,060評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留今魔,地道東北人勺像。 一個月前我還...
    沈念sama閱讀 48,247評論 3 371
  • 正文 我出身青樓,卻偏偏與公主長得像涡贱,于是被迫代替她去往敵國和親咏删。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,979評論 2 355

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