什么是dyld
在iOS系統中,幾乎所有的程序都會用到動態庫,而動態庫在加載的時候都需要用dyld程序進行鏈接
dyld(位于/usr/lib/dyld)
什么是dyld緩存
很多系統庫幾乎都是每個程序都要用到的,與其在每個程序運行的時候一個一個將這些動態庫都加載進來,還不如先把它們打包好,一次加載進來來的快
dyld緩存在系統中位于“/System/Library/Caches/com.apple.dyld/”目錄
文件名是以“dyld_shared_cache_”開頭,再加上這個dyld緩存文件所支持的指令集。在這個目錄下,有可能有多個dyld緩存文件,對應所支持的不同指令集。
比如,在iPad Air 2上,該目錄下就存在兩個緩存文件:
因為iPad Air 2是64位的ARM(ARM v8)處理器,同時它也兼容32位的ARM應用,所以就要有兩個緩存文件。
dyld_shared_cache_arm64 對應64位的版本
dyld_shared_cache_armv7s 對應32位的版本。
到目前為止,所有iOS支持的ARM指令集有以下四種:
1)armv6
2)armv7
3)armv7s
4)arm64
沒有了系統庫的原始二進制版本是不是就沒法分析了呢?當然不是,我們還可以從dyld緩存文件中將系統庫的原始二進制文件給解出來。
目前,有兩個工具可以做到這點,一是dyld_decache,還有一個就是jtool。
dyld_decache
使用dyld_decache可以整體提取dyld緩存文件中的所有庫原始二進制文件:
dyld_decache [-o folder] [-f name [-f name] ...] path/to/dyld_shared_cache_armvX
-o用來指定提取出來的文件所要保存的路徑,如果不指定,默認就在當前目錄下創建一個叫做“library”的目錄保存。
-f用來說明要提取庫的名字,如果要提取的庫不止一個,那么每個庫的名字前面都要帶上-f。如果不指定默認行為就是把緩存文件中所有的庫文件全部都提取出來。
例如,如果想要解壓Security庫,可以使用下面的命令:
dyld_decache -o ./Security -f Security ./dyld_shared_cache_armv7s
jtool
前面也提到了,還可以用jtool來達到提取指定庫文件的目的:
jtool -extract name path/to/dyld_shared_cache_armvx
-extract用來指定要提取庫的名字。jtool默認不支持提取全部緩存中庫文件的功能,只能一個一個提取。