图书目录

目    录

第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