一撞牢、APP從開發(fā)到安裝到手機的過程
-
1.1介却、生成ipa包的過程
- 選擇手機下的可執(zhí)行文件
-
1.2童叠、真正安裝的過程
- 安裝方式一:Xcode 直接跑在手機上
- 安裝方式二:上傳到 App Store 下載
- 安裝方式三:使用 通過PP助手结闸、iFunBox辩诞、Xcode等工具安裝坎弯,我采用的是 PP助手,直接把
1.1
里面的ipa直接拖進去就好
PP助手
二译暂、逆向APP的思路
- 2.1抠忘、界面分析,工具如下外永,在上一篇博客:iOS逆向-day3:Cycript 有介紹
Cycript崎脉、Reveal - 2.2、代碼分析
對Mach-O文件的靜態(tài)分析
MachOView伯顶、class-dump囚灼、Hopper Disassembler、ida等 - 2.3祭衩、動態(tài)調(diào)試
對運行中的APP進行代碼調(diào)試
debugserver灶体、LLDB - 2.4、代碼編寫
注入代碼到APP中
必要時還可能需要重新簽名掐暮、打包ipa
三蝎抽、class-dump
-
3.1、class-dump 介紹
-
顧名思義路克,它的作用就是把Mach-O文件的class信息給dump出來(把類信息給導出來)织中,生成對應的.h頭文件
class-dump -
下載完工具包后將class-dump文件復制到Mac的
/usr/local/bin
目錄锥涕,這樣在終端就能識別class-dump命令了
-
-
3.2、常用格式
class-dump -H Mach-O 文件路徑 -o 頭文件存放目錄
-
-H
表示要生成頭文件 -
-o
用于制定頭文件的存放目錄
- 舉例:我們以
一
里面我們自己的app:qainshou
為例狭吼,首先拿到qainshou.ipa
- 我們可以看到上面最后一步,.h文件都可以拿到
- 提示:如果大家是從PP助手下載的非越獄的app殖妇,在執(zhí)行上面的操作的時候可能只會拿到一個文件:
CDStructures.h
文件刁笙,后面會說到砸殼
-
四、代碼編譯過程 (OC或者Swift語言怎么變成Mach-O
文件)
- 4.1谦趣、在同一種架構(gòu)平臺下疲吸,每一條匯編指令都有與之對應的唯一的機器指令
- 4.2、不同的OC代碼前鹅,編譯出來的匯編代碼可能是一樣的
五摘悴、Hopper Disassmbler
- 5.1、Hopper Disassmbler介紹
- Hopper Disassmbler能夠?qū)ach-O文件的機器語言代碼反編譯成匯編代碼舰绘、OC偽代碼或者Swift偽代碼
- 常用快捷鍵:
Shift + Option + X
找出哪里引用了這個方法
- 5.2蹂喻、使用方法:
首先找打mach-o文件(上面1.1或者3.2都有介紹找到
Mach-O
文件)-
打開軟件 Hopper Disassmbler 把mach-o文件拖入軟件內(nèi)
-
可以的到匯編代碼如下圖
-
把匯編代碼轉(zhuǎn)為偽代碼
六、動態(tài)庫共享緩存(dyld shared cache)
-
6.1泞坦、從
iOS3.1
開始做粤,為了提高性能谣旁,絕大部分的系統(tǒng)動態(tài)庫文件都打包存放到了一個緩存文件中(dyld shared cache)- 緩存文件路徑:
/System/Library/Caches/com.apple.dyld/dyld_shared_cache_armX
- 緩存文件路徑:
-
6.2、dyld_shared_cache_armX的X代表ARM處理器指令集架構(gòu)
- v6
iPhone蔓彩、iPhone3G
iPod Touch、iPod Touch2 - v7
iPhone3GS驳概、iPhone4赤嚼、iPhone4S
iPad、iPad2顺又、iPad3(The New iPad)
iPad mini
iPod Touch3G更卒、iPod Touch4、iPod Touch5 - v7s
iPhone5待榔、iPhone5C
iPad4 - arm64
iPhone5S逞壁、iPhone6、iPhone6 Plus锐锣、iPhone6S腌闯、iPhone6S Plus
iPhoneSE、iPhone7雕憔、iPhone7 Plus姿骏、iPhone8、iPhone8 Plus斤彼、iPhoneX
iPad5分瘦、iPad Air蘸泻、iPad Air2、iPad Pro嘲玫、iPad Pro2
iPad mini with Retina display悦施、iPad mini3、iPad mini4
iPod Touch6
- 所有指令集原則上都是向下兼容的
- 動態(tài)庫共享緩存一個非常明顯的好處是節(jié)省內(nèi)存
-
現(xiàn)在的ida去团、Hopper反編譯工具都可以識別動態(tài)庫共享緩存
動態(tài)庫共享緩存
- v6
七抡诞、動態(tài)庫的加載
- 7.1、在
Mac\iOS
中土陪,是使用了/usr/lib/dyld
程序來加載動態(tài)庫-
dyld
dynamic link editor昼汗,動態(tài)鏈接編輯器
dynamic loader,動態(tài)加載器提示:dyld源碼
-
- 7.2鬼雀、從動態(tài)庫共享緩存抽取動態(tài)庫
可以使用dyld源碼中的launch-cache/dsc_extractor.cpp-
將
#if 0
前面的代碼刪除(包括#if 0
)顷窒,把最后面的#endif
也刪掉
-
編譯dsc_extractor.cpp
clang++ -o dsc_extractor dsc_extractor.cpp
-
使用dsc_extractor
./dsc_extractor 動態(tài)庫共享緩存文件的路徑 用于存放抽取結(jié)果的文件夾
-
八、Mach-O文件
8.1源哩、Mach-O 是
Mach object
的縮寫鞋吉,是Mac\iOS
上用于存儲程序、庫的標準格式-
8.2璧疗、屬于Mach-O格式的文件類型有
- 可以在xnu源碼中坯辩,查看到Mach-O格式的詳細定義
- EXTERNAL_HEADERS/mach-o/fat.h
- EXTERNAL_HEADERS/mach-o/loader.h
- 可以在xnu源碼中坯辩,查看到Mach-O格式的詳細定義
-
8.3、常見的 Mach-O 文件類型
- MH_OBJECT
目標文件(.o)
靜態(tài)庫文件(.a)崩侠,靜態(tài)庫其實就是N個.o合并在一起 - MH_EXECUTE:可執(zhí)行文件
.app/xx - MH_DYLIB:動態(tài)庫文件
.dylib
.framework/xx - MH_DYLINKER:動態(tài)鏈接編輯器
/usr/lib/dyld - MH_DSYM:存儲著二進制文件符號信息的文件
.dSYM/Contents/Resources/DWARF/xx(常用于分析APP的崩潰信息)
-
提示:在Xcode中查看target的Mach-O類型
- MH_OBJECT
-
8.4漆魔、Mach-O 的基本結(jié)構(gòu)
- 官方描述
https://developer.apple.com/library/content/documentation/DeveloperTools/Conceptual/MachOTopics/0-Introduction/introduction.html - 一個Mach-O文件包含3個主要區(qū)域
-
Header
:文件類型、目標架構(gòu)類型等 -
Load commands
:描述文件在虛擬內(nèi)存中的邏輯結(jié)構(gòu)却音、布局 -
Raw segment data
:在Load commands中定義的Segment的原始數(shù)據(jù)
-
- 官方描述
-
8.5改抡、窺探Mach-O的結(jié)構(gòu)
-
命令行工具
file:查看Mach-O的文件類型file 文件路徑
- 這里以我在桌面的 qainshou 的Mach-O文件為例
otool:查看Mach-O特定部分和段的內(nèi)容
lipo:常用于多架構(gòu)Mach-O文件的處理- 查看架構(gòu)信息:lipo -info 文件路徑
導出某種特定架構(gòu):lipo 文件路徑 -thin 架構(gòu)類型 -output 輸出文件路徑
合并多種架構(gòu):lipo 文件路徑1 文件路徑2 -output 輸出文件路徑
GUI工具:MachOView,官網(wǎng)下載完使用是有問題的系瓢,建議去我的QQ群:
584599353
的逆向文件里面獲取
-
-
8.6阿纤、Universal Binary(通用二進制文件)
- 通用二進制文件
同時適用于多種架構(gòu)的二進制文件
包含了多種不同架構(gòu)的獨立的二進制文件 - 因為需要儲存多種架構(gòu)的代碼,通用二進制文件通常比單一平臺二進制的程序要大
- 由于兩種架構(gòu)有共同的一些資源夷陋,所以并不會達到單一版本的兩倍之多
- 由于執(zhí)行過程中欠拾,只調(diào)用一部分代碼,運行起來也不需要額外的內(nèi)存
- 因為文件比原來的要大骗绕,也被稱為“胖二進制文件”(Fat Binary)
- 通用二進制文件
-
8.6藐窄、dyld 和 Mach-O
- dyld用于加載以下類型的Mach-O文件
MH_EXECUTE
MH_DYLIB
MH_BUNDLE - APP的可執(zhí)行文件、動態(tài)庫都是由dyld負責加載的
- dyld用于加載以下類型的Mach-O文件