iOS/MacOS lazy bind

iOS由MacOS系統(tǒng)修改而來(lái),所以很多機(jī)制是相同的,與Android-Linux相比相似性更高。iOS符號(hào)分為自動(dòng)non-lazy和lazy綁定符號(hào),non-lazy符號(hào)位于Mach-O文件__DATA Segment 的__nl_symbol_ptr section,lazy符號(hào)位于__DATA Segment 的__la_symbol_ptr section。對(duì)于non-lazy的符號(hào)綁定時(shí)機(jī)為動(dòng)態(tài)庫(kù)加載(load),lazy符號(hào)的綁定時(shí)機(jī)則與Linux相同即函數(shù)第一次被調(diào)用。

測(cè)試代碼

#include <stdio.h>

int main(int argc, const char * argv[]) {
    // insert code here...
    printf("Hello, World!\n");
    printf("Hello World Again!\n");
    return 0;
}

lldb 調(diào)試

反匯編main函數(shù)

+34為調(diào)用第一個(gè)printf函數(shù),+51第二次調(diào)用printf函數(shù)。
二進(jìn)制文件DATA段有兩個(gè)section

DATA Segment

不用展開(kāi)也應(yīng)該能猜到是哪兩個(gè)sction,section[0]為_(kāi)_nl_symbol_ptr section[1]為_(kāi)_la_symbol_ptr 。回到匯編代碼,printf函數(shù)的地址無(wú)論第一次還是第二次都是0x100000f66,這個(gè)地址來(lái)自哪呢?

add.PNG

由上圖可知,0x100000f66值為_(kāi)_TEXT Segment中的__stub section。
該section的作用解釋如下

  • section (__TEXT,__stubs) - section contains stubs with prefix imp___stubs__. That stubs are used in the code of __text section to compile procedures with external dependencies, such as system NSLog. dyld (dynamic linker) will replace such stubs on runtime with actual place in dynamic library.
    大意就是該section保存的是編譯過(guò)程中的外部依賴,在運(yùn)行時(shí)動(dòng)態(tài)鏈接器dyld將其替換為實(shí)際位置 PS:靈魂翻譯

call下斷,si進(jìn)去



程序jmpq 0x0000000100000f7c,在__la_symbol_ptr section address中符號(hào)的地址為0x0000000100001010

ladd.PNG
值相等

繼續(xù)調(diào)試

Screen Shot 2017-05-09 at 1.22.04 PM.png

0x0000000100000f7c僅將0x0壓棧后就jmp回0x100000f6c,printf函數(shù)的地址查詢最終是通過(guò)dyld_stub_binder函數(shù)實(shí)現(xiàn)。dyld_stub_binder中符號(hào)查找原理可以參考fishhook

看了以上匯編是否覺(jué)得與Linux PLT頗有幾分相似?
0x0同樣為索引

調(diào)用dyld_stub_binder前堆棧信息

第二次調(diào)用printf

Screen Shot 2017-05-09 at 1.37.54 PM.png

綁定結(jié)束,從此可以直接調(diào)用相應(yīng)函數(shù)

返匯編

參考:

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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

  • 關(guān)注倉(cāng)庫(kù),及時(shí)獲得更新:iOS-Source-Code-AnalyzeFollow: Draveness · Gi...
    Draveness閱讀 6,070評(píng)論 5 33
  • 13. Hook原理介紹 13.1 Objective-C消息傳遞(Messaging) 對(duì)于C/C++這類靜態(tài)語(yǔ)...
    Flonger閱讀 1,453評(píng)論 0 3
  • 13.1 Objective-C消息傳遞(Messaging) 對(duì)于C/C++這類靜態(tài)語(yǔ)言,調(diào)用一個(gè)方法其實(shí)就是跳...
    泰克2008閱讀 2,109評(píng)論 1 6
  • 上一篇博客介紹了mach_header相關(guān)內(nèi)容,Mach-O文件介紹之mach_header。這篇博客主要介紹Ma...
    Tomychen閱讀 2,428評(píng)論 0 7
  • 她珍惜所有她的書(shū),就如同珍惜所有真摯的情感。她認(rèn)真對(duì)待所有書(shū)里傳達(dá)的信息,就如同她也認(rèn)真對(duì)待每一件事的思考。...
    aqua3751閱讀 236評(píng)論 0 0