0x01.簡介
Wrox Press Mac OS X and iOS Internals, To the Apple’s Core (2013).pdf PAGE164有描述:
支持動態(tài)庫插入(Interposing)功能隆圆,是蘋果加載器dyld在傳統(tǒng)加載器的一個不同的地方。通過向宏DYLD_INSERT_LIBRARIES里寫入動態(tài)庫完整路徑甸陌。就可以在執(zhí)行文件加載時將該動態(tài)庫插入敌蚜。
dyld源代碼部分:
include/mach-o/dyld-interposing.h
#if !defined(_DYLD_INTERPOSING_H_)
#define _DYLD_INTERPOSING_H_
/* Example:
* static
* int
* my_open(const char* path, int flags, mode_t mode)
* {
* int value;
* // do stuff before open (including changing the arguments)
* value = open(path, flags, mode);
* // do stuff after open (including changing the return value(s))
* return value;
* }
* DYLD_INTERPOSE(my_open, open)
*/
#define DYLD_INTERPOSE(_replacment,_replacee) \
__attribute__((used)) static struct{ const void* replacment; const void* replacee; }
_interpose_##_replacee \
__attribute__ ((section (“__DATA,__interpose”))) = { (const void*)(unsigned
long)&_replacment, (const void*)(unsigned long)&_replacee };
#endif
Interposing就是說注入的動態(tài)庫會創(chuàng)建一個叫做__interpose的數(shù)據(jù)段房铭,里面放好原始函數(shù)的地址竟坛,以及替換函數(shù)的地址丈甸,dyld在加載時對跳轉(zhuǎn)地址進行替換线得。(這段是看雪上找的)
0x02.來實踐
又到了小白照貓畫虎的時間了
先在Xcode里面創(chuàng)建一個普通的view app工程
左下角(左邊的第二個左下角)點擊加號够话,創(chuàng)建framework庫
然后在insert文件夾下添加InsertClass類虾攻,如圖寫一個load類,打印一條log信息
這里環(huán)節(jié)結(jié)束之后先點擊運行更鲁,設(shè)備選擇越獄的air2霎箍,這樣就會生成相應(yīng)的insert.framework了。
把生成的framework上傳到air2的/var/root目錄下
切換到設(shè)備里澡为,先ps -A | grep "/var"找一下應(yīng)用
使用DYLD_INSERT_LIBRARIES命令把上傳的insert庫插入到執(zhí)行的app里
這里就向宏DYLD_INSERT_LIBRARIES里寫入動態(tài)庫完整路徑漂坏,在執(zhí)行文件加載時將該動態(tài)庫插入。
這里打印出來log媒至,說明在執(zhí)行文件加載的時候動態(tài)庫是插入成功了的
0x03.冥想
當我做完這一頓照貓畫虎按圖索驥的工作之后顶别,我砸殼下來拖入爛蘋果查看LC_LOAD_DYLIB section,因為動態(tài)庫注入的原理應(yīng)該是添加一個LC_LOAD_DYLIB section(拒啰?驯绎??)谋旦,但是并沒有發(fā)現(xiàn)增加的有LC_LOAD_DYLIB section剩失。我當時就很疑惑,log是打印成功的册着,說明動態(tài)庫插入是實現(xiàn)了的拴孤。但是并沒有多出一個LC_LOAD_DYLIB section的原因,據(jù)我個人看法甲捏,DYLD_INSERT_LIBRARIES插入動態(tài)庫只是在可執(zhí)行文件加載的時候臨時添加樁區(qū)依賴等等來讓可執(zhí)行文件執(zhí)行插入的方法演熟,并沒有真正打包進可執(zhí)行文件,所以自然是不能在原本的可執(zhí)行文件中找到增加的庫了(如何打包進可執(zhí)行文件)司顿。想來我是把概念搞混淆了芒粹。