信息安全兴趣小组 – Android 基本架构

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 <APK Path/>[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工具

  • apktool:将APK文件进⾏反编译的工具
  • 源代码地址:https://github.com/iBotPeaches/Apktool
  • 安装方法:https://ibotpeaches.github.io/Apktool/install/
  • 反编译:apktool d test.apk
  • 回编译:apktool b test
  • 签名:java -jar signapk.jar testkey.x509.pem testkey.pk8 test- unsigned.apk test-signed.apk

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分析工具

  • ⽤的是Java Decompiler(JD-GUI):地址 https://github.com/java-decompiler/jd-gui
  • 比较少见的是Luyten工具:地址 https://github.com/deathmarine/Luyten
  • 某些程序会针对JD的bug做相应的反-反编译的手段,这时候使用Luyten就 有奇效。

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进⾏调⽤

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注