乐于分享
好东西不私藏

安卓逆向开发基础:开发环境与Android应用架构

安卓逆向开发基础:开发环境与Android应用架构

安卓逆向必知必会的基础(二)

从开发环境到虚拟机原理,再到四大组件,掌握安卓逆向基础

一、安卓系统架构

安卓基于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

安卓逆向开发基础:Java与Kotlin语法详解

手搓APK:从零手动编译Android安装包

ARM64汇编逆向功底(一):寄存器·工作模式·调用约定

CR3博弈:Windows内核读游戏内存的物理映射与伪造页表基址对抗