描述
开 本: 16开纸 张: 胶版纸包 装: 平装-胶订是否套装: 否国际标准书号ISBN: 9787121355202丛书名: 安全技术大系
关注ARM汇编、Hook、软件保护、软件壳及Java层与Native层的逆向分析
系统化的命令和工具介绍、循序渐进的学习路线及生动的应用场景指引动手实践
1.1 搭建Windows分析环境 1
1.1.1 安装JDK 1
1.1.2 安装Android SDK 2
1.1.3 安装Android NDK 5
1.1.4 Android Studio集成开发环境 6
1.1.5 创建Android模拟器 7
1.1.6 Cygwin 9
1.1.7 Bash on Ubuntu on Windows 11
1.2 搭建macOS分析环境 12
1.2.1 安装JDK 12
1.2.2 安装Android SDK 14
1.2.3 安装Android NDK 14
1.2.4 Android Studio集成开发环境 15
1.3 搭建Ubuntu分析环境 15
1.3.1 安装JDK 16
1.3.2 安装Android SDK 17
1.3.3 安装Android NDK 17
1.3.4 Android Studio集成开发环境 18
1.4 常用逆向分析工具 19
1.5 常用Linux Shell命令 19
1.6 搭建源码分析环境 20
1.6.1 在macOS中编译Android源码 20
1.6.2 在Ubuntu中编译Android源码 26
1.6.3 在Windows中编译Android源码 26
1.7 本章小结 27
第2章 如何分析Android程序
2.1 编写个Android程序 28
2.1.1 创建Android工程 28
2.1.2 编译生成APK文件 30
2.2 破解个Android程序 35
2.2.1 破解入手 35
2.2.2 反编译APK文件 35
2.2.3 分析APK文件 36
2.2.4 修改smali文件的代码 44
2.2.5 重新编译APK文件并签名 45
2.2.6 安装和测试 47
2.2.7 小结 48
2.3 本章小结 48
第3章 Dalvik可执行格式与字节码规范
3.1 Dalvik虚拟机 49
3.1.1 Dalvik虚拟机的特点 49
3.1.2 Dalvik虚拟机与Java虚拟机的区别 49
3.1.3 虚拟机的执行流程 54
3.1.4 虚拟机的执行方式 56
3.2 Dalvik语言基础 56
3.2.1 Dalvik指令格式 57
3.2.2 DEX反汇编工具 58
3.2.3 Dalvik寄存器 59
3.2.4 寄存器命名法 61
3.2.5 Dalvik字节码 62
3.3 Dalvik指令集 63
3.3.1 指令类型 64
3.3.2 空操作指令 64
3.3.3 数据操作指令 64
3.3.4 返回指令 65
3.3.5 数据定义指令 65
3.3.6 锁指令 66
3.3.7 实例操作指令 66
3.3.8 数组操作指令 66
3.3.9 异常指令 67
3.3.10 跳转指令 67
3.3.11 比较指令 68
3.3.12 字段操作指令 69
3.3.13 方法调用指令 69
3.3.14 数据转换指令 70
3.3.15 数据运算指令 70
3.4 Dalvik指令练习 71
3.4.1 编写smali文件 71
3.4.2 编译smali文件 73
3.4.3 测试运行 73
3.5 本章小结 73
第4章 常见Android文件格式
4.1 库文件 74
4.1.1 jar包 74
4.1.2 aar包 75
4.2 APK 78
4.2.1 APK文件结构 78
4.2.2 APK文件的生成流程 79
4.2.3 APK的安装流程 84
4.3 classes.dex 90
4.3.1 DEX文件结构 90
4.3.2 DEX文件的验证与优化过程 104
4.3.3 DEX文件的修改 108
4.3.4 MultiDex 111
4.4 AndroidManifest.xml 113
4.4.1 AndroidManifest.xml文件的格式 113
4.4.2 AXML文件格式 114
4.4.3 AXML文件的修改 121
4.5 resources.arsc 121
4.5.1 ARSC文件格式 122
4.5.2 ARSC文件的修改 128
4.6 META-INF目录 128
4.6.1 CERT.RSA 128
4.6.2 MANIFEST.MF 129
4.6.3 CERT.SF 130
4.7 ODEX 132
4.7.1 生成ODEX文件 132
4.7.2 ODEX文件格式 132
4.7.3 将ODEX文件转换成DEX文件 136
4.8 OAT 137
4.8.1 ART虚拟机 137
4.8.2 生成OAT文件 137
4.8.3 OAT文件格式 138
4.8.4 将OAT文件转换成DEX文件 141
4.9 本章小结 143
第5章 静态分析Android程序
5.1 静态分析简介 145
5.2 阅读smali代码 145
5.2.1 smali文件结构 145
5.2.2 循环语句 148
5.2.3 switch分支语句 153
5.2.4 try/catch语句 158
5.3 阅读Java代码 163
5.3.1 将DEX文件转换成jar包 163
5.3.2 jar分析工具 163
5.4 代码定位技巧 164
5.4.1 入口分析法 164
5.4.2 信息反馈法 165
5.4.3 特征函数法 165
5.5 使用JEB进行静态分析 165
5.5.1 安装JEB 165
5.5.2 JEB的静态分析功能 166
5.5.3 JEB的脚本化与插件 169
5.6 使用IDA Pro进行静态分析 170
5.6.1 IDA Pro对Android的支持 170
5.6.2 分析DEX文件 170
5.6.3 定位关键代码 172
5.7 使用Androguard进行静态分析 174
5.7.1 安装Androguard 175
5.7.2 Androguard的使用方法 175
5.7.3 使用androlyze.py进行分析 179
5.8 本章小结 182
第6章 动态分析Android程序
6.1 动态分析框架 183
6.2 动态分析技巧 189
6.2.1 代码注入法 189
6.2.2 栈跟踪法 192
6.2.3 Method Profiling 193
6.2.4 UI检查 196
6.3 使用JDB动态调试APK 198
6.4 使用JEB动态调试APK 200
6.5 使用IDA Pro动态调试APK 201
6.6 本章小结 203
第7章 ARM反汇编基础
7.1 Android与ARM处理器 204
7.1.1 ARM处理器架构概述 204
7.1.2 Android支持的处理器架构 205
7.2 Android ARM EABI 206
7.2.1 armeabi 206
7.2.2 armeabi-v7a 207
7.2.3 arm64-v8a 208
7.3 ARM原生程序的生成过程 208
7.3.1 预处理 210
7.3.2 编译 211
7.3.3 汇编 215
7.3.4 链接 215
7.4 ARM汇编语言 216
7.4.1 ARM汇编程序结构 216
7.4.2 汇编指令 221
7.4.3 寄存器 223
7.4.4 处理器寻址方式 224
7.4.5 子程序参数传递 227
7.5 ARM汇编指令集 230
7.5.1 ARM指令集分类 230
7.5.2 ARM指令编码 231
7.5.3 ARM指令格式解析 233
7.5.4 常见ARM指令 234
7.6 Thumb汇编指令集 240
7.6.1 16位Thumb指令编码 240
7.6.2 16位Thumb指令格式解析 241
7.6.3 32位Thumb指令编码 242
7.6.4 32位Thumb指令格式解析 244
7.7 AArch64汇编指令集 246
7.7.1 AArch64指令编码 246
7.7.2 AArch64指令格式解析 247
7.8 本章小结 250
第8章 Android原生程序开发与逆向分析
8.1 原生程序开发 251
8.1.1 原生程序工程 252
8.1.2 STL的选择 253
8.1.3 JNI 254
8.1.4 编译选项与配置项 256
8.2 原生程序移植 256
8.2.1 ADT项目的移植 257
8.2.2 UNIX开源项目的移植 258
8.2.3 CMake项目的移植 262
8.2.4 其他类型项目的移植 264
8.3 原生程序入口函数 264
8.3.1 原生程序入口函数分析 264
8.3.2 so入口函数分析 269
8.4 原生程序文件格式 271
8.4.1 原生程序的文件类型 271
8.4.2 AArch64 ELF文件格式 274
8.4.3 Program Header Table 278
8.4.4 Section Header Table 281
8.4.5 .dynamic节区 283
8.4.6 字符串表 285
8.4.7 符号表 286
8.4.8 got表与plt表 287
8.4.9 地址重定位表 291
8.5 原生程序逆向分析工具 295
8.5.1 NDK Toolchain 295
8.5.2 IDA Pro 297
8.5.3 Hopper 301
8.6 原生C程序逆向分析 302
8.6.1 编译原生C程序 303
8.6.2 for循环分支结构 305
8.6.3 while循环分支结构 309
8.6.4 if……else分支结构 312
8.6.5 switch循环分支结构 316
8.6.6 优化后的C程序 319
8.7 原生C 程序逆向分析 321
8.7.1 C STL的逆向分析 322
8.7.2 C 类的逆向分析 326
8.7.3 C 程序的RTTI 332
8.8 原生so动态库逆向分析 336
8.9 本章小结 337
第9章 Android原生程序动态调试
9.1 gdb调试器 338
9.1.1 ndk-gdb脚本 338
9.1.2 配置gdb调试器 339
9.1.3 gdb调试器的常用命令 340
9.1.4 使用gdb调试Android原生程序 342
9.1.5 gdb调试器的GUI前端 344
9.2 lldb调试器 346
9.2.1 配置lldb调试器 346
9.2.2 lldb调试器的常用命令 348
9.2.3 使用lldb调试Android原生程序 350
9.2.4 lldb调试器的GUI前端 353
9.3 使用IDA Pro调试Android原生程序 353
9.4 本章小结 358
第10章 Hook与注入
10.1 Hook的类型 359
10.1.1 Dalvik Hook 359
10.1.2 ART Hook 362
10.1.3 LD_PRELOAD Hook 364
10.1.4 GOT Hook 366
10.1.5 Inline Hook 367
10.2 Hook框架Xposed 368
10.3 Hook场景与应用 372
10.3.1 开启日志调试输出 372
10.3.2 APK插件 373
10.3.3 绕过SSL Pinning 373
10.4 动态注入 374
10.4.1 so动态库注入 374
10.4.2 DEX注入 376
10.5 注入框架Frida 377
10.5.1 Frida的安装与配置 377
10.5.2 执行注入与Hook 378
10.5.3 跟踪Native方法 384
10.6 本章小结 386
第11章 软件保护技术
11.1 软件保护技术简介 387
11.2 软件混淆技术 388
11.2.1 源码混淆 389
11.2.2 模板混淆 389
11.2.3 AST混淆 391
11.2.4 IR混淆 397
11.2.5 DEX混淆 397
11.2.6 DEX二次混淆 399
11.3 资源保护 401
11.4 完整性校验 403
11.5 反调试技术 404
11.5.1 调试器状态检测 404
11.5.2 调试器端口检测 404
11.5.3 进程状态检测 406
11.6 运行环境检测 407
11.6.1 模拟器检测 407
11.6.2 Root检测 409
11.6.3 Hook检测 409
11.7 本章小结 411
第12章 软件壳
12.1 Android软件壳 412
12.2 软件壳的特征与侦察 413
12.2.1 编译器指纹 413
12.2.2 软件壳的特征 416
12.2.3 查壳工具 418
12.3 动态加载型壳 418
12.3.1 缓存脱壳法 418
12.3.2 内存Dump脱壳法 419
12.3.3 动态调试脱壳法 420
12.3.4 Hook脱壳法 423
12.3.5 系统定制脱壳法 424
12.4 代码抽取型壳 425
12.4.1 内存重组脱壳法
自2013年《Android软件安全与逆向分析》出版至今,已经过去了五年。目前,移动平台已经成为人们上网的主要方式,手机操作系统只剩下了Android和iOS。Android也从手机平台渗透到智能电视、智能家居甚至智能交通、智慧物流领域。可以说,Android已经融入了我们的生活。五年前,Android才刚刚开始普及;五年后,Android已经“雄霸天下”了。同时,随着Android被广泛地应用到我们生活的各个领域,如何保护自己公司或者甲方的软件,甚至如何有效地进行高强度的保护性开发,都已经成为安全技术人员必须直面的需求。
在这五年中,软件保护技术从代壳——DEX加密、字符串加密、资源加密、反调试及自定义DexClassLoader,进化到第二代壳——DEX抽取与so加固、DEX Method代码抽取、DEX动态加载及so加固,再进化到第三代壳——DEX动态解密与so混淆、DEX Method代码动态解密及so代码膨胀混淆,直至现在流行的第四代壳——代码虚拟化保护,也就是本书主要与大家分享的基于LLVM编译器实现的Obfuscator-LLVM技术。
初入Android安全圈的读者不必担心读不懂这本书。这本书完全从基础讲起,覆盖Android软件安全领域的大部分知识点,是一本内容循序渐进、可以帮助您拾级而上的好书。在跟随非虫畅游Android安全世界的旅途中,您还可以来看雪论坛(www.kanxue.com)寻找志同道合的良师益友,分享学习中的见解和经验,相信这些都会对您开阔视野、提高技术水平有很大的帮助。
看雪学院创始人 段 钢
2018年11月21日
前言
笔者在2013年曾出版过一本Android安全图书——《Android软件安全与逆向分析》。当时,Android软件安全问题刚刚凸显出来。经历了数年的快速发展,Android平台上的安全技术与行业趋势发生了很大的变化,本书会集中讨论这些内容。
首先是Android系统自身的安全性。从笔者开始关注Android领域时的2.2版本至今,Android已经发生了脱胎换骨的变化。应用的权限细粒度管理,系统强制启用SELinux、内核KASLR,以及设备存储的强制全盘加密等多种安全手段的实施,都使得Android系统正在向更安全、更稳定的方向发展。
从Android 4.4开始引入的ART虚拟机到后来不断进行的优化过程中可以看出,APK无论是在安装速度还是在运行时的流畅度上都节节攀升!这是一个好消息。但同时,坏消息也不断传出。Android平台上的软件,经历了数年井喷式的发展,质量难免参差不齐,而恶意软件的横行,也给Android系统的名声带来了不好的影响。幸运的是,这些不好的影响正在远离我们——Android官方对待安全的态度是安全从业人员有目共睹的。
本书包括但不限于以下内容。
*全平台覆盖讲解,包括Windows、Linux、macOS三大平台上的Android软件开发、逆向分析、动态调试、软件壳等内容。
*文件格式讲解,包括DEX、ODEX、AXML、ARSC、OAT、SO等。
*Java层与Native层的软件逆向分析讲解。
*ARM汇编内幕,包括对Thumb指令、ARM指令、AArch64指令格式的讲解。
*Hook与注入方案讲解。
*软件保护技术讲解。
内容特色
本书的内容特色如下。
*循序渐进的学习路线。本书对知识与技术要点的讲解是由浅入深逐步展开的,对工具的使用及原理的讲解符合国人的学习思路。读者可以按照本书的目录顺序阅读和学习。
*大量的实例分析。为了让读者充分感受技术涉及的应用场景,本书在讲解不同的技术要点时,会辅以大量的实例。书中的所有实例均由笔者精心编写并反复调试,所有代码都遵循AGPLv3协议在GitHub上进行了开源。读者可以通过阅读这些实例的源码来加深对技术的理解。
*实用工具的讲解。本书提倡多动手、多实践,而实践的内容之一就是掌握书中介绍的第三方工具。除了系统地介绍一些命令,本书在讲解过程中还使用了大量的第三方工具。这些工具大都是跨平台且免费开源的。掌握这些工具的使用方法,阅读并理解这些工具所产生的代码,了解这些工具的工作原理,有助于将实践与理论结合起来。
如何学习本书内容
本书共12章,系统地讲解了与Android软件安全相关的环境搭建、文件格式、静态分析、动态调试、Hook与注入、软件保护技术、软件壳等主题。环境搭建是学习本书内容的门槛,这部分内容主要针对没有Android开发基础的读者,之后的每一个技术点都是既独立又相辅相成的。虽然有一定基础的读者可以跳过一些自己已经掌握的章节,直接阅读后续内容,但笔者并不鼓励大家这么做。
在本书中,对命令行工具会以直接展示终端命令和输出结果的形式讲解,对GUI工具会以截图展示操作步骤及操作结果的形式讲解。读者可以按照书中的指引一步步地进行操作。
读者定位
本书主要讲解与Android平台软件安全相关的技术,因此在读者的定位上自然离不开“软件”与“安全”这两个领域。
在“软件”领域,适合阅读本书的读者包括:
*高校软件开发相关专业的学生;
*Android软件开发工程师;
*系统底层开发人员。
在“安全”领域,适合阅读本书的读者包括:
*高校信息安全相关专业的学生;
*软件安全研究员;
*逆向工程师;
*病毒分析师。
阅读须知
本书是笔者无数个日夜辛苦调试与写作的成果。写作本书花费了笔者大量的时间与精力。因此,笔者不欢迎阅读盗版书的读者。无论通过什么渠道、出于什么目的,阅读盗版书的行为都对笔者造成了极大的伤害。
任何技术都有自己的应用场景,任何知识都有更新与迭代的周期。写作本书时,恰遇Android系统升级到Android O,Android软件的开发语言正式由Java变为Kotlin,因此,书中讲解的工具与技术都是基于这个时期的系统版本的。本书不对后续系统版本中工具与技术的可行性提供任何担保,也不欢迎好事之徒对书中内容的可行性进行无端的猜测。
本书是一本工具实践书,讲解了工具的使用与原理,以及在实际分析过程中可能遇到的大部分问题。但是,这既不代表本书能够帮助读者解决所有的问题,也不代表读者仅通过阅读本书就可以完整地理解系统的安全机制及所有的软件攻防手法——单纯通过阅读一本书无法完全了解逆向工程这门深奥的学问。
逆向工程是一种特殊的技术,它就像一把利刃,使用得当可以保护自己,使用不当就会伤害别人。本书内容只用于探讨技术,不得用于任何非法目的。任何企图通过本书介绍的技术从恶的读者,都请好自为之。笔者不承担由于滥用本书技术造成的任何后果。
实例代码与勘误
关注微信公众号“软件安全与逆向分析”(feicong_sec),输入关键字“安卓源码”,即可获取本书实例代码的下载链接。
注册成为博文视点社区(www.broadview.com.cn)用户,访问本书页面http://www.broadview. com.cn/35520,即可在“资源下载”处获取本书实例代码,在“提交勘误”处提交对本书内容的修改意见(如果您的意见被采纳,您将获赠博文视点社区积分,积分可用来抵扣购买电子书的相应金额)。
致谢
感谢父母的养育之恩,是他们给予我生命。他们是可爱的人!
感谢老婆对我工作的理解。写作是一件非常辛苦的事情,感谢她在我写作的过程中悉心照顾宝宝,让我能全身心地投入写作。虽然娃儿现在还不太懂得什么叫感谢,不过我还是要感谢他,是他让我的人生变得完整。
好书总能给人带来心灵上的震撼。感谢美女作家李沉嫣,是她那扣人心弦的文字感染了我,给了我踏入写作大门的初动力。
感谢电子工业出版社对本书内容的肯定,以及编辑潘昕对本书质量的严格把控。
很荣幸本书能以看雪软件安全系列图书的形式出版,感谢看雪论坛对本书的支持。看雪论坛是国内专业的软件安全交流社区,欢迎大家一起到看雪论坛进行技术交流。
感谢爱加密对本书的支持。爱加密是全国领先的移动信息安全服务提供商,其独创的App虚拟机保护等多项技术,为全国的企业和政府机构提供了安全保护。
感谢软件安全专家熊猫正正在技术上的悉心指导。
感谢老友听鬼哥讲故事在写作过程中给予的帮助。他“安利”的八段锦拳法,适合每一个IT从业者练习。每天适当运动,能换来一天的好精神。
感谢黄药师多年来对我写作的支持。虽然没有跟他学过太极拳,但他独到的见解,总能让人开阔视野。
感谢bingghost多年来对我写作的支持。尽管饿了么的伙食很好,但这个IT男通过锻炼,完全变成了型男。
感谢roysue-陈佳林。他用年轻化的视角,让我学到了很多。
感谢Google持续开发与更新Android操作系统。Android是目前探索价值的开源操作系统,它不仅能让人们的生活更加丰富多彩,更能优化整个移动互联网的生态、创造良好的就业环境。
感谢ChelpuS开发了Android破解工具Lucky Patcher。在Android 2.0时代,笔者就是通过逆向分析这款工具的实现原理,进入了Android软件加密与解密的奇妙世界。这款工具现在已经开源了,大家可以访问https://github.com/AndroidAppz/LuckyPatcher下载它。
感谢rovo89开发了Xposed框架,这个框架创造了Android平台加密与解密的新玩法。
感谢oleavr开发了Frida框架。虽然我平时不怎么写JavaScript代码,但不得不承认,Frida是非常厉害的框架,它让Android平台加密与解密的玩法上了一个新台阶。
还要感谢很多朋友,他们都在我的技术研究和工作中给予了很多的帮助。他们是:邢俊杰、Luffy-高磊、陈萌萌、OWASP-子明智者、刘杨、画家、周群、f8left、戴帽子的鼠Zz、泉哥、脱壳白、大脸猫、刘庆海、浩克、林浩然、李佳、聂君、葫芦娃、潘博文、郭邵洋、debugee、谢鹏、ilanyu
评论
还没有评论。