iOS逆向(二)函數(shù)本質(zhì)

概念

一弧呐、寄存器

1.數(shù)據(jù)地址寄存器

通常用來做數(shù)據(jù)計算的臨時存儲管引、累加士败、計數(shù)、地址保存等功能褥伴。定義這些寄存器的作用主要用于在CPU指令保存操作數(shù)拱烁,在CPU中當作常規(guī)變量來使用。

ARM64中

  • 64位:X0 - X30噩翠, XZR(零寄存器)
  • 32位:W0 - W30, WZR(零寄存器)是64位寄存器的低32位部分邦投,并不是獨立存在的

2.浮點和向量寄存器

因為浮點數(shù)存儲以及運算的特殊性伤锚,CPU中專門提供浮點寄存器來處理浮點數(shù)

  • 浮點寄存器 64位:D0 - D31 32位:S0 - S31

現(xiàn)在CPU支持向量運算(在圖形處理相關領域用的非常多)為了支持向量計算,系統(tǒng)也提供了眾多向量寄存器

  • 向量寄存器 128位:V0 - V31

3.SP和FP寄存器

  • SP寄存器在任意時刻會保存棧頂?shù)刂?/li>
  • FP寄存器也稱X29寄存器志衣,屬于通用寄存器屯援,但某些時刻用來保存棧底地址
    注:ARM64中,對棧的操作是16字節(jié)對齊的

4.X30寄存器

  • 存放的是函數(shù)的返回地址念脯,當ret指令執(zhí)行時刻狞洋,尋找X30保存的地址值

二、棧

棧是一種具有特殊訪問方式的存儲空間(后進先出绿店,Last In Out First吉懊,LIFO)

三庐橙、指令

str(store register) -> 變種stp(可以操作兩個寄存器)
將數(shù)據(jù)從寄存器中讀出來,存到內(nèi)存中

ldr(load register) -> 變種ldp(可以操作兩個寄存器)
將數(shù)據(jù)從內(nèi)存中讀出來借嗽,存到寄存器中

bl
將下一條指令地址放入lr(X30)寄存器
跳轉(zhuǎn)到標號處執(zhí)行指令

ret
默認使用lr(X30)寄存器的值态鳖,通過底層指令提示CPU此處作為下條指令地址
ARM64的特色指令,它面向硬件做了優(yōu)化處理

四恶导、函數(shù)的參數(shù)與返回值

ARM64下浆竭,函數(shù)的參數(shù)是存放在X0 - X7(W0 - W7)這8個寄存器中,如果超過8個參數(shù)惨寿,則會入棧
函數(shù)的返回值放在X0寄存器中

五邦泄、函數(shù)的局部變量

函數(shù)局部變量放在棧里

六、實踐

  1. 新建demo裂垦,添加匯編文件顺囊,匯編代碼


    添加匯編文件.png
  • 編寫匯編代碼
.text
.global _A  // 全局函數(shù)

_A:
sub sp, sp, #0x20       // 將sp減#0x20(向低地址拉伸棧空間32個字節(jié))
stp x0, x1, [sp, #0x10] // stp:操作兩個寄存器缸废,將x0,x1放入內(nèi)存  [sp, #0x10]:sp加上#0x10
ldp x1, x0, [sp, #0x10] // ldp:操作兩個寄存器包蓝,將sp內(nèi)容寫入寄存器,交換
add sp, sp, #0x20       // 棧平衡企量,如果不處理测萎,造成內(nèi)存不夠用,函數(shù)調(diào)用完不要了
ret
  • main中調(diào)用A函數(shù)届巩,設置斷點


    調(diào)用函數(shù).png

2.運行查看寄存器

  • 查看寄存器


    選擇查看寄存器.png
  • sp初始地址


    sp初始地址.png
  • 進入函數(shù)硅瞧,單步走


    sp從高地址往下拉伸32個字節(jié).png
  • 初始x0, x1中的值


    初始x0, x1中的值.png
  • 單步走,x0, x1中的值進行了交換


    x0, x1實現(xiàn)交換.png
  • CMD + Shift + M 查看寄存器變化


    查看寄存器變化.png

lldb:
單步執(zhí)行:ni
寫寄存器:register write x0 0xffffffff
讀寄存器:register read x0

?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末恕汇,一起剝皮案震驚了整個濱河市腕唧,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌瘾英,老刑警劉巖枣接,帶你破解...
    沈念sama閱讀 218,941評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異缺谴,居然都是意外死亡但惶,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,397評論 3 395
  • 文/潘曉璐 我一進店門湿蛔,熙熙樓的掌柜王于貴愁眉苦臉地迎上來膀曾,“玉大人,你說我怎么就攤上這事阳啥√硪辏” “怎么了?”我有些...
    開封第一講書人閱讀 165,345評論 0 356
  • 文/不壞的土叔 我叫張陵察迟,是天一觀的道長斩狱。 經(jīng)常有香客問我耳高,道長,這世上最難降的妖魔是什么喊废? 我笑而不...
    開封第一講書人閱讀 58,851評論 1 295
  • 正文 為了忘掉前任祝高,我火速辦了婚禮,結(jié)果婚禮上污筷,老公的妹妹穿的比我還像新娘工闺。我一直安慰自己,他們只是感情好瓣蛀,可當我...
    茶點故事閱讀 67,868評論 6 392
  • 文/花漫 我一把揭開白布陆蟆。 她就那樣靜靜地躺著,像睡著了一般惋增。 火紅的嫁衣襯著肌膚如雪叠殷。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,688評論 1 305
  • 那天诈皿,我揣著相機與錄音林束,去河邊找鬼。 笑死稽亏,一個胖子當著我的面吹牛壶冒,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播截歉,決...
    沈念sama閱讀 40,414評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼胖腾,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了瘪松?” 一聲冷哼從身側(cè)響起咸作,我...
    開封第一講書人閱讀 39,319評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎宵睦,沒想到半個月后记罚,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,775評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡壳嚎,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,945評論 3 336
  • 正文 我和宋清朗相戀三年桐智,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片诬辈。...
    茶點故事閱讀 40,096評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖荐吉,靈堂內(nèi)的尸體忽然破棺而出焙糟,到底是詐尸還是另有隱情,我是刑警寧澤样屠,帶...
    沈念sama閱讀 35,789評論 5 346
  • 正文 年R本政府宣布穿撮,位于F島的核電站缺脉,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏悦穿。R本人自食惡果不足惜攻礼,卻給世界環(huán)境...
    茶點故事閱讀 41,437評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望栗柒。 院中可真熱鬧礁扮,春花似錦、人聲如沸瞬沦。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,993評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽逛钻。三九已至僚焦,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間曙痘,已是汗流浹背芳悲。 一陣腳步聲響...
    開封第一講書人閱讀 33,107評論 1 271
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留边坤,地道東北人名扛。 一個月前我還...
    沈念sama閱讀 48,308評論 3 372
  • 正文 我出身青樓,卻偏偏與公主長得像惩嘉,于是被迫代替她去往敵國和親罢洲。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,037評論 2 355

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