安卓逆向必知必会的基础(二)
从开发环境到虚拟机原理,再到四大组件,掌握安卓逆向基础
一、安卓系统架构
安卓基于Linux内核,采用五层架构:最上层是系统APP(电话/短信/浏览器等预装应用),其下是Java API框架(开发接口),再往下是C/C++库与ART虚拟机,第四层是硬件抽象层HAL(动态链接库,用于操作硬件),最底层是Linux内核。

开发方式:可以用C/C++开发,就走本地库(Native层);也可以用Java/Kotlin开发,就走虚拟机执行。操作硬件必须走硬件抽象层HAL。一个安卓进程就是一个虚拟机。
二、Dalvik虚拟机
安卓不用Java的JVM虚拟机,重新实现了Dalvik虚拟机,并且不兼容Java字节码。Dalvik虚拟机只认识.dex文件,所有class字节码都合并在这个文件中。Dalvik空间更小:如果有相同的资源就只会剩一个。

JVM是堆栈虚拟机,汇编代码里没有寄存器。做加法时:push 1, push 2, add, pop。Dalvik是寄存器虚拟机,汇编代码里没有堆栈。做加法时:mov v0,1, mov v1,2, add v2,v0,v1。Dalvik的寄存器一共有v0~v65535。寄存器虚拟机更快,因为模拟的时候可以映射为真实寄存器来操作。

三、ART虚拟机
安卓5.0以后更流畅,因为不再是Dalvik虚拟机,而是采用ART虚拟机。ART虚拟机不再是解释执行,而是转为CPU能识别的文件再由CPU执行。使用ART的代价是空间换性能。

ART虚拟机也具备Dalvik解释执行dex代码的功能,因此oat文件既有汇编代码也有字节码。逆向时,oat文件是重要的分析目标。
四、系统版本与API等级
安卓系统版本号主流是7.0~13.0,版本决定能使用的最高版本API。API等级支持的最低系统版本,如Android 7.0对应API 24。使用与安卓系统相同的API版本才能跟进源码。SDK TOOLS要全装(其中有两个选项可以不装,按需选择)。安卓开发文档:developer.android.google.cn/reference。

五、开发环境配置
开发工具:Android Studio官方IDE,官网developer.android.google.cn,安装教程在/studio/install。IDEA支持下载JDK,下载的JDK属于IDEA自己,不会破坏环境变量。Android Studio不支持中文路径,路径要改为英文。

虚拟机管理:安装虚拟机(模拟器)时要区分Intel/AMD CPU指令集虚拟机和ARM CPU指令集虚拟机。虚拟机路径默认在C盘,必须手动换位置并修改配置文件。将ARM转换为x86至少需要12版本的虚拟机。Java支持RandomAccessFile类做随机访问/移动文件指针。
六、模拟器模拟功能
安卓虚拟机具备丰富的模拟功能:电量调整测试、模拟电话和短信。安卓虚拟机可以互相模拟打电话,一般第一个开的虚拟机是5554,使用5554给5556打电话,5556就收到来电。

创建工程选择空项目。新版本的UI以静态库方式链接进来,这个库就叫支持库(低版本系统可以用部分高版本系统UI API)。
七、工程结构
安卓工程关键文件:java目录是源码目录,res目录是资源目录(图片图标、软件图标、颜色、字符串等资源),AndroidManifest.xml是程序清单文件(描述程序基本信息),grade脚本是编译选项。

软件图标有圆的和方的,是桌面风格,有很多图标是为了适应不同的分辨率。studio输出apk目录。
八、包名与权限
安卓的包名是唯一的,是软件唯一的ID号。一部手机一个包名如果已经存在就不能再安装相同包名的软件了。调用侵犯用户隐私的API必须在清单里说明,不然不能调用。

调用危险API:Windows调用不需要经过同意,安卓需要用户和系统同意才能调用。安卓应用基础:可以使用Kotlin、Java、C++语言编写Android应用。应用入口为什么不是main?因为安卓本就是一个框架,框架内的main会调用OnCreate。
九、进程与用户隔离
安卓中每个进程都是一个用户,系统为每个用户创建文件,多用户文件系统隔离。sdcard目录是公共的,但需要同意:1)系统同意 2)用户同意。

十、四大组件
Windows应用由窗口组成;安卓应用由组件组成。四大组件每个都跨进程通讯。

10.1 Activity
一个Activity类代表一个界面,必须在清单文件中说明有这个界面,不然操作系统不会创建这个界面。界面之间切换,返回销毁界面。栈结构描述界面覆盖情况。当前应用可以随意调用任何进程的Activity。

10.2 Service服务
服务如播放器,看不见界面也在运行。
10.3 广播接收
状态变了系统自动会通知应用,类似回调。进程不存在会创建进程再通知应用,进程存在就通知应用。
10.4 内容提供服务
内容提供服务:两个程序间共享数据的组件。一个应用可以找另一个应用拿数据,另一个应用可以给,也可以拒绝。可能侵犯用户隐私的行为都要在这个文件(清单)说明。

十一、学习资源
安卓开发指南:developer.android.google.cn/guide。官方教程与API参考是深入学习的基础。
十一、总结
1.安卓基于Linux,五层架构:APP/API框架/C库+ART/HAL/Linux内核
2.一个进程就是一个虚拟机,一个虚拟机就是一个Dalvik/ART实例
3.Dalvik是寄存器虚拟机(不兼容Java字节码,只认.dex)
4.JVM是堆栈虚拟机,Dalvik是寄存器虚拟机(v0~v65535)
5.ART(5.0+)编译执行,空间换性能,oat含汇编+字节码
6.系统版本7.0~13.0,7.0=API24,版本决定最高API
7.开发:Android Studio,SDK全装,不支持中文路径
8.虚拟机:Intel/AMD vs ARM指令集,ARM转x86需12版本
9.模拟功能:电量/电话/短信,5554与5556互打电话
10.工程:java源码/res资源/Manifest清单/grade脚本
11.包名唯一=软件ID,隐私API需清单声明
12.危险API需系统+用户双重同意
13.入口不是main,框架main调用OnCreate
14.每进程一用户,多用户文件系统隔离
15.sdcard公共需系统+用户同意
16.四大组件:Activity/Service/广播/ContentProvider,都跨进程通讯
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
如果觉得有帮助,欢迎转发!
关注公众号,输出安卓逆向与底层技术干货。
#安卓逆向 #Android架构 #Dalvik #ART #四大组件 #开发环境 #Activity #APK
夜雨聆风