0x00 Android逆向前期准备
- Android 设备:模拟器、真机均可,推荐Google系列手机。没有就算了, 没必要特意去买,不建议在日常使⽤的⼿机上操作。
- Android 设备ROM:建议使⽤基于AOSP(Android Open Source Project) 的ROM,也就是所谓的原生安卓,比如LineageOS、CyanogenMod、Mokee、OnePlus H2OS和 O2OS等。
- 需要取得Android 的ROOT权限,推荐Android 版本为Android 5.0 – Android 7.1.1,安装Xposed。
- 电脑:推荐使用macOS或Linux,Windows也可。
0x01 Android 基本事实
- Android是⼀个基于Linux内核的部分开源的移动操作系统。
- 基于Linux内核:后⾯面讲整体架构会提到。
- 部分开源:Linux Kernel是GPLv2的,⽽Android是Apache 2.0的。二者区别参见自由软件基金会对两种协议的定义,主要是关于二次开发后是否可以闭源的区别。
- 基于虚拟机的操作系统:Java必须编译为字节码,在虚拟机上才能运行。
- 应⽤层和框架层主要⽤用Java开发,系统运行库层和Linux Kernel⽤C/C++开发。
- 对⽐:iOS是基于Unix和Darwin内核的闭源的移动操作系统,各层都由C/C++/ Objective-C/Swift开发,直接执⾏机器码,⽆虚拟机。
0x02 Android整体架构
- 自下而上:Linux内核层、运行库层和运行时环境、应用框架层、应用层
0x03 Android 上使用的Java虚拟机
- JVM:Java Virtual Machine。PC和Mac电脑上Java的运⾏环境,是基于栈的虚拟机,局部变量的空间都分配到栈内存上。一般x86处理器是基于栈的管理理内存方式,因为x86处理器的寄存器数比较少(⼏十个),⽽PC和 Mac的内存都比较大,一般都在1-2GB以上,所以采用这样的分配方式。
- Dalvik/ART:Android没有使用标准JVM,而是Dalvik/ART。Dalvik/ART 是基于寄存器的虚拟机,局部变量的空间都分配到寄存器上。ARM处理器的寄存器数很多(数百个),最初移动设备普遍内存比较小,只有512MB-1GB。(当然现在Android内存⼤了,那是另外的原因)
0x04 ADB简介
- ADB(Android Debug Bridge):是Google提供的用于在计算机上访问 Android设备的⼀个调试工具,是Android SDK中platform tools的一部分。
- 安装ADB:可以随Android SDK一起安装,也可以单独安装。最简便的⽅ 法是通过Android Studio来安装Android SDK。
- 在命令行使⽤ADB之前需要配置环境变量(Environment Variables),具体⽅方法请百度。
0x05 ADB常用命令
- adb devices:列出所有adb设备
- adb start-server / adb kill-server:启动/杀死adb服务
- adb shell:连接到Android 的本地Shell
- adb install [example.apk]:将example.apk安装到Android 上
- adb uninstall [PackageName]:将PackageName这个App卸载
- adb forward [Protocol]:[LocalPort] [Protocol]:[RemotePort]:端⼝转发
- adb logcat [Tag]:显示Android 的logcat
0x06 APK文件结构
- lib:C/C++库文件
- META-INF:一般包含签名文件
- res:资源文件,主要包括layout和string等
- AndroidManifest.xml:Android清单文件,描述应用入口和权限等关键信息
- classes.dex:DEX可执⾏文件,主程序的字节码
- assets:此部分的文件在生成APK时不会被编译
0x07 apktool工具
0x08 dex2jar工具
- 将dex文件转换为jar文件(实际上是dex转换为class),⽅便使⽤jar分析工具进⾏分析。
- 源代码地址: https://github.com/pxb1988/dex2jar
- 给予运行权限:sudo chmod -R +x ./
- 用法:./d2j-dex2jar.sh classes.dex (Windows使⽤用bat文件) 在d2j-dex2jar.sh所在目录⽣生成classes-dex2jar.jar
0x09 JAR分析工具
0x0A Android 静态分析方法总结
- Android静态分析主要分两个部分:Java层和Native层
- Java层:使⽤用APKtool等工具反编译,得到Smali。或者解压后直接得到dex,再使用dex2jar工具转换为jar,最后使⽤jd工具查看Java代码。或者使用JEB直接得到Java代码。
- Native层:使⽤用IDA Pro进⾏分析。
0x0B Android NDK 开发简介
- Android NDK:使⽤用C/C++进行Android 开发
- Android Studio安装NDK较容易,已经包含在SDK中。
- 在APK中,NDK代码位于:/lib/架构名称/libxxx.so
- 通过JNI进⾏调⽤