本書內(nèi)容易于理解,可以讓讀者循序漸進、系統(tǒng)性地學習iOS安全技術。全書共16章,知識點覆蓋iOS 8到iOS 14。書中首先細致地介紹了越獄環(huán)境的開發(fā)與逆向相關工具,然后依次講解了匯編基礎、動態(tài)調(diào)用、靜態(tài)分析、注入與hook、文件格式,最后為大家呈現(xiàn)了應用破解與應用保護、隱私獲取與取證、刷量與作弊、唯一設備ID、寫殼內(nèi)幕等多個主題。
1.本書的主要特點是能夠讓初學者快速入門并學習到iOS安全技術的精髓,易學易懂,帶領讀者直奔主題,內(nèi)容覆蓋iOS 8到iOS 14。
2.本書細致講解了iOS系統(tǒng)的逆向分析與攻防對抗技術,從越獄環(huán)境的開發(fā)與逆向的相關工具,由淺入深的延伸到各個主題。
3.本書作者曾創(chuàng)建小型技術論壇供讀者交流,并在看雪論壇發(fā)表過多篇熱帖,該書也受到了看雪論壇iOS安全版主等多名業(yè)內(nèi)人士力薦。
4.和上一版相比,本書的知識體系更加完整,新增了更多技術難題和解決方案。
陳德 軟件安全研究員,2007年開始自學安全技術,師出《黑客防線》,在安全領域精通多方面技術,個人作品有eXfaker、FileMonitorKit、SystemKit等,
目 錄
第 1章 iOS安全機制 1
1.1 iOS 應用的安裝源 1
1.2 沙盒 2
1.3 代碼簽名 3
1.4 用戶權限隔離 4
1.5 數(shù)據(jù)執(zhí)行保護 4
1.6 地址空間布局隨機化 5
1.7 后臺程序 6
第 2章 越獄環(huán)境開發(fā)工具的準備 8
2.1 越獄與 Cydia 8
2.2 文件管理工具 11
2.2.1 iFile:在手機上管理文件 11
2.2.2 AFC2:通過 USB 管理手機文件 12
2.3 命令行工具 12
2.3.1 MTerminal:在手機上執(zhí)行命令行 12
2.3.2 OpenSSH:在計算機上執(zhí)行命令行 13
2.4 代碼注入測試工具 15
2.5 遠程調(diào)試工具 16
2.5.1 debugserver 的配置與啟動 16
2.5.2 LLDB 連接 debugserver 及其調(diào)試 17
2.5.3 通過 USB 連接 SSH 進行調(diào)試 19
2.6 反匯編工具 20
2.6.1 IDA 20
2.6.2 Hopper 23
2.7 其他工具 24
2.7.1 syslogd:記錄日志 24
2.7.2 Vi IMproved:編輯器 24
2.7.3 apt:下載命令 25
2.7.4 Network commands:網(wǎng)絡命令 25
2.7.5 dumpdecrypted:脫殼 25
2.7.6 class-dump:導出頭文件 27
2.7.7 lsof:查看進程所占用的文件 29
2.7.8 AppSync:安裝未簽名的應用 31
2.7.9 App Admin:下載指定版本的應用 31
2.7.10 Cydown:下載時提取 deb 包 31
第3章 ARM 匯編基礎 33
3.1 ARMv7 33
3.1.1 編寫 32 位匯編代碼 33
3.1.2 寄存器與棧 35
3.1.3 基礎指令 35
3.1.4 條件跳轉(zhuǎn)與循環(huán) 36
3.1.5 函數(shù)參數(shù)的調(diào)用過程 37
3.1.6 Thumb 指令 38
3.2 ARM64 39
3.2.1 編寫 64 位的匯編代碼 39
3.2.2 寄存器與棧 39
3.2.3 函數(shù)參數(shù)的調(diào)用過程 40
3.3 在 Xcode 中使用內(nèi)聯(lián)匯編 41
3.3.1 C、C++、Objective-C 調(diào)用匯編函數(shù) 42
3.3.2 直接編寫內(nèi)聯(lián)匯編 42
第4章 應用逆向分析 44
4.1 尋找程序入口——main 函數(shù) 44
4.1.1 編寫一個測試程序 44
4.1.2 ARMv7 的 main 函數(shù) 45
4.1.3 ARM64 的 main 函數(shù) 46
4.2 動態(tài)調(diào)試 47
4.2.1 反匯編 47
4.2.2 添加斷點 48
4.2.3 打印數(shù)據(jù) 53
4.2.4 讀寫數(shù)據(jù) 54
4.2.5 修改程序的執(zhí)行流程 56
4.2.6 查看信息 58
4.2.7 執(zhí)行到上層調(diào)用棧 61
4.2.8 臨時修改變量的值 62
4.2.9 使用幫助與搜索 63
4.2.10 LLDB 腳本 63
4.2.11 不越獄使用 Xcode 調(diào)試第三方應用 68
4.2.12 IDA 動態(tài)調(diào)試 71
4.3 靜態(tài)分析 75
4.3.1 通過字符串定位代碼的引用位置 75
4.3.2 查看函數(shù)被調(diào)用的位置 79
4.3.3 重設基地址 81
4.3.4 修改代碼并保存文件 81
4.3.5 使用 IDA Python 腳本 82
4.4 逆向分析實例 83
4.5 Frida 93
4.5.1 Frida 的安裝與相關工具 93
4.5.2 frida-trace 實例 97
4.5.3 攔截器的使用 99
4.5.4 攔截 sub_xxxx 這種函數(shù) 103
4.5.5 API 查找器和攔截器的組合使用 106
4.5.6 遠程過程調(diào)用 110
4.6 使用 MonkeyDev 逆向應用 114
4.6.1 安裝 MonkeyDev 114
4.6.2 分析應用 115
4.6.3 不越獄使用 Frida 119
第5章 Tweak 編寫技術 122
5.1 Theos 開發(fā)環(huán)境的使用 122
5.1.1 編寫第 一個 Tweak 122
5.1.2 Theos 工程文件 126
5.2 逆向分析與編寫 Tweak 129
5.2.1 逆向分析 129
5.2.2 編寫 Tweak 137
5.3 使用 MonkeyDev 開發(fā) Tweak 140
第6章 注入與 Hook 144
6.1 注入動態(tài)庫 144
6.1.1 編寫動態(tài)庫 144
6.1.2 DynamicLibraries 目錄 145
6.1.3 DYLD_INSERT_LIBRARIES 環(huán)境變量 145
6.1.4 不越獄注入動態(tài)庫 146
6.2 Hook 147
6.2.1 Cydia Substrate 147
6.2.2 Symbol Table 150
6.2.3 Method Swizzing 152
第7章 Mach-O 文件格式解析 154
7.1 Mach-O 文件格式 154
7.1.1 Fat 頭部 156
7.1.2 Mach 頭部 158
7.1.3 Load command 159
7.1.4 符號表與字符串表 172
7.2 CFString 的運行過程 174
7.2.1 編寫測試代碼 174
7.2.2 CFString 的數(shù)據(jù)結(jié)構 175
7.2.3 調(diào)試運行過程 176
7.3 Mach-O ARM 函數(shù)綁定的調(diào)用過程分析 177
7.3.1 編寫測試代碼 177
7.3.2 分析 ARMv7 函數(shù)綁定的調(diào)用過程 178
7.3.3 分析 ARM64 函數(shù)綁定的調(diào)用過程 186
7.3.4 總結(jié) 190
7.4 靜態(tài)庫文件格式 192
7.5 class-dump 導出頭文件的原理 194
7.6 關于 Bitcode 198
7.6.1 Bitcode 的作用 198
7.6.2 在 Xcode 中如何生成 Bitcode 198
7.6.3 通過命令行編譯 Bitcode 200
7.6.4 將 Bitcode 編譯成可執(zhí)行文件 202
7.6.5 編譯器相關參數(shù) 203
第8章 唯一設備 ID 205
8.1 UDID 與設備 ID 205
8.1.1 編寫 mobileconfig 205
8.1.2 編寫 receive.php 206
8.1.3 安裝描述文件 206
8.1.4 mobileconfig 簽名 207
8.2 IDFA 208
8.3 IDFV 208
8.4 OpenUDID 209
8.5 SimulateIDFA 210
8.6 MAC 地址 211
8.7 ID 的持久化存儲 214
8.7.1 Keychain 的存儲 214
8.7.2 剪貼板 216
8.8 DeviceToken 218
第9章 刷量與作弊 219
9.1 越獄環(huán)境下獲取 root 權限 219
9.1.1 iOS 8 - iOS 10 獲取 root 權限 220
9.1.2 iOS 11- iOS 14 獲取 root 權限 220
9.2 修改手機信息 221
9.2.1 修改基本信息 221
9.2.2 修改 Wi-Fi 信息與運營商 228
9.2.3 修改 DeviceToken 230
9.2.4 修改位置信息 232
9.2.5 修改系統(tǒng)啟動時間 233
9.2.6 修改屏幕亮度、音量、電池電量 234
9.2.7 修改磁盤空間與內(nèi)存 235
9.2.8 修改網(wǎng)絡 IP 地址、MAC 地址、DNS 236
9.2.9 修改上網(wǎng)類型 238
9.2.10 修改系統(tǒng)版本與機型 240
9.2.11 繞過 VPN 與 HTTP 代理檢測 246
9.3 清除數(shù)據(jù) 247
9.3.1 清除沙盒目錄 247
9.3.2 清除 Keychain 250
9.3.3 清除剪貼板 251
9.3.4 清除 AppGroup 252
9.3.5 清除 iTunes 信息 255
9.4 發(fā)布應用 256
9.4.1 將 App 打包成 deb 格式 256
9.4.2 制作 Cydia 源發(fā)布應用 257
9.5 權限的切換 258
9.6 變化 IP 地址 259
9.7 反越獄檢測 261
9.8 不用越獄修改任意位置信息 263
9.9 在兩臺手機上同時登錄同一微信 264
9.10 微信的 62 數(shù)據(jù) 265
第 10章 重要信息獲取與取證 267
10.1 通訊錄 267
10.2 短信 268
10.3 通話記錄 269
10.4 位置信息 269
10.5 網(wǎng)絡信息 271
10.5.1 上網(wǎng)類型 272
10.5.2 熱點信息 273
10.5.3 DNS 信息 274
10.5.4 IP 地址 275
10.5.5 代理信息 277
10.6 傳感器信息 278
10.6.1 加速計 279
10.6.2 陀螺儀 280
10.6.3 磁力計 281
10.6.4 氣壓計 282
10.7 系統(tǒng)信息 283
10.8 硬件 ID 信息 286
10.9 已安裝的應用列表 289
10.10 使用 idb 分析泄露的數(shù)據(jù) 291
10.10.1 安裝和運行 291
10.10.2 使用方法 293
10.11 重要的文件與目錄 296
10.11.1 照片 297
10.11.2 Safari 瀏覽器書簽 297
10.11.3 Wi-Fi 歷史連接記錄 297
10.11.4 應用快照 298
10.11.5 錄音 298
10.12 libimobiledevice 獲取手機信息 299
第 11章 應用破解 301
11.1 重打包應用與多開 301
11.1.1 重打包應用 301
11.1.2 多開 308
11.2 應用重簽名 310
11.2.1 代碼簽名 311
11.2.2 授權機制 314
11.2.3 配置文件 315
11.2.4 重簽名 317
11.3 抓包和改包 318
11.3.1 tcpdump 抓包 318
11.3.2 Wireshark 抓包 321
11.3.3 Charles 抓取 HTTPS 數(shù)據(jù)包 323
11.3.4 Charles 修改數(shù)據(jù)包與重發(fā) 327
11.3.5 突破 SSL 雙向認證 330
11.4 文件監(jiān)控 331
11.5 破解登錄驗證 332
11.5.1 得到 HTTP 傳輸?shù)臄?shù)據(jù) 332
11.5.2 得到解密的數(shù)據(jù) 333
11.5.3 破解方法 334
第 12章 應用保護 335
12.1 函數(shù)名混淆 335
12.2 字符串加密 335
12.3 代碼混淆 338
12.3.1 inline 內(nèi)聯(lián)函數(shù) 338
12.3.2 obfuscator-llvm 編譯器 339
12.3.3 Xcode 集成配置 obfuscator-llvm 341
12.3.4 Theos 集成配置 obfuscator-llvm 343
12.3.5 HikariObfuscator 343
12.4 越獄檢測 344
12.4.1 判斷相關文件是否存在 344
12.4.2 直接讀取相關文件 345
12.4.3 使用 stat 函數(shù)判斷文件 345
12.4.4 檢查動態(tài)庫列表 346
12.4.5 檢查環(huán)境變量 346
12.4.6 檢查函數(shù)是否被劫持 346
12.5 反盜版 347
12.5.1 檢查 Bundle identifier 347
12.5.2 檢查來源是否為 App Store 347
12.5.3 檢查重簽名 350
12.5.4 代碼校驗 351
12.6 反調(diào)試與反反調(diào)試 353
12.6.1 反調(diào)試方法 353
12.6.2 反反調(diào)試 355
12.7 反注入與反反注入 359
12.8 防止被抓包 361
第 13章 代碼入口點劫持 365
13.1 實現(xiàn)原理 365
13.2 編寫 ShellCode 365
13.2.1 編寫 ARM 匯編 366
13.2.2 計算 main 函數(shù)的跳轉(zhuǎn)地址 370
13.2.3 最終的 ShellCode 372
13.3 插入代碼 373
13.4 修改入口點 374
13.4.1 關于指令切換 374
13.4.2 ARMv7 入口點 375
13.4.3 ARM64 入口點 375
13.5 重簽名 376
第 14章 寫殼內(nèi)幕 378
14.1 判斷文件格式類型 378
14.2 代碼的插入 379
14.3 修改程序入口點 381
14.4 Shellcode 如何調(diào)用函數(shù) 382
14.5 編寫和調(diào)試 Shellcode 386
14.5.1 ARMv7 Shellcode 387
14.5.2 ARM64 Shellcode 394
14.6 總結(jié) 407
第 15章 系統(tǒng)相關 409
15.1 Cydia 的相關問題及修復方法 409
15.1.1 使用 h3lix 越獄后,Cydia 不能上網(wǎng) 409
15.1.2 越獄后抹掉所有內(nèi)容修復 Cydia 409
15.1.3 Cydia 不能上網(wǎng)的終極解決方法 411
15.2 降級傳說 412
15.2.1 iPhone 5 降級到 8.4.1 412
15.2.2 iPhone 5s 降級到 10.3.3 413
15.3 訪問限制密碼的安全隱患 416
15.3.1 訪問限制密碼 416
15.3.2 備份密鑰數(shù)據(jù) 416
15.3.3 暴力破解密碼 417
15.4 掃碼在線安裝應用 418
15.4.1 安裝 Apache 418
15.4.2 配置自簽名證書支持 HTTPS 419
15.4.3 下載安裝應用 422
15.4.4 購買認證的 SSL 證書 424
15.5 CVE-2018-4407 遠程溢出漏洞 425
15.6 解決磁盤空間不足的問題 426
15.7 解決 h3lix 重簽名后越獄失敗 427
15.8 解決 iOS 12 啟動進程提示 Killed:9 的問題 429
15.9 iPhone 安裝 Android 系統(tǒng) 431
第 16章 LLVM 編譯器代碼混淆的原理 434
16.1 開發(fā)和調(diào)試 Pass 434
16.1.1 編寫第 一個 LLVM Pass 434
16.1.2 編寫 Pass 獲取基本塊和指令 438
16.1.3 將 Pass 編譯到 Clang 442
16.2 移植代碼混淆 Pass 444
16.2.1 移植代碼 444
16.2.2 安裝 graphivz 445
16.2.3 設置 opt 的啟動參數(shù) 446
16.3 從源碼角度解讀代碼混淆 Pass 449
16.3.1 flattening 449
16.3.2 boguscf 458
16.3.3 substitution 464
16.3.4 indirectbr 469
附錄A 書中用到的工具列表 477
附錄B 機型代號列表 479