@TOC

起因

最近学习安卓的思想高涨,原因是有个师傅让我帮他看一道安卓题,顺便发了个类似题目的链接
https://www.52pojie.cn/thread-1205156-1-1.html
我看了直呼内行,加上之前并没有系统的学习过安卓逆向,接下来的一段时间内,我会朝着安卓和iot的方向研究,玩玩新花样

架构

Android是谷歌开发的一款基于Linux的开源操作系统,Android底层内核空间以Linux Kernel作为基石,上层用户空间由Native系统库、虚拟机运行环境、框架层组成,通过系统调用(Syscall)连通系统的内核空间与用户空间。对于用户空间主要采用C++和Java代码编写,通过JNI技术打通用户空间的Java层和Native层(C++/C),从而连通整个系统。
在这里插入图片描述

Power Management

当打开手机电源时,引导芯片从固化在ROM里面的代码执行,加载程序到RAM,检查一系列参数

Linux Kernel

1启动swapper进程(idle进程)(pid=0),内核的第一个进程,用作初始化进程管理,内存管理等操作
2启动kthreadd进程(pid=2),为创建其他进程做准备

NDK:Native Development Kit,是Android的一种开发工具包,快速开发C、 C++的动态库,并自动将so和应用一起打包成 APK 即可通过 NDK在 Android中 使用 JNI与本地代码(如C、C++)交互
JNI:Java Native Interface,通过 JNI 能使 Java 调用 C++

HAL

HAL(硬件抽象层),包含多个库模块,每个模块为特定的硬件提供接口

Android Runtime

安卓的运行环境包括核心库(Core Labraries:安卓开发核心库) 和 Dalvik虚拟机(DaLvik Virtual Machine)两部分

核心库:包括了java语言的大部分API和Android的一些核心API
Dalvik虚拟机:基于寄存器的java虚拟机,每一个Android程序都有一个Dalivik虚拟机的实例(这里不是多个程序运行在一个虚拟机上),虚拟机执行的是java字节码转化为dex的中间码

Android 5.0 以下的版本 运行的是 Dalvik 虚拟机。
Android 5.0+ 运行的 ART 虚拟机(Android Runtime)

JVM(java虚拟机)基于栈的,而 Dalvik 虚拟机基于寄存器
JVM运行的是java字节码,Dalvik 虚拟机运行的是DEX

Native层

包含了大量的库,一般都由c/c++实现,逆向分析中的大多数逻辑也在Native层中实现

Java API Framework

java库
包括10部分
1 Activity Manager 活动管理 —— 管理应用程序生命周期,从安装到运行到卸载。提供通用的导航回退( 返回 )功能
2 Window Manager 窗口管理
3 Content Providers 内容提供者 —— 使应用程序能访问其他应用程序(如通讯录)的数据,或共享自己的数据
4 View System 视图系统 —— 丰富的可扩展的视图集合,用来构建 UI 应用程序。包括包括列表、网格、文本框、按钮,甚至是内嵌的网页浏览器
5 Notification Manager 通知管理 —— 使所有的应用程序能够在状态栏显示自定义提醒。
6 Package Manager 包管理、
7 Telephony Manager 电话管理、
8 Resource Manager 资源管理 —— 提供访问非代码资源,如本地化字符串、图形和布局文件
9 Location Manager 位置管理器、
10 XMPP Services XMPP 服务

APP层

平常的应用程序都在这一层
Android的应用运行在Java虚拟机Dalvik之上,即 Java code —> class —> dex、

Native与Kernel之间有一层系统调用(SysCall)层
Java层与Native(C/C++)层之间的纽带JNI

通信

常见的通信方式有三种
Binder、Socket、Handler

Binder

Binder作为Android系统提供的一种IPC(Inter-Process Communication, 进程间通信)机制,
Binder通信采用c/s架构,从组件视角来说,包含Client、Server、ServiceManager以及binder驱动
binder是用于进程间通信

Socket

Socket通信方式也是C/S架构,比Binder简单很多
Socket方式更多的用于Android framework层与native层之间的通信

Handler

Binder/Socket用于进程间通信,而Handler消息机制用于同进程的线程间通信