作為一名愛(ài)折騰的開(kāi)發(fā)者,越不讓我用什么我就越想用,所以就有了這篇教程。
- 首先你需要一臺(tái)越獄的iOS設(shè)備,如果你確實(shí)沒(méi)有的話,你可以在此GitHub https://github.com/nst/iOS-Runtime-Headers 下載老外已經(jīng)class-dump好的所有庫(kù)
這里有人就會(huì)問(wèn)了,別人都已經(jīng)class-dump并且整理好了所有庫(kù),你干嘛還要從頭到尾做一遍?沒(méi)為什么,我就是愛(ài)折騰,伸手黨看到這里就夠了。
- 1、 在mac上安裝好iFunBox,如圖:

- 2、 從iOS 3.1開(kāi)始,包括frameworks在內(nèi)的許多庫(kù)文件被存進(jìn)了一個(gè)大cache里,這個(gè)cache文件位于“/System/Library/Caches/com.apple.dyld/dyld_shared_cache_armx”(名為dyld_shared_cache_armv7、dyld_shared_cache_armv7s或dyld_shared_cache_arm64),可以使用dyld_decache將其中的二進(jìn)制文件提取出來(lái)。使用dyld_decache之前,要將“/System/Library/Caches/com.apple.dyld/dyld_shared_cache_armx”用iFunBox從iOS拷貝到OSX中。然后從https://github.com/downloads/kennytm/Miscellaneous/dyld_decache[v0.1c].bz2 下載dyld_decache。解壓之后賦予其可執(zhí)行權(quán)限,如下:
lizhiyongdeiMac:~ lizhiyong$ chmod +x /Users/lizhiyong/Desktop/LeoCracker/dyld_decache\[v0.1c\]
然后開(kāi)始提取二進(jìn)制文件,如下:
lizhiyongdeiMac:~ lizhiyong$ /Users/lizhiyong/Desktop/LeoCracker/dyld_decache\[v0.1c\] -o /where/to/store/decached/binaries/ /Users/lizhiyong/Desktop/LeoCracker/dyld_shared_cache_armv7
這樣子我們提取出的所有二進(jìn)制文件都存放在了“/where/to/store/decached/binaries/”下,接下來(lái)就如何找到自己感興趣的庫(kù)并class-dump出他的頭文件
- 3、 舉個(gè)栗子
栗子
以前我工作的時(shí)候經(jīng)常要用到某些功能的私有API,而我只知道他的類(lèi)名:LSApplicationWorkspace,這個(gè)時(shí)候怎么從我們剛剛提取的所有的庫(kù)
提取的庫(kù)
找到我們真正想用到的庫(kù)呢?這個(gè)時(shí)候我們可以用到檢索目標(biāo)行命令:grep,具體代碼如下:
grep -r LSApplicationWorkspace /Users/lizhiyong/Desktop/LeoCracker/ios_system_framework/System/Library/Frameworks
終端輸出如圖:

看到輸出結(jié)果,也就是匹配到十個(gè)左右的庫(kù),這個(gè)時(shí)候發(fā)揮程序員敏銳的嗅覺(jué),發(fā)現(xiàn)了一個(gè)庫(kù):MobileCoreServices.framework,我們不妨嘗試class-dump這個(gè)庫(kù)看一下是否有LSApplicationWorkspace類(lèi)的頭文件。
- 4、現(xiàn)在我們正式學(xué)習(xí)如何class-dump出二進(jìn)制文件的頭文件。
首先去 http://stevenygard.com/projects/class-dump 下載最新版的class-dump,下載完后,將dmg文件里的class-dump復(fù)制到“/usr/bin”下,然后在Terminal中執(zhí)行“sudo chmod 777 /usr/bin/class-dump”命令賦予其執(zhí)行權(quán)限。運(yùn)行class-dump,即可看到它的一些基本參數(shù),如圖:

準(zhǔn)備工作做完之后,我們就開(kāi)始用class-dump導(dǎo)出剛剛發(fā)現(xiàn)的MobileCoreServices.framework里面的頭文件了,具體代碼如下:
lizhiyongdeiMac:~ lizhiyong$ class-dump -S -s -H /Users/lizhiyong/Desktop/LeoCracker/ios_system_framework/System/Library/Frameworks/MobileCoreServices.framework/MobileCoreServices -o /Users/lizhiyong/Desktop/LeoCracker/ios_system_framework/System/Library/Frameworks/MobileCoreServices.framework/headfile格式:class-dump
-S -s -H path/to/binaryFile -o /path/to/headers,path/to/binaryFile是庫(kù)的二進(jìn)制文件的路徑,/path/to/headers是你導(dǎo)出的頭文件要存儲(chǔ)的路徑。
導(dǎo)完之后我們查看導(dǎo)出的頭文件:

顯然我們要找的LSApplicationWorkspace類(lèi)的頭文件就在這里頭,打開(kāi)LSApplicationWorkspace.h,我們發(fā)現(xiàn)我們想要的功能的API都在里頭:

像這些方法名:
/+ (id)defaultWorkspace;
/- (id)allApplications;
/- (id)allInstalledApplications;
/- (BOOL)uninstallApplication:(id)arg1 withOptions:(id)arg2;
看到這些我們應(yīng)該都懂了,那么我們?cè)趺丛陧?xiàng)目中使用這些蘋(píng)果禁止的私有API呢,OC的runtime機(jī)制會(huì)告訴你答案,至于怎么像正常APP一樣上架AppStore呢,就需要發(fā)揮你程序員聰明機(jī)智的時(shí)候了。
(PS:這是我第一次寫(xiě)簡(jiǎn)書(shū),以前一直用OneNote記筆記,就覺(jué)得寫(xiě)簡(jiǎn)書(shū)寫(xiě)博客效率慢而且很浪費(fèi)時(shí)間,事實(shí)證明,確實(shí)很浪費(fèi)時(shí)間 -。- , 所以我打心底里感激那些寫(xiě)博客寫(xiě)書(shū)的作者們?。?/p>
參考:《iOS應(yīng)用逆向工程》

