iOS編譯原理

hook改變函數(shù)的執(zhí)行流程砂心。

1.重定向:ASLR(隨機(jī)值) + 偏移值 = 內(nèi)存值
0x5FCC + 0x0000000102edc000 = 0x102ee1fcc
內(nèi)存中的可執(zhí)行文件叫做鏡像

viewdidload
0x102ee1fcc

可執(zhí)行文件
0x0000000102edc000

0x5FCC

重定向:通過計(jì)算找到內(nèi)部函數(shù)地址.
匯編指令和二進(jìn)制是一一對應(yīng)關(guān)系,如1f 20 03 d5 代表 nop
指針在arm64架構(gòu)下占8個(gè)字節(jié)

2.什么是符號綁定能扒?
本質(zhì)是修改符號表块茁,符號綁定的是外部函數(shù)齿坷。
內(nèi)部函數(shù)是重定向確定調(diào)用地址的桂肌。

3.每次調(diào)用外部符號的過程?
Symbol Stubs -> Lazy Symbol Pointers -> Non-Lazy
Symbol Pointers
1.找樁(Symbol Stubs)永淌,就是根據(jù)懶加載符號表里面的值調(diào)用
2.Lazy Symbol Pointers符號表里面的值(默認(rèn)值是執(zhí)行dyld_stub_binder)
3.首次調(diào)用:dyld_stub_binder,改變符號表里面的值崎场,指向真實(shí)地址.

第二次再次調(diào)用的話就直接調(diào)用符號表里的值了就是NSLog的真實(shí)地址了
Symbol Stubs -> Lazy Symbol Pointers

口述沒用,匯編+lldb調(diào)試才是王道

symbols是個(gè)總表:
內(nèi)部符號遂蛀、
外部符號:懶加載符號Lazy Symbol Pointers(運(yùn)行時(shí)確定地址)谭跨,非懶加載符號Non-Lazy
Symbol Pointers(如dyld_stub_binder,編譯時(shí)就確定了地址)李滴。
每一個(gè)外部函數(shù)都對應(yīng)一個(gè)樁

4.Fishhook如何修改符號螃宙?原理?
Fishhook專門hook外部函數(shù)的

text 只讀的不能改的所坯,所以改的是Lazy Symbol Pointers

5.Fishhook 如何通過字符串找到符號?即Fishhook改符號原理
string Table Index -> symbols Index -> Indirect Symbols Index -> Lazy Symbol Pointers -> 修改Lazy Symbol Pointers值

1谆扎、去MachO 中尋找 string Table 完全可以用 . 來分割! 得到偏移值(string Table Index)
2芹助、通過string Table Index 去找Symbols(符號表)堂湖!得到符號表的偏移值(symbols Index)
3、通過 symbols Index 去找 Indirect Symbols周瞎! 得到符號的偏移值 ( Indirect Symbols Index)
4苗缩、由于Lazy Symbol Pointers 的 Index 和 Indirect Symbols Index 一一對應(yīng)饵蒂! 所以很容易就找到了對應(yīng)的符號I睢!

最后去修改Lazy Symbol 里面的值M硕ⅰ彼乌!
(因?yàn)橥獠糠柕恼{(diào)用,都是找樁渊迁!樁去尋找Lazy Symbol 里面的地址執(zhí)行N空铡)

6.如何去掉符號?
build setting strip style 默認(rèn)去掉符號表中的所有符號

strip style
APP的話選擇 All Symbols 去掉本地符號琉朽,只剩間接符號
動態(tài)庫的話選擇 Non-Global Symbols 去掉本地符號毒租,剩下全局符號、間接符號
Debugging Symbols 去掉調(diào)試符號 剩下本地箱叁、全局墅垮、間接符號

Deployment Postprocessing 設(shè)置 yes debug階段去除符號 no是在打包時(shí)去除符號即默認(rèn)值

本地符號,如果不使用耕漱,符號不會生成

7.如何恢復(fù)符號算色?
在終端執(zhí)行下面語句使用使用restore-symbol工具
./restore-symbol restore-symbol -o SymbolDemo1

  1. 如何通過函數(shù)調(diào)用棧算出函數(shù)名?
    將函數(shù)調(diào)用棧地址-程序的鏡像地址 然后在hopper中搜索改地址

