iOS逆向之旅(基礎(chǔ)篇) — 匯編(四) — 匯編下的函數(shù)

首先我們先觀察最干凈的函數(shù)刃鳄,做了什么

這個函數(shù)什么都沒做

void _func_1_(){
}

我沒來看看這個函數(shù)的調(diào)用到推,與函數(shù)的里面的匯編是咋樣的
函數(shù)調(diào)用的匯編

0x1004228a0 <+24>:  bl     0x100422824               ; _func_1_ at main.m:13

函數(shù)執(zhí)行的匯編

02-匯編-函數(shù)`_func_1_:
->  0x100422824 <+0>: ret 

函數(shù)調(diào)用的匯編就是這么簡單,通過bl/ret指令實現(xiàn)代碼塊的跳轉(zhuǎn)實現(xiàn)是钥。
首先我們回顧一下bl/ret指令的功能

  • bl指令 跳轉(zhuǎn)讥巡,將下一條執(zhí)行的指令放入lr(X30)寄存器
  • ret 返回到lr寄存器所保存的地址 執(zhí)行代碼

我們可以直接查看寄存器看看是不是真的



當(dāng)然因為這個是空的函數(shù)上荡,所以才會看起來那么簡單

接下來我們在函數(shù)里面調(diào)用別的函數(shù)試試

先看C代碼

void _func_2_(){
    _func_1_();
}

函數(shù)的調(diào)用都是一樣的趴樱,我們?nèi)タ纯春瘮?shù)里面發(fā)什么了什么變化

02-匯編-函數(shù)`_func_2_:
    0x1022e6810 <+0>:  stp    x29, x30, [sp, #-0x10]!
    0x1022e6814 <+4>:  mov    x29, sp
    0x1022e6818 <+8>:  bl     0x1022e680c               ; _func_1_ at main.m:13
    0x1022e681c <+12>: ldp    x29, x30, [sp], #0x10
    0x1022e6820 <+16>: ret 

接下來我們仔細(xì)觀察函數(shù)發(fā)生的變化,多了以下,兩句話

  stp    x29, x30, [sp, #-0x10]! // 1.把x29 和 x30存方到sp-8 sp-10的位置  2.sp -= 0x16
  ldp    x29, x30, [sp], #0x10   // 1.將sp-8 sp-10位置的值取出來,放入x29 和 x30酪捡,2.sp += 0x16

通過堆棧的操作在函數(shù)的開頭保存了x30(lr),x29(fp),兩個寄存器纳账,在函數(shù)結(jié)尾的時候逛薇,又把這些值取出來,為什么要怎么做呢疏虫?
反過來想永罚,如果不這么做,會導(dǎo)致什么問題卧秘?會出現(xiàn)一個很嚴(yán)重的問題呢袱!【下面純文字解釋,請耐心理解】

當(dāng)我們在執(zhí)行這句話的 bl 0x1022e680c 會把x30寄存器改成 0x1022e681c地址翅敌,那么 0x1022e6820這個位置的時候執(zhí)行ret羞福,代碼會跳回到main函數(shù)嗎?肯定是不會的蚯涮,它只會跳到x30指向的位置治专。那么代碼就會在 0x1022e681c 0x1022e6820 這兩個位置不斷執(zhí)行卖陵,知道把堆棧弄炸,程序奔潰~~~~~~~

所以這兩句匯編是為了保護(hù)代碼回家的的路张峰,以后我們在逆向別人的代碼的時候泪蔫,請不要不破壞~~~

接下來我們繼續(xù)深入理解函數(shù)參數(shù)的傳遞,及返回值的返回

先上個簡單的C代碼

int _func_3_(int a,int b,int c,int d,int e,int f,int g,int h,int i,int j,int k,int l){
    return a+b;
}

接著上調(diào)用函數(shù)的匯編解釋

02-匯編-函數(shù)`main:
    0x1028f2888 <+0>:   sub    sp, sp, #0x40             ; =0x40 
    0x1028f288c <+4>:   stp    x29, x30, [sp, #0x30]
    0x1028f2890 <+8>:   add    x29, sp, #0x30            ; =0x30 
    0x1028f2894 <+12>:  stur   wzr, [x29, #-0x4]
    0x1028f2898 <+16>:  stur   w0, [x29, #-0x8]
    0x1028f289c <+20>:  stur   x1, [x29, #-0x10]
    0x1028f28a0 <+24>:  bl     0x1028f2818               ; _func_1_ at main.m:13
    0x1028f28a4 <+28>:  bl     0x1028f281c               ; _func_2_ at main.m:15
    0x1028f28a8 <+32>:  orr    w0, wzr, #0x1             ;  ----華麗分割線-----
    0x1028f28ac <+36>:  orr    w1, wzr, #0x2
    0x1028f28b0 <+40>:  orr    w2, wzr, #0x3
    0x1028f28b4 <+44>:  orr    w3, wzr, #0x4
    0x1028f28b8 <+48>:  mov    w4, #0x5
    0x1028f28bc <+52>:  orr    w5, wzr, #0x6
    0x1028f28c0 <+56>:  orr    w6, wzr, #0x7
    0x1028f28c4 <+60>:  orr    w7, wzr, #0x8
    0x1028f28c8 <+64>:  mov    w8, #0x9
    0x1028f28cc <+68>:  mov    w9, #0xa
    0x1028f28d0 <+72>:  mov    w10, #0xb
    0x1028f28d4 <+76>:  orr    w11, wzr, #0xc
->  0x1028f28d8 <+80>:  str    w8, [sp]
    0x1028f28dc <+84>:  str    w9, [sp, #0x4]
    0x1028f28e0 <+88>:  str    w10, [sp, #0x8]
    0x1028f28e4 <+92>:  str    w11, [sp, #0xc]           ; ----華麗分割線-----
    0x1028f28e8 <+96>:  bl     0x1028f2830               ; 在這里調(diào)用_func_3_函數(shù)
    0x1028f28ec <+100>: stur   w0, [x29, #-0x14]
    0x1028f28f0 <+104>: ldur   w8, [x29, #-0x14]
    0x1028f28f4 <+108>: mov    x30, x8
    0x1028f28f8 <+112>: mov    x12, sp
    0x1028f28fc <+116>: str    x30, [x12]
    0x1028f2900 <+120>: adrp   x0, 1
    0x1028f2904 <+124>: add    x0, x0, #0xf14            ; =0xf14 
    0x1028f2908 <+128>: bl     0x1028f2bfc               ; symbol stub for: printf
    0x1028f290c <+132>: mov    w8, #0x0
    0x1028f2910 <+136>: str    w0, [sp, #0x18]
    0x1028f2914 <+140>: mov    x0, x8
    0x1028f2918 <+144>: ldp    x29, x30, [sp, #0x30]
    0x1028f291c <+148>: add    sp, sp, #0x40             ; =0x40 
    0x1028f2920 <+152>: ret  

兩段華麗的分割線展示了函數(shù)的參數(shù)是如何傳遞的
細(xì)致不多看喘批,直接看結(jié)果


4.png
->  0x1028f28d8 <+80>:  str    w8, [sp]
    0x1028f28dc <+84>:  str    w9, [sp, #0x4]
    0x1028f28e0 <+88>:  str    w10, [sp, #0x8]
    0x1028f28e4 <+92>:  str    w11, [sp, #0xc] 

他們把第1-第8個參數(shù)放到了x0-x7八個寄存器撩荣,第9-第12個參數(shù),存到堆棧進(jìn)行傳輸參數(shù)
接著我們看看返回值

02-匯編-函數(shù)`_func_3_:
    0x104d46830 <+0>:  sub    sp, sp, #0x30             ; =0x30 
    0x104d46834 <+4>:  ldr    w8, [sp, #0x3c]
    0x104d46838 <+8>:  ldr    w9, [sp, #0x38]
    0x104d4683c <+12>: ldr    w10, [sp, #0x34]
    0x104d46840 <+16>: ldr    w11, [sp, #0x30]
    0x104d46844 <+20>: str    w0, [sp, #0x2c]
    0x104d46848 <+24>: str    w1, [sp, #0x28]
    0x104d4684c <+28>: str    w2, [sp, #0x24]
    0x104d46850 <+32>: str    w3, [sp, #0x20]
    0x104d46854 <+36>: str    w4, [sp, #0x1c]
    0x104d46858 <+40>: str    w5, [sp, #0x18]
    0x104d4685c <+44>: str    w6, [sp, #0x14]
    0x104d46860 <+48>: str    w7, [sp, #0x10]
->  0x104d46864 <+52>: ldr    w0, [sp, #0x2c]
    0x104d46868 <+56>: ldr    w1, [sp, #0x28]
    0x104d4686c <+60>: add    w0, w0, w1                ; 把 w0+w1的值放到w0,也就是參數(shù)1+參數(shù)2
    0x104d46870 <+64>: str    w11, [sp, #0xc]
    0x104d46874 <+68>: str    w10, [sp, #0x8]
    0x104d46878 <+72>: str    w8, [sp, #0x4]
    0x104d4687c <+76>: str    w9, [sp]
    0x104d46880 <+80>: add    sp, sp, #0x30             ; =0x30 
    0x104d46884 <+84>: ret    

根據(jù)我上述的備注饶深,他們吧結(jié)果放到w0餐曹,之后返回
所以我這邊做個簡單的總結(jié):

  • 參數(shù)會存放到X0到X7(W0到W7)這8個寄存器里面,如果超過8個參數(shù),就會入棧粥喜,返回值是通過x0進(jìn)行返回獲取
  • 由于操作堆棧會比操作寄存器更消耗性能凸主,所以我們的參數(shù)盡可能不要超過8個

拓展:

好像了解了函數(shù)的原理之后,沒啥用额湘?不是的卿吐,這對之后的逆向很有幫助,下面簡單說一下最大的用處在哪
對于了解過OC runtime的開發(fā)者來說 ,都知道OC調(diào)用函數(shù)锋华,都是通過 objc_msgSend 來實現(xiàn)的


5.png

objc_msgSend的第一個參數(shù)就是對象本身嗡官,第二個參數(shù)就是SEL,后面就是傳入這個SEL的具體參數(shù)
那么對于我們進(jìn)行動態(tài)調(diào)試得是有多大的益處呀~~嘿嘿

資源代碼:【https://github.com/qq631192328/CodeReverse

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末毯焕,一起剝皮案震驚了整個濱河市衍腥,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌纳猫,老刑警劉巖婆咸,帶你破解...
    沈念sama閱讀 222,000評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異芜辕,居然都是意外死亡尚骄,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,745評論 3 399
  • 文/潘曉璐 我一進(jìn)店門侵续,熙熙樓的掌柜王于貴愁眉苦臉地迎上來倔丈,“玉大人,你說我怎么就攤上這事状蜗⌒栉澹” “怎么了?”我有些...
    開封第一講書人閱讀 168,561評論 0 360
  • 文/不壞的土叔 我叫張陵轧坎,是天一觀的道長宏邮。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么蜀铲? 我笑而不...
    開封第一講書人閱讀 59,782評論 1 298
  • 正文 為了忘掉前任边琉,我火速辦了婚禮,結(jié)果婚禮上记劝,老公的妹妹穿的比我還像新娘变姨。我一直安慰自己,他們只是感情好厌丑,可當(dāng)我...
    茶點故事閱讀 68,798評論 6 397
  • 文/花漫 我一把揭開白布定欧。 她就那樣靜靜地躺著,像睡著了一般怒竿。 火紅的嫁衣襯著肌膚如雪砍鸠。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,394評論 1 310
  • 那天耕驰,我揣著相機(jī)與錄音爷辱,去河邊找鬼稽莉。 笑死卫袒,一個胖子當(dāng)著我的面吹牛灯抛,可吹牛的內(nèi)容都是我干的千康。 我是一名探鬼主播,決...
    沈念sama閱讀 40,952評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼善玫,長吁一口氣:“原來是場噩夢啊……” “哼官硝!你這毒婦竟也來了龄恋?” 一聲冷哼從身側(cè)響起趴生,我...
    開封第一講書人閱讀 39,852評論 0 276
  • 序言:老撾萬榮一對情侶失蹤阀趴,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后苍匆,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體刘急,經(jīng)...
    沈念sama閱讀 46,409評論 1 318
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,483評論 3 341
  • 正文 我和宋清朗相戀三年浸踩,在試婚紗的時候發(fā)現(xiàn)自己被綠了排霉。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,615評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡民轴,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出球订,到底是詐尸還是另有隱情后裸,我是刑警寧澤,帶...
    沈念sama閱讀 36,303評論 5 350
  • 正文 年R本政府宣布冒滩,位于F島的核電站微驶,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜因苹,卻給世界環(huán)境...
    茶點故事閱讀 41,979評論 3 334
  • 文/蒙蒙 一苟耻、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧扶檐,春花似錦凶杖、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,470評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至奈梳,卻和暖如春杈湾,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背攘须。 一陣腳步聲響...
    開封第一講書人閱讀 33,571評論 1 272
  • 我被黑心中介騙來泰國打工漆撞, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人于宙。 一個月前我還...
    沈念sama閱讀 49,041評論 3 377
  • 正文 我出身青樓浮驳,卻偏偏與公主長得像,于是被迫代替她去往敵國和親限煞。 傳聞我的和親對象是個殘疾皇子抹恳,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,630評論 2 359

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

  • bl和ret指令 bl標(biāo)號 將下一條指令的地址放入lr(x30)寄存器 轉(zhuǎn)到標(biāo)號處執(zhí)行指令 注意:當(dāng)我們遇到bl指...
    struggle3g閱讀 7,918評論 0 1
  • 關(guān)于CPU 寄存器 CPU除了有控制器、運算器還有寄存器署驻。其中寄存器的作用就是進(jìn)行數(shù)據(jù)的臨時存儲奋献。 CPU的運算速...
    CoderLWG閱讀 1,395評論 0 0
  • 002--函數(shù)本質(zhì) 關(guān)于CPU的補充 寄存器 CPU除了有控制器、運算器還有寄存器旺上。其中寄存器的作用就是進(jìn)行數(shù)據(jù)的...
    宵衣旰食閱讀 254評論 0 0
  • 關(guān)于CPU的補充 寄存器 CPU除了有控制器瓶蚂、運算器還有寄存器。其中寄存器的作用就是進(jìn)行數(shù)據(jù)的臨時存儲宣吱。 CPU的...
    lukyy閱讀 496評論 0 0
  • 一窃这、簡介 CPU中央處理器,內(nèi)部主要包括寄存器征候、運算器杭攻、控制器。 寄存器:存儲數(shù)據(jù) 運算器:處理數(shù)據(jù) 控制器:控制...
    yahibo閱讀 1,092評論 4 2