本書內(nèi)容易于理解,可以讓讀者循序漸進(jìn)、系統(tǒng)性地學(xué)習(xí)iOS安全技術(shù)。全書共16章,知識(shí)點(diǎn)覆蓋iOS 8到iOS 14。書中首先細(xì)致地介紹了越獄環(huán)境的開發(fā)與逆向相關(guān)工具,然后依次講解了匯編基礎(chǔ)、動(dòng)態(tài)調(diào)用、靜態(tài)分析、注入與hook、文件格式,最后為大家呈現(xiàn)了應(yīng)用破解與應(yīng)用保護(hù)、隱私獲取與取證、刷量與作弊、唯一設(shè)備ID、寫殼內(nèi)幕等多個(gè)主題。
1.本書的主要特點(diǎn)是能夠讓初學(xué)者快速入門并學(xué)習(xí)到iOS安全技術(shù)的精髓,易學(xué)易懂,帶領(lǐng)讀者直奔主題,內(nèi)容覆蓋iOS 8到iOS 14。
2.本書細(xì)致講解了iOS系統(tǒng)的逆向分析與攻防對(duì)抗技術(shù),從越獄環(huán)境的開發(fā)與逆向的相關(guān)工具,由淺入深的延伸到各個(gè)主題。
3.本書作者曾創(chuàng)建小型技術(shù)論壇供讀者交流,并在看雪論壇發(fā)表過(guò)多篇熱帖,該書也受到了看雪論壇iOS安全版主等多名業(yè)內(nèi)人士力薦。
4.和上一版相比,本書的知識(shí)體系更加完整,新增了更多技術(shù)難題和解決方案。
陳德 軟件安全研究員,2007年開始自學(xué)安全技術(shù),師出《黑客防線》,在安全領(lǐng)域精通多方面技術(shù),個(gè)人作品有eXfaker、FileMonitorKit、SystemKit等,
目 錄
第 1章 iOS安全機(jī)制 1
1.1 iOS 應(yīng)用的安裝源 1
1.2 沙盒 2
1.3 代碼簽名 3
1.4 用戶權(quán)限隔離 4
1.5 數(shù)據(jù)執(zhí)行保護(hù) 4
1.6 地址空間布局隨機(jī)化 5
1.7 后臺(tái)程序 6
第 2章 越獄環(huán)境開發(fā)工具的準(zhǔn)備 8
2.1 越獄與 Cydia 8
2.2 文件管理工具 11
2.2.1 iFile:在手機(jī)上管理文件 11
2.2.2 AFC2:通過(guò) USB 管理手機(jī)文件 12
2.3 命令行工具 12
2.3.1 MTerminal:在手機(jī)上執(zhí)行命令行 12
2.3.2 OpenSSH:在計(jì)算機(jī)上執(zhí)行命令行 13
2.4 代碼注入測(cè)試工具 15
2.5 遠(yuǎn)程調(diào)試工具 16
2.5.1 debugserver 的配置與啟動(dòng) 16
2.5.2 LLDB 連接 debugserver 及其調(diào)試 17
2.5.3 通過(guò) USB 連接 SSH 進(jìn)行調(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)絡(luò)命令 25
2.7.5 dumpdecrypted:脫殼 25
2.7.6 class-dump:導(dǎo)出頭文件 27
2.7.7 lsof:查看進(jìn)程所占用的文件 29
2.7.8 AppSync:安裝未簽名的應(yīng)用 31
2.7.9 App Admin:下載指定版本的應(yīng)用 31
2.7.10 Cydown:下載時(shí)提取 deb 包 31
第3章 ARM 匯編基礎(chǔ) 33
3.1 ARMv7 33
3.1.1 編寫 32 位匯編代碼 33
3.1.2 寄存器與棧 35
3.1.3 基礎(chǔ)指令 35
3.1.4 條件跳轉(zhuǎn)與循環(huán) 36
3.1.5 函數(shù)參數(shù)的調(diào)用過(guò)程 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)用過(guò)程 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章 應(yīng)用逆向分析 44
4.1 尋找程序入口——main 函數(shù) 44
4.1.1 編寫一個(gè)測(cè)試程序 44
4.1.2 ARMv7 的 main 函數(shù) 45
4.1.3 ARM64 的 main 函數(shù) 46
4.2 動(dòng)態(tài)調(diào)試 47
4.2.1 反匯編 47
4.2.2 添加斷點(diǎn) 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 臨時(shí)修改變量的值 62
4.2.9 使用幫助與搜索 63
4.2.10 LLDB 腳本 63
4.2.11 不越獄使用 Xcode 調(diào)試第三方應(yīng)用 68
4.2.12 IDA 動(dòng)態(tài)調(diào)試 71
4.3 靜態(tài)分析 75
4.3.1 通過(guò)字符串定位代碼的引用位置 75
4.3.2 查看函數(shù)被調(diào)用的位置 79
4.3.3 重設(shè)基地址 81
4.3.4 修改代碼并保存文件 81
4.3.5 使用 IDA Python 腳本 82
4.4 逆向分析實(shí)例 83
4.5 Frida 93
4.5.1 Frida 的安裝與相關(guān)工具 93
4.5.2 frida-trace 實(shí)例 97
4.5.3 攔截器的使用 99
4.5.4 攔截 sub_xxxx 這種函數(shù) 103
4.5.5 API 查找器和攔截器的組合使用 106
4.5.6 遠(yuǎn)程過(guò)程調(diào)用 110
4.6 使用 MonkeyDev 逆向應(yīng)用 114
4.6.1 安裝 MonkeyDev 114
4.6.2 分析應(yīng)用 115
4.6.3 不越獄使用 Frida 119
第5章 Tweak 編寫技術(shù) 122
5.1 Theos 開發(fā)環(huán)境的使用 122
5.1.1 編寫第 一個(gè) 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 注入動(dòng)態(tài)庫(kù) 144
6.1.1 編寫動(dòng)態(tài)庫(kù) 144
6.1.2 DynamicLibraries 目錄 145
6.1.3 DYLD_INSERT_LIBRARIES 環(huán)境變量 145
6.1.4 不越獄注入動(dòng)態(tài)庫(kù) 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 符號(hào)表與字符串表 172
7.2 CFString 的運(yùn)行過(guò)程 174
7.2.1 編寫測(cè)試代碼 174
7.2.2 CFString 的數(shù)據(jù)結(jié)構(gòu) 175
7.2.3 調(diào)試運(yùn)行過(guò)程 176
7.3 Mach-O ARM 函數(shù)綁定的調(diào)用過(guò)程分析 177
7.3.1 編寫測(cè)試代碼 177
7.3.2 分析 ARMv7 函數(shù)綁定的調(diào)用過(guò)程 178
7.3.3 分析 ARM64 函數(shù)綁定的調(diào)用過(guò)程 186
7.3.4 總結(jié) 190
7.4 靜態(tài)庫(kù)文件格式 192
7.5 class-dump 導(dǎo)出頭文件的原理 194
7.6 關(guān)于 Bitcode 198
7.6.1 Bitcode 的作用 198
7.6.2 在 Xcode 中如何生成 Bitcode 198
7.6.3 通過(guò)命令行編譯 Bitcode 200
7.6.4 將 Bitcode 編譯成可執(zhí)行文件 202
7.6.5 編譯器相關(guān)參數(shù) 203
第8章 唯一設(shè)備 ID 205
8.1 UDID 與設(shè)備 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 的持久化存儲(chǔ) 214
8.7.1 Keychain 的存儲(chǔ) 214
8.7.2 剪貼板 216
8.8 DeviceToken 218
第9章 刷量與作弊 219
9.1 越獄環(huán)境下獲取 root 權(quán)限 219
9.1.1 iOS 8 - iOS 10 獲取 root 權(quán)限 220
9.1.2 iOS 11- iOS 14 獲取 root 權(quán)限 220
9.2 修改手機(jī)信息 221
9.2.1 修改基本信息 221
9.2.2 修改 Wi-Fi 信息與運(yùn)營(yíng)商 228
9.2.3 修改 DeviceToken 230
9.2.4 修改位置信息 232
9.2.5 修改系統(tǒng)啟動(dòng)時(shí)間 233
9.2.6 修改屏幕亮度、音量、電池電量 234
9.2.7 修改磁盤空間與內(nèi)存 235
9.2.8 修改網(wǎng)絡(luò) IP 地址、MAC 地址、DNS 236
9.2.9 修改上網(wǎng)類型 238
9.2.10 修改系統(tǒng)版本與機(jī)型 240
9.2.11 繞過(guò) VPN 與 HTTP 代理檢測(cè) 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ā)布應(yīng)用 256
9.4.1 將 App 打包成 deb 格式 256
9.4.2 制作 Cydia 源發(fā)布應(yīng)用 257
9.5 權(quán)限的切換 258
9.6 變化 IP 地址 259
9.7 反越獄檢測(cè) 261
9.8 不用越獄修改任意位置信息 263
9.9 在兩臺(tái)手機(jī)上同時(shí)登錄同一微信 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)絡(luò)信息 271
10.5.1 上網(wǎng)類型 272
10.5.2 熱點(diǎn)信息 273
10.5.3 DNS 信息 274
10.5.4 IP 地址 275
10.5.5 代理信息 277
10.6 傳感器信息 278
10.6.1 加速計(jì) 279
10.6.2 陀螺儀 280
10.6.3 磁力計(jì) 281
10.6.4 氣壓計(jì) 282
10.7 系統(tǒng)信息 283
10.8 硬件 ID 信息 286
10.9 已安裝的應(yīng)用列表 289
10.10 使用 idb 分析泄露的數(shù)據(jù) 291
10.10.1 安裝和運(yùn)行 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 應(yīng)用快照 298
10.11.5 錄音 298
10.12 libimobiledevice 獲取手機(jī)信息 299
第 11章 應(yīng)用破解 301
11.1 重打包應(yīng)用與多開 301
11.1.1 重打包應(yīng)用 301
11.1.2 多開 308
11.2 應(yīng)用重簽名 310
11.2.1 代碼簽名 311
11.2.2 授權(quán)機(jī)制 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 雙向認(rèn)證 330
11.4 文件監(jiān)控 331
11.5 破解登錄驗(yàn)證 332
11.5.1 得到 HTTP 傳輸?shù)臄?shù)據(jù) 332
11.5.2 得到解密的數(shù)據(jù) 333
11.5.3 破解方法 334
第 12章 應(yīng)用保護(hù) 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 越獄檢測(cè) 344
12.4.1 判斷相關(guān)文件是否存在 344
12.4.2 直接讀取相關(guān)文件 345
12.4.3 使用 stat 函數(shù)判斷文件 345
12.4.4 檢查動(dòng)態(tài)庫(kù)列表 346
12.4.5 檢查環(huán)境變量 346
12.4.6 檢查函數(shù)是否被劫持 346
12.5 反盜版 347
12.5.1 檢查 Bundle identifier 347
12.5.2 檢查來(lái)源是否為 App Store 347
12.5.3 檢查重簽名 350
12.5.4 代碼校驗(yàn) 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章 代碼入口點(diǎn)劫持 365
13.1 實(shí)現(xiàn)原理 365
13.2 編寫 ShellCode 365
13.2.1 編寫 ARM 匯編 366
13.2.2 計(jì)算 main 函數(shù)的跳轉(zhuǎn)地址 370
13.2.3 最終的 ShellCode 372
13.3 插入代碼 373
13.4 修改入口點(diǎn) 374
13.4.1 關(guān)于指令切換 374
13.4.2 ARMv7 入口點(diǎn) 375
13.4.3 ARM64 入口點(diǎn) 375
13.5 重簽名 376
第 14章 寫殼內(nèi)幕 378
14.1 判斷文件格式類型 378
14.2 代碼的插入 379
14.3 修改程序入口點(diǎn) 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)相關(guān) 409
15.1 Cydia 的相關(guān)問(wèn)題及修復(fù)方法 409
15.1.1 使用 h3lix 越獄后,Cydia 不能上網(wǎng) 409
15.1.2 越獄后抹掉所有內(nèi)容修復(fù) Cydia 409
15.1.3 Cydia 不能上網(wǎng)的終極解決方法 411
15.2 降級(jí)傳說(shuō) 412
15.2.1 iPhone 5 降級(jí)到 8.4.1 412
15.2.2 iPhone 5s 降級(jí)到 10.3.3 413
15.3 訪問(wèn)限制密碼的安全隱患 416
15.3.1 訪問(wèn)限制密碼 416
15.3.2 備份密鑰數(shù)據(jù) 416
15.3.3 暴力破解密碼 417
15.4 掃碼在線安裝應(yīng)用 418
15.4.1 安裝 Apache 418
15.4.2 配置自簽名證書支持 HTTPS 419
15.4.3 下載安裝應(yīng)用 422
15.4.4 購(gòu)買認(rèn)證的 SSL 證書 424
15.5 CVE-2018-4407 遠(yuǎn)程溢出漏洞 425
15.6 解決磁盤空間不足的問(wèn)題 426
15.7 解決 h3lix 重簽名后越獄失敗 427
15.8 解決 iOS 12 啟動(dòng)進(jìn)程提示 Killed:9 的問(wèn)題 429
15.9 iPhone 安裝 Android 系統(tǒng) 431
第 16章 LLVM 編譯器代碼混淆的原理 434
16.1 開發(fā)和調(diào)試 Pass 434
16.1.1 編寫第 一個(gè) 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 設(shè)置 opt 的啟動(dòng)參數(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 機(jī)型代號(hào)列表 479