目錄
一,APP從開發(fā)到安裝的過程
二啦膜,class-dump
三,Hopper Disassembler
四淌喻,動態(tài)庫共享緩存
五僧家,Mach-O文件類型
六,Mach-O基本結(jié)構(gòu)
一裸删,APP從開發(fā)到安裝的過程
1八拱,打包
- 圖解
- 說明
1>代碼會被編譯為可執(zhí)行文件
2>可執(zhí)行文件的格式為Mach-O
2,安裝
- 圖解
- 說明
1>有證書才能安裝
2>手機(jī)版本不低于目標(biāo)版本才能安裝
二烁落,class-dump
1乘粒,介紹
它能夠?qū)С?code>Mach-O文件中所有的
.h
文件
2,使用
- 將
class-dump
可執(zhí)行文件添加到Mac的/usr/local/bin
目錄下
- 用愛思助手安裝APP
- 在下載中心中找到
ipa
文件并解壓
- 在包內(nèi)容中找到
Mach-O
文件并拷貝到桌面上
- 用
class-dump
導(dǎo)出.h
文件:class-dump -H [Mach-O文件路徑] -o [.h文件存放路徑]
1>從App Store下載的是經(jīng)過加密的伤塌,暫時無法導(dǎo)出(需要先脫殼)
2>自己打的包沒有加密,可以導(dǎo)出
三轧铁,Hopper Disassembler
1每聪,代碼編譯過程
- 圖解
- 說明
1>
Mach-O
文件中的是機(jī)器代碼
2>匯編代碼和機(jī)器代碼是一一對應(yīng)的,所以機(jī)器代碼能夠完全反編譯為匯編代碼
3>不同的OC代碼編譯出來的匯編代碼可能是一樣的齿风,所以匯編代碼不能完全反編譯為OC代碼
2药薯,Hopper工具
- 介紹
1>它能將
Mach-O
文件的機(jī)器代碼反編譯為匯編代碼和OC偽代碼
2>下載地址:http://www.sdifen.com/hopperdisassembler408.html
- 使用
1>將
Mach-O
文件拖入其中并選擇arm64
2>從App Store下載的是經(jīng)過加密的,基本無法閱讀(需要先脫殼)
3>自己打的包沒有加密救斑,可以閱讀
4>機(jī)器代碼童本,匯編代碼,OC偽代碼
四脸候,動態(tài)庫共享緩存
1穷娱,動態(tài)庫存放位置
-
/System/Library/Frameworks
中只有動態(tài)庫的描述文件
- 動態(tài)庫的
Mach-O
文件存放在/System/Library/Caches/com.apple.dyld
中的共享緩存文件里
- 共享緩存文件是所有APP共用的绑蔫,這樣能夠節(jié)省內(nèi)存開銷
- ARM處理器指令集架構(gòu)
1>四種架構(gòu):
armv6
,armv7
泵额,armv7s
配深,arm64
2>從iPhone5s開始使用arm64
架構(gòu)
3>架構(gòu)具有向下兼容的特性
2,動態(tài)庫加載
- 我們傳的是
/System/Library/Frameworks
路徑嫁盲,系統(tǒng)是如何加載共享緩存文件中動態(tài)庫的
- 系統(tǒng)是利用
/usr/lib
目錄下dyld
程序來加載的
-
dyld
是dynamic link editor
(動態(tài)鏈接編輯器)的縮寫(源碼地址:https://opensource.apple.com/tarballs/dyld)
3篓叶,動態(tài)庫提取
- Hopper能夠識別共享緩存文件,將
dyld_shared_cache_arm64
從iPhone中導(dǎo)出羞秤,然后拖入其中
- 手動從共享緩存文件中提取動態(tài)庫
1>將
dsc_extractor.cpp
文件中#if 0
上面的代碼和#endif
注釋掉2>進(jìn)入
dsc_extractor.cpp
文件所在的目錄缸托,執(zhí)行:clang++ -o dsc_extractor dsc_extractor.cpp
,會生成一個可執(zhí)行文件3>將可執(zhí)行文件和
dyld_shared_cache_arm64
文件放入同一個目錄下瘾蛋,進(jìn)入該目錄執(zhí)行:./dsc_extractor dyld_shared_cache_arm64 arm64
4>抽取
arm64
報錯俐镐,因為從Xcode10開始不能使用dsc_extractor.bundle
,但不影響armv7s
五瘦黑,Mach-O文件類型
1京革,介紹
Mach-O
是Mach Object
的縮寫,它是Mac和iOS系統(tǒng)上多種文件的存儲格式所有
Mach-O
格式的文件類型(源碼地址:https://opensource.apple.com/tarballs/xnu)
- 在Xcode中查看
target
的Mach-O
類型(一般無需修改)
2幸斥,常見文件類型
MH_OBJECT
1>目標(biāo)文件(
.o
)2>靜態(tài)庫(
.a
)
-
MH_EXECUTE
:可執(zhí)行文件
-
MH_DYLIB
:動態(tài)庫
1>
.dylib
2>
.framework
-
MH_DYLINKER
:動態(tài)鏈接編輯器
-
MH_DSYM
:符號信息文件(.dSYM
)
3匹摇,dyld用于加載以下文件
MH_EXECUTE
:可執(zhí)行文件MH_DYLIB
:動態(tài)庫MH_BUNDLE
:包文件
4,通用二進(jìn)制文件(universal binary)
- 介紹
1>不同的設(shè)備架構(gòu)是不一樣的甲葬,比如:iPhone4是
armv7
廊勃,iPhone5是armv7s
,iPhone6是arm64
2>為了讓我們開發(fā)的APP能夠運(yùn)行在不同的設(shè)備上经窖,生成的可執(zhí)行文件必須包含不同架構(gòu)的二進(jìn)制文件坡垫,該可執(zhí)行文件就稱為通用二進(jìn)制文件
3>在設(shè)備上運(yùn)行時只會執(zhí)行對應(yīng)架構(gòu)的代碼,不會增加內(nèi)存的開銷
4>因為比單一架構(gòu)的文件大画侣,所以也被稱為“胖二進(jìn)制文件”(
fat binary
)
- 在Xcode中查看
target
的架構(gòu)類型(一般無需修改)
- 將通用二進(jìn)制文件拆分為不同架構(gòu)的二進(jìn)制文件:
lipo [通用文件名] -thin [架構(gòu)名稱] -output [輸出文件名]
- 將不同架構(gòu)的二進(jìn)制文件合并為通用二進(jìn)制文件:
lipo -create [單一文件名1] [單一文件名2] -output [輸出文件名]
- Hopper能夠識別通用二進(jìn)制文件
六冰悠,Mach-O基本結(jié)構(gòu)
1,結(jié)構(gòu)
- 說明
1>
Header
:文件類型配乱、架構(gòu)類型等信息
2>Load commands
:描述文件數(shù)據(jù)在內(nèi)存中是如何分布的
3>Raw segment data
:文件數(shù)據(jù)在內(nèi)存中的具體分布
2溉卓,用otool命令查看結(jié)構(gòu)信息
3,用MachOView工具查看結(jié)構(gòu)信息
下載地址:https://sourceforge.net/projects/machoview