描述
开 本: 16开纸 张: 胶版纸包 装: 平装-胶订是否套装: 否国际标准书号ISBN: 9787302645597
《Frida Android SO逆向深入实践》是一本针对使用Frida辅助分析SO进行逆向工程项目开发的实用指南。本书从基础开始,详细介绍了NDK编译套件的使用以及如何开发包含SO的应用软件并进行分析调试。接着,书中介绍了将算法移植到SO中保护App的方法,并展示了如何使用模拟执行框架加载SO运行算法,同时结合GDB、HyperPwn、Objection和Frida进行联合调试SO中的算法。
此外,本书还深入探讨了ARM/ELF的文件格式和反编译工具IDA,详细介绍了Frida/Jnitrace Hook/Invoke JNI,以及JNI与反射及简单风控案例设计分析。对于onCreate的Native化也进行了解析,帮助读者更好地理解Android源码追踪JNI的绑定流程。
最后,本书还全面介绍了哈希和对称加解密算法的核心原理与实现细节,并展示了使用Frida辅助逆向分析的工作流程。通过由易到难、由浅入深的讲解方式,本书适合Native层的初、中级读者阅读。无论您是对逆向工程感兴趣的初学者,还是有一定经验的开发者,本书都将为您带来全新的视角和实用的技巧,助力您在逆向工程领域取得更大的突破。
《Frida Android SO逆向深入实践》主要介绍使用Frida辅助分析SO进行逆向工程项目开发。首先从基础开始介绍NDK编译套件,开发编译包含SO的应用软件并进行动静态分析调试;接着介绍如何将算法移植到SO中保护App,并使用模拟执行框架加载SO运行算法,使用GDB、HyperPwn、Objection、Frida联合调试SO中的算法;此外,还将介绍ARM/ELF的文件格式和反编译工具IDA,Frida/Jnitrace Hook/Invoke JNI,JNI与反射及简单风控案例设计分析,onCreate的Native化,分析Android源码追踪JNI的绑定流程。最后介绍哈希和对称加解密算法的核心原理与实现细节,以及使用Frida辅助逆向分析的工作流程。 《Frida Android SO逆向深入实践》按照由易到难、由浅入深的方式进行讲解,适合Native层的初、中级读者阅读。
第1章 基本开发环境配置 1
1.1 虚拟机环境搭建 1
1.2 逆向环境搭建 3
1.2.1 Android Studio安装NDK编译套件 3
1.2.2 ADB的配置和使用 5
1.2.3 Python版本管理 6
1.2.4 移动设备环境准备 7
1.2.5 Frida版本管理 7
1.2.6 Objection的安装和使用 8
1.3 Frida基本源码开发环境搭建 10
1.4 初识NDK 12
1.5 其他工具 16
1.6 本章小结 18
第2章 Android SO动态调试入门 19
2.1 Android SO基本动态分析调试 19
2.1.1 第一个NDK程序 19
2.1.2 动态调试NDK程序 20
2.1.3 交叉编译 24
2.2 LLDB动态调试(三方)Android SO 27
2.3 Capstone/Keystone/Unicorn(反)汇编器 30
2.4 Frida动态调试Android Native部分 32
2.5 Frida Instruction模块动态反汇编 32
2.6 本章小结 34
第3章 静态分析工具的安装和基本使用 35
3.1 使用objdump反汇编目标文件命令显示二进制文件信息 35
3.2 使用010 Editor解析SO文件显示二进制基本信息 38
3.3 Ghidra/JEB/IDA高级反汇编器 40
3.4 Binary Ninja新晋反汇编器 47
3.5 本章小结 51
第4章 C算法开发及模拟执行 52
4.1 Native层密码学套件移植开发 52
4.2 Frida Hook/主动调用执行算法 62
4.3 使用AndroidNativeEmu模拟执行算法 63
4.4 本章小结 64
第5章 动态调试:GDB动态调试、Hyperpwn/(内存)断点/栈帧 65
5.1 GDB C/S的调试架构 65
5.2 将App编译成带调试符号的SO文件 67
5.3 使用Android调试模式来启动App 69
5.4 Hyperpwn调试入门 73
5.5 Objection Frida Hyperpwn联合调试 79
5.6 本章小结 82
第6章 汇编开发:ARM汇编原理/流程/调用约定/动态调试 83
6.1 Android和ARM处理器 83
6.2 ARM原生程序的生成过程 84
6.3 汇编语言简介 87
6.3.1 汇编程序组成 87
6.3.2 ARM处理器的工作模式与寻址方式 91
6.4 ARM汇编指令及动态调试分析 94
6.5 多功能CPU模拟器:Unicorn 109
6.6 本章小结 110
第7章 逆向分析:ELF文件结构、节/区/表/段/符号/链接器 111
7.1 操作系统ELF文件动态加载的基础知识 111
7.1.1 从几个问题入手 111
7.1.2 操作系统的核心概念 112
7.2 可执行文件的加载过程 114
7.3 使用Unidbg模拟执行SO文件中的函数 116
7.3.1 Unidbg框架的基本运作原理 117
7.3.2 Unidbg各组件的基本功能 119
7.3.3 追踪SO文件的加载与解析流程 123
7.4 本章小结 126
第8章 反编译工具IDA 127
8.1 IDA入门 127
8.1.1 IDA的安装与使用 127
8.1.2 IDA插件的使用 129
8.1.3 IDA反汇编介绍 130
8.1.4 IDA分析与Frida Hook结合 136
8.2 动静态SO算法还原与脱机 137
8.2.1 IDA动态调试SO算法 137
8.2.2 Keypatch原理/实战硬改算法逻辑 149
8.3 本章小结 150
第9章 JNI接口初识 151
9.1 JNI及其工作原理 151
9.1.1 NDK简介 151
9.1.2 JNI——NDK具体的实现接口 153
9.2 Frida手动追踪JNI接口 163
9.3 jnitrace自动追踪JNI 167
9.4 JNI接口大横评 168
9.4.1 Frida Hook并主动调用 169
9.4.2 jnitrace 179
9.4.3 ExAndroidNativeEmu 179
9.5 本章小结 183
第10章 JNI的特性:Java/Native互相调用、反射/全局/局部引用 184
10.1 反射“滥用”类和对象的基本属性 184
10.1.1 反射的概念与相关的Java类 184
10.1.2 实例:Xposed刷机和编译使用的插件 186
10.1.3 反射设置/调用类和对象的域和方法 190
10.1.4 来自Native层的反射调用追踪 192
10.2 设计简单风控SDK并主动调用观察效果 194
10.2.1 收集设备关键信息的常见方向和思路 194
10.2.2 Native层使用反射调用Java层API获取设备信息 195
10.3 本章小结 208
第11章 onCreate进行Native化和引用 209
11.1 将onCreate函数Native化 209
11.2 Java内存管理 220
11.2.1 C和Java内存管理的差异 220
11.2.2 JNI的三种引用 220
11.3 本章小结 221
第12章 JNI动静态绑定和追踪 222
12.1 Dalvik下动静态注册流程追踪 222
12.2 ART下动静态注册流程追踪 228
12.3 本章小结 237
第13章 MD5算法分析和魔改 238
13.1 MD5算法的描述 240
13.2 MD5工程实现 246
13.3 哈希算法逆向分析 248
13.3.1 Findcrypt/Signsrch源码剖析 248
13.3.2 算法识别插件的核心原理与改进方向 254
13.3.3 使用findhash插件检测哈希算法 255
13.3.4 SHA1算法逆向分析实战 258
13.4 哈希算法的扩展延伸 264
13.4.1 哈希算法的特征 264
13.4 2 大厂最爱:HMAC-MD5/SHA1详解 266
13.5 Frida MemoryAccessMonitor的使用场景 270
13.6 本章小结 277
第14章 对称加密算法逆向分析 278
14.1 DES详解 278
14.1.1 分组密码的填充与工作模式 286
14.1.2 三重DES 287
14.2 AES 289
14.2.1 AES初识 289
14.2.2 深入了解AES 296
14.2.3 Unicorn辅助分析 302
14.2.4 AES的工作模式 305
14.3 本章小结 312
第15章 读懂DEX并了解DexDump解析过程 313
15.1 环境及开发工具 313
15.2 认识DEX文件结构 314
15.2.1 DEX文件格式概貌 314
15.2.2 DEX文件格式项目搭建 315
15.2.3 DEX文件详细分析 316
15.3 DexDump解析 330
15.3.1 ULEB128格式讲解 330
15.3.2 DexDump解析过程 333
15.4 本章小结 338
第16章 ELF文件格式解读及其生成过程 339
16.1 ELF文件头 339
16.1.1 分析环境搭建 340
16.1.2 elf_header 341
16.1.3 program_header_table 344
16.1.4 section_header_table 344
16.2 ELF可执行文件的生成过程与执行视图 352
16.2.1 ARM可执行文件的生成过程 352
16.2.2 执行视图 357
16.2.3 GOT和PLT 359
16.3 本章小结 365
第17章 高版本Android函数地址索引彻底解决方案 366
17.1 不同版本对于动态链接库的调用对比 366
17.2 高版本加载SO文件 367
17.2.1 自定义库查看库函数的偏移 367
17.2.2 自定义库实现的背景 368
17.2.3 自定义库findsym的实现 370
17.3 SO符号地址寻找 372
17.3.1 通过节头获取符号地址 372
17.3.2 模仿Android通过哈希寻找符号 374
17.4 本章小结 377
第18章 从findExportByName源码分析到anti-frida新思路 378
18.1 两种模式下anti-frida的演示 378
18.1.1 Frida attach模式下的anti-frida 378
18.1.2 Frida spawn模式下的anti-frida 380
18.2 源码分析 383
18.2.1 Frida编译 384
18.2.2 源码追踪分析 385
18.3 本章小结 388
第19章 PLT和GOT的Hook 389
19.1 GOT的Hook 389
19.1.1 根据节头实现Hook 392
19.1.2 根据程序头来实现Hook 395
19.2 PLT的Hook 397
19.2.1 根据节头来实现Hook 397
19.2.2 根据程序头来实现Hook 403
19.3 从GOT和PLT的Hook到xHook原理剖析 406
19.3.1 xHook的优点 406
19.3.2 源码赏析 406
19.4 本章小结 407
第20章 番外篇——另类方法寻找SO文件首地址 408
20.1 项目搭建 408
20.2 封装成库 413
20.3 通过soinfo的映射表遍历符号 415
20.4 dlopen和dlsym获取符号地址 417
20.5 本章小结 418
第21章 Java Hook的原理 419
21.1 Java函数源码追踪 419
21.1.1 什么是Java Hook 419
21.1.2 源码追踪 420
21.2 Java Hook实践 424
21.3 Frida中Java Hook的实现 429
21.3.1 Frida perform源码追踪 429
21.3.2 Frida implementation源码追踪 435
21.4 本章小结 437
第22章 inline Hook中用到的汇编指令 438
22.1 两种Hook方式的介绍 438
22.2 定向跳转 441
22.3 寄存器保存 445
22.3.1 寄存器选择 445
22.3.2 3种寄存器赋值的方案 446
22.4 本章小结 449
第23章 基于Capstone处理特殊指令 450
23.1 编译Capstone并配置测试环境 450
23.2 Capstone官方测试案例演示 453
23.3 自定义汇编翻译函数 456
23.4 基于Capstone修正指令 459
23.4.1 指令修复的目的 459
23.4.2 修复指令的原理 460
23.4.3 指令修复的种类 460
23.5 本章小结 461
第24章 inline Hook框架集成 462
24.1 inline Hook框架测试 462
24.2 结合Capstone框架 467
24.3 本章小结 469
第25章 通杀的检测型框架r0Invoke 470
25.1 r0Invoke牛刀小试脱壳fulao2 471
25.1.1 APK静态分析 471
25.1.2 使用r0Invoke脱壳 471
25.1.3 脱壳操作 472
25.2 r0Invoke进阶:跟踪所有运行在ART下的Java函数 477
25.3 r0Invoke主动调用Native函数并且修改参数 479
25.4 r0Invoke Trace高度混淆OLLVM 482
25.5 本章小结 484
第26章 SO文件加载流程分析与注入实战 485
26.1 SO文件的加载方式 485
26.2 SO文件加载流程 487
26.3 Frida Hook dlopen和android_dlopen_ext 491
26.4 编译AOSP注入SO 496
26.4.1 直接加载sdcard中的SO文件 497
26.4.2 加载私有目录的SO文件 498
26.4.3 编译AOSP注入SO文件 500
26.5 注入优化 502
26.6 本章小结 504
熟悉笔者的读者都知道,2021年出版的《安卓Frida逆向与抓包实战》和2022年出版的《安卓Frida逆向与协议分析》主要介绍了Frida框架在Android平台Java层的工作和作用,包括但不限于Hook、抓包、算法还原、协议分析等领域。Frida框架独特的自动化和规模化逆向功能大大提高了安全从业者的工作效率。它可以使用Python、JavaScript等语言搭建综合性应用安全审计和隐私监控框架。据笔者所知,老牌的安全工具MobSF和Inspackage都将其主要核心动态分析监控代码由Xposed转移到了Frida,足以说明Frida已经成为事实上Java层分析的第一工具。
与此同时,安卓移动端还有很多应用使用C/C 语言进行开发,将逻辑和算法打包进应用包中。这样做带来的好处是:
(1)运行效率和速度的显著提升。相比Java语言的虚拟机解释执行,C/C 语言编译生成的SO文件是直接运行在CPU上的,减少了解释执行的效率损耗,从而使运行速度得到质的提升。例如,我们常用的微信语音和视频功能都是由C/C 代码开发的,这样在较旧的手机上也能有不错的性能表现。
(2)更加安全。Java语言生成的Dex几乎没有安全性可言,一旦被反编译器反编译,其源码几乎等同于完全暴露。相比之下,C/C 语言反编译起来难度较大,即使生成的伪代码也晦涩难懂。此外,经过多年的发展,C/C 代码保护工具和技术更为成熟,例如花指令、强大的混淆、虚拟机等,将算法与逻辑实现放到C/C 代码中可以劝退大多数新手。
因此,安全工具和安全产品几乎全都是由C/C 代码开发的,先将代码编译成SO文件,再在应用中加载这个SO文件,以提供相应的安全功能。作为安全或逆向工程师,学习以C/C 为代表的本地Native开发和JNI(Java与C之间的转换层)开发,就成为必须掌握的技能栈之一。
由此衍生的反编译、动静态调试分析、算法开发、模拟执行、JNI开发、Frida Hook C/C 或JNI、汇编与ELF文件格式、Android源码中的JNI绑定、Native层算法开发及结合Frida的逆向分析技巧等技术,均在本书中有详细的介绍、原理阐述和案例的综合实战。
虽然对于大多数新手来说,SO中的ARM、JNI、算法等已经足够复杂,但这些实际上都还没有涉及更加深入的算法保护机制。在加入OLLVM、VMProtect等机制后的算法分析逆向还原才是真正的噩梦。此外,本书还介绍了忽略算法实现细节而直接调用算法获取结果的Frida RPC机制,帮助只需要结果而不需要细节的读者来翻越强混淆的大山。
Frida不仅在Java平台如鱼得水,而且在Native原生开发的ARM架构上也表现出色。实际上,Frida已经渗透到SO生命中的各个方面,包括进程、线程、指令集、链接器、数据结构、参数传递、内存布局、读写执行、块和执行流追踪等。Frida提供了独立而完善的API,学好Frida对掌握SO的逆向工程也会起到事半功倍的效果。
本书内容介绍
本书共26章,主要内容如下:
第1章介绍基本开发环境配置。
第2章介绍安卓SO动态调试入门。
第3章介绍静态分析工具安装和基本使用。
第4章介绍C算法开发及模拟执行。
第5章介绍动态调试:GDB动态调试、HyperPwn/(内存)断点/栈帧。
第6章介绍汇编开发:ARM汇编原理/流程/调用约定/动态调试。
第7章介绍逆向分析:ELF文件结构、节/区/表/段/符号/链接器。
第8章介绍反编译工具IDA。
第9章介绍JNI接口初识。
第10章介绍JNI特性:Java/Native互相调用、反射/全局/局部引用。
第11章介绍onCreate进行Native化和引用。
第12章介绍JNI动静态绑定和追踪。
第13章介绍MD5算法分析和魔改。
第14章介绍对称加密算法逆向分析。
第15章介绍读懂Dex并了解DexDump解析过程。
第16章介绍ELF文件格式解读及其生成过程。
第17章介绍高版本Android函数地址索引彻底解决方案。
第18章介绍从findExportByName源码分析到anti-frida的新思路。
第19章介绍PLT表和GOT表Hook。
第20章介绍番外篇—另类方法寻找首地址。
第21章介绍Java Hook原理。
第22章介绍inline Hook中用到的汇编指令。
第24章介绍基于capstone处理特殊指令。
第25章介绍通杀的检测型框架r0Invoke。
第26章介绍SO加载流程分析与注入实战。
本书按照由易到难、由浅入深的方式编写,定位于Native层的初、中级内容。希望能够抛砖引玉,对读者学习SO逆向工程有所帮助。
配书资源
为方便读者使用本书,本书还提供了代码源文件,读者需要用微信扫描下面的二维码获取。如果阅读中发现问题或疑问,请联系[email protected],邮件主题写“Frida Android SO逆向深入实践”。
读者对象
?Android应用安全工程师
?Android逆向分析工程师
?爬虫工程师
?大数据收集和分析工程师
书本是静止的,知识是流动的。在本书写作、编撰、排版的过程中,Frida已经升级到了15/16版本,Android也升级到了13版本。但本书中的代码都是可以在特定版本的Frida和Android中成功运行的。同时,Android逆向实践性极强,读者在动手实践的过程中难免会产生各式各样的疑问。为此,笔者特地准备了GitHub仓库更新和勘误,读者有疑问可以在仓库的issue页面提出,笔者会尽力解答和修正。
希望可以与读者一起学习和进步。
编 者
2023年8月
评论
还没有评论。