9.兩個(gè)動態(tài)庫中的同名類調(diào)用會沖突嗎螟够?
并不會灾梦,動態(tài)庫方法的調(diào)用峡钓,先找動態(tài)庫,再去里面找符號若河,所以動態(tài)庫不存在符號沖突能岩。
誰在上邊就先找到誰

靜態(tài)庫:
1.當(dāng)靜態(tài)庫沒有使用的符號(符號 的最小單位是類),那么靜態(tài)庫不會被鏈接牡肉。
2.當(dāng)鏈接器找到符號之后捧灰,就不會再鏈接相同的符號了
誰在上邊就先連接到誰

使用靜態(tài)庫中的分類方法會發(fā)生什么?會找不到方法统锤,因?yàn)榉诸悤r(shí)動態(tài)添加的毛俏,靜態(tài)庫中的分類方法默認(rèn)不會鏈接進(jìn)來。如何解決饲窿?在Other Link Flags 添加 -ObjC 就是把所有OC代碼都鏈接進(jìn)來

如何可以發(fā)生靜態(tài)庫沖突煌寇?一個(gè)靜態(tài)庫是-ObjC,另一個(gè)也有同名類方法逾雄,這時(shí)候編譯就會報(bào)錯(cuò)阀溶。
如何解決?在Other Link Flags中加2行鸦泳,-force_load ,絕對路徑(也可以使用環(huán)境變量)
設(shè)置主鏈接

如果用到了2個(gè)靜態(tài)庫银锻,各自又有相同名字的的類目方法,導(dǎo)致了符號沖突怎么解決做鹰?
這個(gè)時(shí)候就只能使用工具llvm-objcopy去添加前綴去修改符號了击纬。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市钾麸,隨后出現(xiàn)的幾起案子更振,更是在濱河造成了極大的恐慌,老刑警劉巖饭尝,帶你破解...
    沈念sama閱讀 217,542評論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件肯腕,死亡現(xiàn)場離奇詭異,居然都是意外死亡钥平,警方通過查閱死者的電腦和手機(jī)实撒,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,822評論 3 394
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來涉瘾,“玉大人知态,你說我怎么就攤上這事∷冢” “怎么了肴甸?”我有些...
    開封第一講書人閱讀 163,912評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長囚巴。 經(jīng)常有香客問我原在,道長友扰,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,449評論 1 293
  • 正文 為了忘掉前任庶柿,我火速辦了婚禮村怪,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘浮庐。我一直安慰自己甚负,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,500評論 6 392
  • 文/花漫 我一把揭開白布审残。 她就那樣靜靜地躺著梭域,像睡著了一般。 火紅的嫁衣襯著肌膚如雪搅轿。 梳的紋絲不亂的頭發(fā)上病涨,一...
    開封第一講書人閱讀 51,370評論 1 302
  • 那天,我揣著相機(jī)與錄音璧坟,去河邊找鬼既穆。 笑死,一個(gè)胖子當(dāng)著我的面吹牛雀鹃,可吹牛的內(nèi)容都是我干的幻工。 我是一名探鬼主播,決...
    沈念sama閱讀 40,193評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼黎茎,長吁一口氣:“原來是場噩夢啊……” “哼囊颅!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起工三,我...
    開封第一講書人閱讀 39,074評論 0 276
  • 序言:老撾萬榮一對情侶失蹤迁酸,失蹤者是張志新(化名)和其女友劉穎先鱼,沒想到半個(gè)月后俭正,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,505評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡焙畔,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,722評論 3 335
  • 正文 我和宋清朗相戀三年掸读,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片宏多。...
    茶點(diǎn)故事閱讀 39,841評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡儿惫,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出伸但,到底是詐尸還是另有隱情肾请,我是刑警寧澤,帶...
    沈念sama閱讀 35,569評論 5 345
  • 正文 年R本政府宣布更胖,位于F島的核電站铛铁,受9級特大地震影響隔显,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜饵逐,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,168評論 3 328
  • 文/蒙蒙 一括眠、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧倍权,春花似錦掷豺、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,783評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至默辨,卻和暖如春生年,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背廓奕。 一陣腳步聲響...
    開封第一講書人閱讀 32,918評論 1 269
  • 我被黑心中介騙來泰國打工抱婉, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人桌粉。 一個(gè)月前我還...
    沈念sama閱讀 47,962評論 2 370
  • 正文 我出身青樓蒸绩,卻偏偏與公主長得像,于是被迫代替她去往敵國和親铃肯。 傳聞我的和親對象是個(gè)殘疾皇子患亿,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,781評論 2 354

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