android安全

来源:互联网 发布:商家联盟管理系统源码 编辑:程序博客网 时间:2024/05/17 07:13

Android架构,其实就是我们所说的“javaon linux”架构。整体架构组件分为5层,包括应用层、应用程序框架、核心库与运行环境层、linux内核层。

 

Android的应用层主要是用户界面(userinterface)、通常以java程序编写,可以包含各种资源文件(放置在res目录)

 

Android的应用程序框架为应用程序层的开发者提供API,本层次包含了UI程序中所需要的各种控件,如Views(视图组件)包括Lists(列表)、grids(栅格)、text boxes(文本框)、buttons(按钮)等,甚至一个嵌入式的web浏览器,一个android应用程序可以利用该层的一下几个部分:activity(活动)、broadcast intent receiver(广播意图接受者)、service(服务)、content provider(内容提供者)

 

核心库与运行环境层分为两个部分,一个是各种库、另一个是android运行环境

 

C库是C语言的标准库,通过linux的系统调用来实现

 

多媒体框架(mediaframework):android多媒体的核心部分,基于packetvideo(PV)的opencore,从功能上分为两大部分,一部分是高频率回放(Playback)、另一部分是音频等记录(record)

 

SGL(2D图像引擎)   OpenGL ES1.0(提供了对3D的支持)

 

界面管理工具(surface management)提供了管理显示子系统的功能

 

SQLite:一个通用的嵌入式数据库

Webkit:网络浏览器的核心

FreeType:位图和矢量字体的功能

 

Javavm是基于栈的虚拟机(stack-based),而Dalvik是基于寄存器的虚拟机(register-based)

Android的linux内核为标准的linux2.6内核,android需要一些与移动设备相关的驱动程序

 

显示驱动:常基于linux的帧缓冲(framebuffer)驱动

Flash内存驱动

照相机驱动:常基于高级linux声音体系advanced linux sound architecture,ALSA)驱动

Wifi驱动:基于IEEE802.11标准的驱动程序

蓝牙驱动:binder ipc 驱动:android的一个特殊驱动程序,具有单独的设备节点,提供进程间通信的功能

 

分区是运输层存储逻辑单元用来区分设备内部的永久性存储结构

 

通常情况下NAND闪存的设备具有以下的分区布局:

BootLoader:系统加载器。相当于电脑的BIOS,在手机进入系统之前初始化软硬件环境,加载硬件设备。常被加密,加密后的bootloader仅能引导官方提供的固件,任何第三方固件不可识别

 

Boot分区:存储着android的Boot镜像,其中包含着linux kernel(zImage)与initrd等文件

Splash分区:存储系统启动后第一屏显示的内容

Rddio分区:基带所在分区,存储着与通信质量相关的linux驱动

 

基带:baseband信源(信息源),也称为发射端)发出的没有经过调制(进行频谱搬移和变换)的原始电信号所固有的频带(频率带宽),也称为基本频带,简称基带

 

Recovery分区:存储Mini型的android boot绝缘文件,主要的作用是用来做故障维修和系统恢复

System分区:存储着android系统的镜像文件,镜像文件中包含着android系统的framework-libraries,binaries和一些预装应用。系统挂载后即/system目录

Userdata:也称数据分区,是设备的内部存储分区,如应用产生的图片、声音等数据文件,系统挂载在/data目录

 

Cache分区:用于存储各种实用的文件,如恢复日志和OTA下载的更新包。当应用程序安装在SD卡时,它也可能包含Dalvik缓存文件夹,其中存储着dalvik虚拟机的缓存文件

 

启动过程:bootloader加载阶段、加载kernel与initrd阶段、初始化设备服务阶段、加载系统服务阶段、虚拟机初始化阶段、启动完成阶段

 

此阶段会运行一些制造商自定义的初始化代码,如启动clock、RAM、media等,并提供加载recoveryimage和运行download mode的支持

--》

Bootloader分区加载linuxkernel与initrd到RAM,最后跳转到kernel继续完成启动

--》

Android kernel则会启动所必须的服务,如初始化memory、初始化IO、内存保护、中断处理程序,CPU调度、设备驱动,最后还会挂载文件系统,启动第一个用户进程init

--》

Init是linux系统中用户空间的第一个进程,PID为1,父进程为linuxkernel核的0号进程。Init具有特殊的初始化使命,它会加载一个初始化启动脚本文件init.rc,启动android系统的一些核心服务,如针对通话的rild,针对VPN连接的mtpd,提供adb相关功能的adbd,支持存储外设的的热插拔功能的vold,负责进程孵化服务的zygote、service manager等

