作為一名愛折騰的開發者,越不讓我用什么我就越想用,所以就有了這篇教程。
- 首先你需要一臺越獄的iOS設備,如果你確實沒有的話,你可以在此GitHub https://github.com/nst/iOS-Runtime-Headers 下載老外已經class-dump好的所有庫
這里有人就會問了,別人都已經class-dump并且整理好了所有庫,你干嘛還要從頭到尾做一遍?沒為什么,我就是愛折騰,伸手黨看到這里就夠了。
- 1、 在mac上安裝好iFunBox,如圖:
- 2、 從iOS 3.1開始,包括frameworks在內的許多庫文件被存進了一個大cache里,這個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將其中的二進制文件提取出來。使用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。解壓之后賦予其可執行權限,如下:
lizhiyongdeiMac:~ lizhiyong$ chmod +x /Users/lizhiyong/Desktop/LeoCracker/dyld_decache\[v0.1c\]
然后開始提取二進制文件,如下:
lizhiyongdeiMac:~ lizhiyong$ /Users/lizhiyong/Desktop/LeoCracker/dyld_decache\[v0.1c\] -o /where/to/store/decached/binaries/ /Users/lizhiyong/Desktop/LeoCracker/dyld_shared_cache_armv7
這樣子我們提取出的所有二進制文件都存放在了“/where/to/store/decached/binaries/”下,接下來就如何找到自己感興趣的庫并class-dump出他的頭文件
- 3、 舉個栗子
栗子
以前我工作的時候經常要用到某些功能的私有API,而我只知道他的類名:LSApplicationWorkspace,這個時候怎么從我們剛剛提取的所有的庫
提取的庫
找到我們真正想用到的庫呢?這個時候我們可以用到檢索目標行命令:grep,具體代碼如下:
grep -r LSApplicationWorkspace /Users/lizhiyong/Desktop/LeoCracker/ios_system_framework/System/Library/Frameworks
終端輸出如圖:
看到輸出結果,也就是匹配到十個左右的庫,這個時候發揮程序員敏銳的嗅覺,發現了一個庫:MobileCoreServices.framework,我們不妨嘗試class-dump這個庫看一下是否有LSApplicationWorkspace類的頭文件。
- 4、現在我們正式學習如何class-dump出二進制文件的頭文件。
首先去 http://stevenygard.com/projects/class-dump 下載最新版的class-dump,下載完后,將dmg文件里的class-dump復制到“/usr/bin”下,然后在Terminal中執行“sudo chmod 777 /usr/bin/class-dump”命令賦予其執行權限。運行class-dump,即可看到它的一些基本參數,如圖:
準備工作做完之后,我們就開始用class-dump導出剛剛發現的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是庫的二進制文件的路徑,/path/to/headers是你導出的頭文件要存儲的路徑。
導完之后我們查看導出的頭文件:
顯然我們要找的LSApplicationWorkspace類的頭文件就在這里頭,打開LSApplicationWorkspace.h,我們發現我們想要的功能的API都在里頭:
像這些方法名:
/+ (id)defaultWorkspace;
/- (id)allApplications;
/- (id)allInstalledApplications;
/- (BOOL)uninstallApplication:(id)arg1 withOptions:(id)arg2;
看到這些我們應該都懂了,那么我們怎么在項目中使用這些蘋果禁止的私有API呢,OC的runtime機制會告訴你答案,至于怎么像正常APP一樣上架AppStore呢,就需要發揮你程序員聰明機智的時候了。
(PS:這是我第一次寫簡書,以前一直用OneNote記筆記,就覺得寫簡書寫博客效率慢而且很浪費時間,事實證明,確實很浪費時間 -。- , 所以我打心底里感激那些寫博客寫書的作者們!)
參考:《iOS應用逆向工程》