环境搭建与使用
Java 环境
Java 开发环境分为 JRE (Java Runtime Environment) 和 JDK (Java Development Kit),我们一般安装 JDK。
JDK 常用 LTS 版本,有 8、11、17 和 21;常见的实现版本是 Oracle 的。
在安装好 JDK 后,需要在环境变量里新增一个 JAVA_HOME
条目,指向需要使用的 JDK 的安装路径,然后在 Path
里增加 %JAVA_HOME%\bin
,便于多版本管理。
JADX
JADX 是 Android Dex 和 Apk 文件的反编译器,可以将文件反编译为 Java 源代码。
注意不要开反混淆,反混淆会修改一些类名,导致后面 hook 函数的时候 hook 失败。反混淆仅在类名显示为乱码时使用。
GDA
GDA 是国产的反编译器,功能也很强大,不过界面相对来说不那么好看
JEB
建议在 JADX 和 JEB 均无法顺利反编译的情况下用 JEB。
需要定制虚拟机,输出 Smali 代码和寄存器数据。
Android Studio 与 ADB
Android Studio 基于 JetBrains IDEA,是 Android 开发的重要工具。
默认的 SDK 路径在 C:\Users\<UserName>\AppData\Local\Android\Sdk
,标准安装会安装最新版的 SDK,在 Language & Frameworks > Android SDK 中可以勾选较旧版本的 SDK
在 SDK Tools 中还需要勾选 NDK (Side by side)、CMake 和 Google USB Driver
我们主要的开发和逆向工作都是在 PC 上进行的,如果需要控制手机应用的运行情况,则要将 PC 和手机关联起来,让 PC 控制手机。这就是 ADB (Android Debug Bridge) 的作用。
在 C:\Users\<UserName>\AppData\Local\Android\Sdk\platform-tools
下,我们就可以找到一个 adb
程序。
ADB 的构成和工作方式:
- 客户端 (Client):用于发送命令。客户端在开发机器上运行。可以通过发出
adb
命令从命令行终端调用客户端。 - 服务器 (server):用于管理客户端与守护程序之间的通信。服务器在开发机器上作为后台进程运行。
- 守护程序 (ADB Daemon, adbd):用于在连接的设备上运行命令。守护程序在每个设备上作为后台进程运行。
graph LR A[ADB 客户端] -->|发送命令| B[ADB 服务端] B -->|返回结果| A B -->|发送命令| C[ADB Daemon] C -->|返回结果| B C -->|执行命令| D[设备] D -->|返回结果| C
使用 ADB 前需要配置:
- 在开发机的环境变量中添加
platform-tools
目录 - 在设备上启用 USB 调试(在默认隐藏的 “开发人员选项” 中),Android Studio 提供的模拟器默认开启。
然后就可以通过 adb devices
查看设备的连接情况了。
主要的 ADB 命令有:
1 | adb help 显示 ADB 命令帮助 |
Logcat
Android 日志记录系统是系统进程 logd
维护的一组结构化环形缓冲区。这组可用的缓冲区是固定的,并由系统定义。该日志系统会存储应用日志、系统日志和崩溃日志。
Logcat 是一个命令行工具,用于转储日志,包括应用使用 Log 类写入的消息。它需要在设备的 Linux Shell 中运行,也可以和 ADB 搭配使用(本质上仍然在 Shell 中运行)。Android Studio 提供了带 GUI 的 Logcat
Logcat 的基本命令:
1 | adb logcat 常规显示 |
Android 扫盲
Android 开发历史简述
Android 4.4 之前,使用 Dalvik / DVM 虚拟机执行 DEX(Dalvik 可执行文件),系统中有 libdvm.so
文件
Android 4.4 时,Google 开始使用 ART (Android Runtime),但仍保留 DVM,系统中并存 libdvm.so
和 libart.so
文件
Android 5.0+ 完全转向 ART,系统架构开始分为 32 位和 64 位
APK 基本结构
apk 本质上是一个具有特殊文件夹结构的 zip 压缩包,其中包括:
- 静态资源文件 (assets):图片、音频、数据库、网页、配置文件、dll 和 so 文件等
- 库文件 (lib):各种平台下使用对应的 so 文件
- 编译资源文件 (res):编译后的布局文件、程序图标
- 签名文件 (META - INF):
- 配置清单文件 (AndroidManifest.xml):图标、界面、权限、代码执行入口
- 核心代码文件 (classes.dex)
- 资源映射文件 (resources.arsc):语言包等
还有其他文件夹,但现阶段我们只关注 lib、AndroidManifest.xml 和 classes.dex 即可
Android 文件目录结构
Android 基于 Linux,因此借鉴了 Linux 的文件树系统。
我们主要关注这些目录:
-
data/data
目录:存放 APP 数据,每个 APP 的数据又存放在该目录下以包名命名的目录内。这是一个私有目录,除非有 Root 权限,否则各个 APP 仅可访问自己的目录。由于这个私有目录对 APP 自己没有权限限制,因此可以将处理后的 APP 文件放在这类目录里。 -
data/app
目录:存放用户 APP 本体。在 Android 10 上,该目录和data/data
近似,目录名称是包名 + 随机数,但 Android 12 开始,变成双层目录,第一层没有包名只有随机数,第二层才是包名 + 随机数。该目录下一般有base.apk
(APP 的原始 APK,大多数情况下可以直接安装)、lib/
(so
文件)和oat
(odex
、vdex
等由 DEX 文件转换得到的文件) -
data/local/tmp
目录:临时目录。该目录的权限比较大,因此也可以将处理好的文件放在这里,不用担心data/data
的权限问题 -
system/app
目录:存放系统 APP 本体。 -
system/lib
和system/lib64
目录:存放 APP 用到的so
文件
Android 正向开发入门
无论是哪种语言 / 平台,要搞逆向,最好是先了解如何正向开发,在正向开发中知道程序的运行流程和代码特点。这一块有很多教程
Android Studio 是主要的开发工具。
在 “New Project” 中选一个工程模板
我们一般比较常用的是 Empty Views Activity 和 Empty Activity 两种,前者是传统的 View 体系界面开发,后者使用 Compose 进行界面开发(固定使用 Kotlin)
—— 隔壁西二在线的 Android 开发入门
新建工程后,AS 就会提示 “Sync Gradle”。由于需要从境外下载资源,因此需要开🪜(但也还是慢啊啊啊)。同步完 Gradle 后就可以开始开发了。
Java 版本不要太高!AS 默认的是 Java 21,就用它自带的或者你自己安装的 Java 21,版本高了构建会报错。
如果 AS 警告说多个 Java,不需要理它。
整个 AS 主要分为三个视图:Project、Code 和 Design 视图(分别位于左、中、右)。
- Project 视图用于显示项目文件和文件夹
- Code 视图用于编辑代码
- Design 视图用于预览应用外观
右上角可以切换 Code 和 Design 视图的可见性。
在 AS 中,我们有两种主要的文件组织方式:Android 和 Project Source Files。前者是 AS 中的标准文件组织方式,后者则是我们在操作系统中使用的组织方式。文件组织方式可以在 Project 视图的左上角进行切换。
好了,基本的工具使用已经介绍完了,接下来介绍一些开发知识。
对于使用 Java 语言开发的项目,我们在 MainActivity.java
中写程序逻辑,在 activity_main.xml
中写程序界面布局。
在 Android 应用中,MainActivity
类的 onCreate()
函数扮演着程序入口点的角色。