--》

启动的zygote进程会到达dalvikvm,会启动第一个java组件系统服务,最后是androdframework服务,如telephone manager,activity manager,windowsmanager、package manager

--》

系统完成启动之后,载入home桌面应用程序,然后做一些应用层的初始化工作,如播放一个全局的广播ACTIVITY_BOOT_COMPLETED

 

Init进程被赋予了很多极其重要的工作职责,可以代码(system\core\init\init.c)看出:

1.     解析init.rc初始化脚本文件-》2.初始化属性服务(propertyservice)-》3.进入无限for循环,建立子进程,对关键服务的异常进行重启和异常处理

 

Init.rc是系统自定义的一个脚本文件,inti通过解析它执行一些操作:

启动一些系统开启需要启动的service和deamons

指定不同的service在不同的用户或用户组下运行

修改设置全局的属性服务

注册一些动作和命令在特定的时间执行

 

属性服务,(它提供了每一次启动都会载入的存储文件)内存映射,关键值配置设备功能

 

ADB是androiddebugging bridge的简称,是google提供在PC端管理android设备(真机、模拟器)的工具,采用C/S模型,包括三个部分:

ADB Client 客户端部分      ADB Server   ADB Daemom

 

Adb客户端使用了5037端口与adb服务端通信

 

Vold的全称是volumedaemon,即存储类守护进程。Vold是负责系统的CDROM、USB大容量存储、MMC卡等扩展存储的挂载人物自动完成的守护进程。它的主要特点是支持这些存储外设的热插拔

 

Vold处理过程:创建连接(作为一个守护进程,一方面接收驱动的信息,另一方面接收上层的命令并完成相应功能)=》引导l在vold启动时,对现有外设存储设备的处理,首先加载解析vold.conf,检查挂载点是否已被挂载;其次,执行MMC卡挂载,最后处理USB大容量存储=》具体处理

 

Zygote进程同时也是dalvik虚拟机的构造器,在android应用执行时,它负责fork一个自身来执行该应用程序。Zygote是在系统启动时产生的,会完成虚拟机的初始化、库的加载、预置类库的加载等操作,当系统需要一个新的虚拟机实例时,zygote通过复制自身,以最快的速度提供一个虚拟机实例。另外,对于一些只读的系统库,所有dalvik虚拟机实例都和zygote共享一块内存区域,大大节省了内存开销

 

Service_manager主要做了以下三件事情:

打开/dev/binder设备,并在内存中映射128KB的空间

通知binder设备,把自己变成conetxt.manager

进入循环,不停地去读写binder设备,看是否有对service的请求,如果有的话,就去调用svcmgr、handler的函数调用处理请求

传统的linux的ipc(inter process communication)进程间通信)使用的是管道、共享内存、消息队列、socket等,而在android中使用binder机制(基于open binder修改)

Binder可以建立私有通道,Linux的通信机制无法实现

 

共享内存方式,虽然在传输时没有复制数据,但其控制机制复杂(跨进程通信时,需获取对方进程的pid,得多种机制协调操作)

 

管道和消息队列,因为采用存储转发方式,所以至少需要复杂2次数据,效率较低

 

Linux通信机制中,目前只有socket支持C/S的通信模式,但socket通信是一个通用通信接口,其传输效率较低、开销大

 

为了完成进程间通信,binder采用了AIDL(androidinterface definition language)来描述进程间的接口

 

Ashmem的含义是匿名共享内存(anonymousshared memmory),通过这种内核机制,可以为用户空间程序提供分配内存的机制。Ashmem设备节点名称:/dev/ashmem,主设备号为10(misc driver),次设备号动态生成

 

编译过程:资源打包映射,处理AIDL文件,编译源代码Java文件(分为jvm与dalvik编译)

使用AAPT工具对资源文件进行打包,生成R.java文件

(使用android开发中还有一个目录是asset目录,该目录下的资源不会被编译生成R处理,只是简单的压缩)

 

使用aidl工具处理AIDL文件,生成对应的.JAVA文件

 

使用javac命令,编译成java文件,生成对应的.class文件

(编译的java文件包括src目录下的源代码文件、R.java文件和AIDL生成的Java文件)

 

把.class文件转化成dalvik vm(或ART VM)支持的.dex文件

 

打包过程:使用apk builder打包生成未签名的APK文件

签名优化过程:使用jarsigner对未签名的APK文件进行签名

使用zipdign工具堆签名后的apk文件进行对齐处理

 

Android的权限大致可以分为以下三类:API权限、文件权限、IPC权限

 

