目 录
第 1章 iOS安全机制 1
1.1 iOS 应用的安装源 1
1.2 沙盒 2
1.3 代码签名 3
1.4 用户权限隔离 4
1.5 数据执行保护 4
1.6 地址空间布局随机化 5
1.7 后台程序 6
第 2章 越狱环境开发工具的准备 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:在手机上执行命令行 12
2.3.2 OpenSSH:在计算机上执行命令行 13
2.4 代码注入测试工具 15
2.5 远程调试工具 16
2.5.1 debugserver 的配置与启动 16
2.5.2 LLDB 连接 debugserver 及其调试 17
2.5.3 通过 USB 连接 SSH 进行调试 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:网络命令 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 条件跳转与循环 36
3.1.5 函数参数的调用过程 37
3.1.6 Thumb 指令 38
3.2 ARM64 39
3.2.1 编写 64 位的汇编代码 39
3.2.2 寄存器与栈 39
3.2.3 函数参数的调用过程 40
3.3 在 Xcode 中使用内联汇编 41
3.3.1 C、C++、Objective-C 调用汇编函数 42
3.3.2 直接编写内联汇编 42
第4章 应用逆向分析 44
4.1 寻找程序入口——main 函数 44
4.1.1 编写一个测试程序 44
4.1.2 ARMv7 的 main 函数 45
4.1.3 ARM64 的 main 函数 46
4.2 动态调试 47
4.2.1 反汇编 47
4.2.2 添加断点 48
4.2.3 打印数据 53
4.2.4 读写数据 54
4.2.5 修改程序的执行流程 56
4.2.6 查看信息 58
4.2.7 执行到上层调用栈 61
4.2.8 临时修改变量的值 62
4.2.9 使用帮助与搜索 63
4.2.10 LLDB 脚本 63
4.2.11 不越狱使用 Xcode 调试第三方应用 68
4.2.12 IDA 动态调试 71
4.3 静态分析 75
4.3.1 通过字符串定位代码的引用位置 75
4.3.2 查看函数被调用的位置 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 这种函数 103
4.5.5 API 查找器和拦截器的组合使用 106
4.5.6 远程过程调用 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 开发环境的使用 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 开发 Tweak 140
第6章 注入与 Hook 144
6.1 注入动态库 144
6.1.1 编写动态库 144
6.1.2 DynamicLibraries 目录 145
6.1.3 DYLD_INSERT_LIBRARIES 环境变量 145
6.1.4 不越狱注入动态库 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 的数据结构 175
7.2.3 调试运行过程 176
7.3 Mach-O ARM 函数绑定的调用过程分析 177
7.3.1 编写测试代码 177
7.3.2 分析 ARMv7 函数绑定的调用过程 178
7.3.3 分析 ARM64 函数绑定的调用过程 186
7.3.4 总结 190
7.4 静态库文件格式 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 编译成可执行文件 202
7.6.5 编译器相关参数 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 越狱环境下获取 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 修改系统启动时间 233
9.2.6 修改屏幕亮度、音量、电池电量 234
9.2.7 修改磁盘空间与内存 235
9.2.8 修改网络 IP 地址、MAC 地址、DNS 236
9.2.9 修改上网类型 238
9.2.10 修改系统版本与机型 240
9.2.11 绕过 VPN 与 HTTP 代理检测 246
9.3 清除数据 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 发布应用 256
9.4.1 将 App 打包成 deb 格式 256
9.4.2 制作 Cydia 源发布应用 257
9.5 权限的切换 258
9.6 变化 IP 地址 259
9.7 反越狱检测 261
9.8 不用越狱修改任意位置信息 263
9.9 在两台手机上同时登录同一微信 264
9.10 微信的 62 数据 265
第 10章 重要信息获取与取证 267
10.1 通讯录 267
10.2 短信 268
10.3 通话记录 269
10.4 位置信息 269
10.5 网络信息 271
10.5.1 上网类型 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 系统信息 283
10.8 硬件 ID 信息 286
10.9 已安装的应用列表 289
10.10 使用 idb 分析泄露的数据 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 数据包 323
11.3.4 Charles 修改数据包与重发 327
11.3.5 突破 SSL 双向认证 330
11.4 文件监控 331
11.5 破解登录验证 332
11.5.1 得到 HTTP 传输的数据 332
11.5.2 得到解密的数据 333
11.5.3 破解方法 334
第 12章 应用保护 335
12.1 函数名混淆 335
12.2 字符串加密 335
12.3 代码混淆 338
12.3.1 inline 内联函数 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 函数判断文件 345
12.4.4 检查动态库列表 346
12.4.5 检查环境变量 346
12.4.6 检查函数是否被劫持 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 反调试与反反调试 353
12.6.1 反调试方法 353
12.6.2 反反调试 355
12.7 反注入与反反注入 359
12.8 防止被抓包 361
第 13章 代码入口点劫持 365
13.1 实现原理 365
13.2 编写 ShellCode 365
13.2.1 编写 ARM 汇编 366
13.2.2 计算 main 函数的跳转地址 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章 写壳内幕 378
14.1 判断文件格式类型 378
14.2 代码的插入 379
14.3 修改程序入口点 381
14.4 Shellcode 如何调用函数 382
14.5 编写和调试 Shellcode 386
14.5.1 ARMv7 Shellcode 387
14.5.2 ARM64 Shellcode 394
14.6 总结 407
第 15章 系统相关 409
15.1 Cydia 的相关问题及修复方法 409
15.1.1 使用 h3lix 越狱后,Cydia 不能上网 409
15.1.2 越狱后抹掉所有内容修复 Cydia 409
15.1.3 Cydia 不能上网的终极解决方法 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 备份密钥数据 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 系统 431
第 16章 LLVM 编译器代码混淆的原理 434
16.1 开发和调试 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 的启动参数 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