Android:description 对权限的描述,第一句话描述这个权限所针对的操作,第二句话说明授权后果

Android:label  对权限的一句简短描述

Android:name 权限唯一的标识,一般都是使用包名+权限名

Android:permission.Group   权限所属权限组的名称

Android:protectionLevel  权限的等级,分为四类:

Normal:最低的等级,默认授予次权限的APP,不提示

Dangerous:在安装声明此类权限的app时会提示用户

Singeture:权限表明的操作只针对使用同一个证书签名的app开放

Signature——orsystem:与前一个类似,只是增加了ROM中自带的APP的声明

文件或目录的访问权限分为只读、只写和不可执行

 

Ls –l 查看文件的权限信息。最前面的第2-10个字符用来表示权限。第一个字符一般用来区别文件和目录

d:表示这是一个目录,事实上在ext2fs中,目录是一个特殊的文件

-:表示这是一个普通的文件

l:表示这是一个符号链接文件,实际上它指向另一个文件

b、c:分别表示区块设备和其他的外围设备,是特殊类型的文件

s、p:这些文件关系到系统的数据结构和管道,通常很少见到

 

ipc权限:这些权限的申报和执行发生在不同的层次,包括运行时、库函数,或者直接在应用本身。该权限主要是android不同进程之间的粘结剂

 

完成签名的apk中多了一个meta-inf文件夹,其中有3个文件,MANIFEST.MF文件包含很多APK信息,CERT.SF是明文的签名证书,采用私钥签名得到,CERT.RSA是密文的签名证书,通过公钥生成

MANIFEST.MF文件:对非文件夹非签名文件的文件,逐个生成SHA1的数字签名信息,最后转BASE64存储

CERT.SF文件:堆MANIFEST文件,使用SHA1-RSA算法,用私钥进行签名

CERT.RSA文件:启动保存了公钥、所采用的加密算法等

 

安装APK时,通过CERT.RSA查找公钥和算法,并对CERT.SF进行解密和签名验证,确认MANIFEST.MF,最终对每个文件签名校验

 

Android四大组件模型:activity(界面)、service(服务)、contentprovider(数据存储)、brodercastProvider(广播)

 

Selinux全称为securityenhanced linux.即安全增强型linux。是任意的访问控制DAC模型(任何程序,对其资源享有完全控制权,这些控制权由用户自己定义)和MAC模型(强制访问控制),它的做法是“最小权限原则”selinux是linux最杰出的安全子系统。SEandroid是将原本运用在linux上的MAC强制存取控管套件selinux移植到android平台上,用来强化对app的存取控管,建立类似沙箱的隔离效果,确保app之间的独立运作,也因此可以阻止app对系统或其他应用程序的攻击

 

已root的系统比未root多了两个东西:“su”和”supersuser.apk”

 

Dex文件是android上的可执行文件,由java虚拟机jvm编译后再由android中的虚拟机dalvik所编译而成

 

一个完整的dex文件有三个比较重要的区域片段,header,table,data。其中header存储所有区域片段的大小,偏移量,table存储各种结构化数据。引用数据及数据的偏移量,data中存储则是具体的数据以及代码逻辑

 

 

NDK使用目的:Java+c;对C/C++开发出来的so库进行反汇编难度较大;大部分现成的开源库(opencv,opengl)都是用C/C++代码编写的;要求高性能的应用逻辑使用C开发,从而提高执行效率;用C/C++写的so库可以方便地在其他嵌入式平台使用

 

反汇编(disassmbly)即把目标代码转为汇编代码的过程

 

Android支持ARM,,X86,MIPS3种架构的处理器

 

ARM架构下有3种指令集:ARM,Thumb,Thumb2

 

目前常见的嵌入式处理器有:嵌入式微处理器(MPU)、嵌入式微控制器(MCU),嵌入式DSP处理器(DSP),嵌入式片上系统(SoC)

 

MPU主要有ARM,MIPS,POWERPC,68K

MCU主要有8051,P51XA,MCS-9611961296,C166/167,MC68300

DSP(digital signal processing):主要产品有texas instruments公司的TMS320系列、motarola的dsp5600系列等

 

片上系统SOC:system-on-chip的缩略形式,中文名称为系统级芯片。通用系列包括sismens的trienc motorla的M-CORE等

 

Cwu编译套件GCC(GNU ISNOT COLLECTION)

ANDROID平台上的C/C++编译过程并不是直接在android上编译完成的,是使用了NDKde arm-linux-gcc进行了交叉编译来完成的

原创粉丝点击