期末复习笔记
第一章 移动应用安全概述
- Android系统安全的两个层面?系统安全和应用安全
- 系统安全有哪些方面?内核层安全、构架层安全和用户认证机制
- 应用安全有哪些方面?恶意应用检测和漏洞安全
- Android系统框架各层所涉及的安全内容?应用程序层(代码安全,接入权限)、应用程序框架层(数字证书)、本地库和虚拟机运行环境(SSL:网络安全、Sqlite:数据库安全、虚拟机:安全沙箱)、内核层(即Linux内核,涉及文件访问控制)
- 获取root权限的好处:卸载预装软件、系统运行提速、去除广告通知、延长手机续航
- 获取root权限的坏处:系统不稳定、病毒侵入、隐私数据暴露
- root权限获取分为哪两类?临时获取(不对系统进行修改,利用系统漏洞临时获取root权限,下次还需要获取)和永久获取(修改系统,手机随时获得root权限)
- root权限获取方法:刷机和系统运行时利用本地漏洞提权获得
- Android调试桥(adb):通过命令行同模拟器或移动设备通信的软件工具(C/S模式)
具体功能包括安装卸载应用程序、执行shell命令、查看日志、检查SQLite数据库等
包括三部分
- adbd守候进程(安卓设备或虚拟机上)
- adb服务器(计算机上)
- adb客户端(计算机上)
adb的工作原理图:
常用命令:adb devices 检查设备机器状态
adb install 360vulscanner.apk 安装应用
adb shell 进入shell
adb uninstall com.qihoo360.leakscan 写在用用
第二章 设备信息获取
- Android设备信息种类:联系人、照片、日程、记事本、短信、彩信、邮件、浏览历史、位置信息、社交媒体、金融、密码
- Android文件系统分区:系统分区、数据分区、Cache分区、SD卡分区
- shell操作: mount:查看文件系统 id:看看用户id
- Android应用程序数据存储方式
- 存储应用程序数据的目录:shared_prefs:保存SharedPreferences数据;databases:数据库文件保存在此目录中;files:应用的文件;cache:存放临时缓存
- Android 0/6.0-,进入adb shell后,默认是root用户; Android 0+默认是普通用户,需要执行su获取root权限;
- 手机里一个用户应用的数据库文件(给定路径和名字)复制到电脑上的步骤:①cp /…./contact.db /sdcard (先将目标文件复制到/sdcard);②Adb pull /sdcard/contact.db D:\temp (从手机拷贝文件到计算机)
- Android数字签名机制: Android系统中所有的程序必须经过数字签名后才能安装(模拟器、终端均是如此)。理由:识别程序开发者、检测程序是否被篡改、在程序间建立信任关系。原理技术:非对称加密技术。密钥包括公钥(加密密钥)和私钥(解密密钥)称为一个密钥对。公钥公开,私钥保密。公众向私人发送数据时,使用公钥对数据加密,私人收到加密数据后,使用私钥解密数据。典型的算法有RSA、DSA等。签名的数据时间较大时,可以首先计算数据的摘要,然后对摘要进行签名。
- 数字证书:公钥需要发布给很多人使用,向用户传送公钥使用的分发机制是数字证书。数字证书中包括实体的名称、实体的公钥和数字签名。证书颁发机构 (CA) 对证书的名称和公钥部分进行签名,以便确认公钥来自声称发送公钥的主体。Android签名证书可以不需要权威机构认证授权,即使用自签名(self-signed)证书。(可能会有安全证书有问题的警告)
- 查看app签名方法:
Windows环境下将hootsuite.apk改名为hootsuite.zip
将hootsuite.zip文件解压缩
解压后,可以看到一个META-INF目录,在该文件夹下有三个文件:
(1)MANIFEST.MF文件
这是摘要文件。程序遍历APK包中的所有文件,对非目录、非签名文件的文件,逐个用SHA1生成摘要信息,再用Base64进行编码。
(2)CERT.SF文件:这是对摘要的签名文件。
(3)CERT.RSA文件:保存了公钥、加密算法等信息,还包括对CERT.SF中的内容的用私钥进行加密之后的值。
查看Androidmanifest.xml文件的sha-1哈希值,并复制
将Androidmanifest文件的sha-1哈希值转换为base64编码(在线编码或找一个编码器工具)
用OpenSSL工具从签名文件cert.rsa中查看签发人、主体、公钥、签名信息。
openssl pkcs7 -inform DER -in CERT.RSA -noout -print_certs -text
第三章 Android应用签名
1.两种不同模式的签名:
Android Studio 针对Debug模式提供了调试签名,用于调试时的应用签名。Debug模式使用默认的debug.keystore密钥库进行签名
Android Studio 针对Release模式提供了发布签名用于正式发布时对应用进行签名。需要自己创建密钥库
2.别名(alias)区分不同密钥,签名时,使用密钥库中的一个指定别名的密钥进行签名
3.进程沙箱原理
-Unix/Linux假设用户之间不可信。
-Android假设软件之间不可信。Android扩展了Linux内核安全模型的用户权限机制,将用户隔离机制扩展为应用程序隔离。
-Linux中使用用户标识(UID)识别一个用户。Android中使用一个UID识别一个应用程序。在安装程序时向其分配UID。应用程序存续期内,其UID保持不变。
-权限机制根据UID限制用户对资源和设备的访问。
-不同应用程序分属不同用户,应用程序运行于自己独立的进程空间,UID不同的程序自然形成资源隔离,生成了一个操作系统级别的应用程序“沙箱”。
4.查询当前进程情况的命令:ps,可以看到app应用都分配了一个user(UID)属性,在不卸载这个应用之前,该属性保持不变,非系统应用user都以u0_开头命名,之后的编号就是uid。但是pid是进程id,结束进程重新打开后就会变。
5.杀死程序的命令:kill
6.共享UID机制原理
-使具备信任关系的应用程序可以运行于同一进程空间(共享资源)
-android中PID和UID都是用来识别应用程序的身份的,但UID可以用来为不同程序共享数据
-信任关系由程序应用签名确定,并在Manifest.xml文件中指出使用相同UID
-在Android 中要通过UID共享数据只需在程序a和b中的Manifest文件配置即可
-android:sharedUserId="com.share"
7.实现共享UID的方法:
使用ps命令查看ShareIdA与ShareIdB的UID。
在ShareA和ShareB各自的AndroidManifest.xml文件中加入android:sharedUserId="com.share";
在虚拟机上删除ShareA和ShareB后,将新的ShareA和ShareB依次装入虚拟机并执行;
执行ls /data/data/com.sms.sharea,看看这次是否存在fileb文件;
如存在使用ls -l 命令查看文件的所有者和组用户是谁;
使用ps命令查看ShareA与ShareB的UID。
第四章 Android应用权限管理
1.应用所需的权限和其他程序调用本程序所需的权限都在安装程序包(apk文件)中的AndroidManifest.xml声明
2.应用权限声明
-AndroidManifest.xml声明权限的写法
<uses-permission android:name=*“权限名”*/>
-一般写在<application >元素的前面
3.应用权限分类:普通权限(不会威胁到用户安全和隐私,系统自动授权)和危险权限(可能会触及用户隐私或者对设备安全性造成影响的权限,必需用户手动授权才可,否则程序无法使用相应功能)
4.危险权限中如果同一组的任何一个权限被授权了,其他权限也自动被授权。例如:WRITE_EXTERNAL_STORAGE被授权了,app也有READ_EXTERNAL_STORAGE权限了。
5.串谋权限攻击:
- Android程序中资源的访问通过以下两个途径实现:
- Android Framework提供的功能,由Android系统提供的权限机制进行控制;
6.访问其它程序的组件,其他程序组件自定义权限控制。正常情况下,程序没有声明特定的访问权限,就无法访问这些资源。
但通过其它程序中可访问资源的Android组件,就有可能突破访问控制,从而提升程序本身的权限,这种权限提升的攻击方式称为串谋权限攻击。
串谋权限攻击的原理如图所示 :
- 串谋权限攻击的防范
串谋权限攻击产生的原因是Android组件可被外部调用
在发送者和接收者之间进行约定,防止第三方:
方法:自定义权限
- 自定义权限的级别
- 级别分为四种 Normal、Dangerous、Signature与Signatureorsystem 不同级别限定了应用程序行使此权限时的认证方式
- Normal:正常权限,不会给设备带来风险;
- Dangerous:危险权限;
- Signature:只有App1和App2使用相同的签名方许可;
- Signatureorsystem:除了允许相同签名的程序调用外,对于Android中系统应用程序调用也是许可的。
第五章 短信拦截
1.短信拦截的方法有?监听数据库变化方式监听短信和设置默认SMS app
2.监听数据库变化方式监听短信 实现方法:
①监听短信数据库的变化,添加删除修改,变化的时候会回调onChange方法
②提取刚刚变化的那条短信的内容
③ContentObserver——内容观察者,目的是观察(捕捉)特定Uri引起的数据库的变化,继而做一些相应的处理,它类似于数据库技术中的触发器(Trigger),当ContentObserver所观察的Uri发生变化时,便会触发它。
3.设置默认SMS app
修改AndroidManifest:设置短信获取的权限,包含4个权限,请查看AndroidManifest不同之处
增加4个类:SmsReceiver,MmsReceiver,
ComposeSmsActivity,HeadlessSmsSendService,并且这四个一个都不能少
设置SMS默认APP
第六章 Android代码混淆与应用加固
1.代码混淆:粗略地讲,就是将代码进行加密,使得别人拿到你的apk文件进行反编译后也无法获取到正确的代码(比如说,变量名、类名等被替换为A、B、C、D等),这样,别人就看不懂你这个类或者这个变量是什么意思了
2.代码混淆方法:配置build.gradle,把minifyEnabled设置为true并配置proguard-rules.pro
3.如果没有混淆,从apk可以很容易的反编译出 .java文件:
- apk文件改为.jar文件,apk文件实质就是jar文件
- 解压jar文件后,得到 classes.dex文件
- 使用工具 dex2jar,将dex文件变成jar文件
- 使用jd-gui得到java文件
4.大部分的apk反编译工具(dex2jar、apktools、jui等)都是对dex文件进行反编译,将dex文件反编译成smail,然后再转化成class文件进行阅读和修改。如何保护apk文件?
解决办法:
Dex加固:对源Apk进行加密,然后在套上一层壳。
对APP进行安全加固,有利于:
(1) 保护应用不被静态分析和动态调试
(2) 保护应用内的敏感存储数据安全
(3) 防止应用被进程注入
(4) 防止应用被二次打包
(5) 保护知识产权
(6) 保护开发者收益
(7) 保护品牌形象及信誉
5.应用加固:dex加固主要是防止被静态反编译,进而获取源码并修改。
用壳dex替换原始dex文件之后,用反编译工具反编译apk文件,只能看到壳程序的class文件,看不到apk本身的class文件。对dex文件进行加密,这样即使第三方拿到了dex文件,因为无法解密,也就无法对其进行解析和分析。
6.应用加固步骤:
准备源APK,就是需要加固的APK
准备壳APK
获取壳APK中的Dex文件classes.dex
将源APK与壳Dex文件合并生成新的classes.dex
将新的 classes.dex 替换进入壳APK,生成加壳后的新APK
对加固后的apk文件进行签名,apk加固完成。
对齐:使APK包内未压缩的数据有序排列对齐,从而减少APP运行时内存消耗
在加固的过程中需要三个对象:
1、需要加密的Apk(源Apk)
2、脱壳程序Apk(负责解密Apk工作)
3、加壳程序(将源Apk进行加密和壳Dex合并成新的Dex)
7.V1签名与V2签名
V1签名:密钥来自JDK(密钥库:jarsigner), 对zip压缩包的每个文件进行验证, 签名后还能对压缩包修改(移动/重新压缩文件)
V2签名:来自Google(密钥库:apksigner), 对zip压缩包的整个文件验证, 签名后不能修改压缩包
第七章 Android恶意代码静态分析
- 静态分析:静态分析是指在不运行代码的情况下,采用词法分析、语法分析等各种技术手段对程序文件进行扫描从而生成程序的反汇编代码,然后阅读反汇编代码来掌握程序功能的一种技术。
- 静态分析方法种类: 1. 使用APKTool工具反编译APK生成Smali文件,然后对程序进行分析2. 阅读反汇编生成的Dalvik字节码,可以使用IDA Pro分析dex文件,或者使用文本编辑器阅读反编译生成的smali文件;3. 阅读反编译生成的Java源码,可以使用dex2jar生成jar文件,然后在使用jd-gui阅读jar文件的代码
- 使用APKTool对Android程序Crackme0701分析与破解,Crackme0701功能是输入用户名和密码进行验证1. 1. 运行Crackme0701查看结果2. 使用APKTool反编译APK文件3. 分析APK文件 所有的索引值保存在public.xml文件中。unsuccessed的id值为0x7f05000b,在smali目录中搜索包含0x7f05000b的文件,最后发现只有MainActivity$1.smali文件一处调用。4. 修改Smali文件 在MainActivity$1.smali文件文件中查找“if-nez”,将.line 32行的代码“if-nez v0, :cond_0”改成“if-eqz v0, :cond_0”,并保存5. 重新编译APK文件并签名
- 使用IDA Pro分析恶意代码, 分析Crackme0702(细节和用APKTool一样) 1. 1. 使用ZIP工具解压缩APK文件2. 使用IDA Pro打开DEX文件并进行分析。3. 修改DEX文件4. 重新修复与签名
历年题
21级期末试题
选择题(10*2=20分)
1.Android的四大组件
2.点击Button后的活动按钮是什么
3.同一进程空间的的条件
4.运行a程序,关闭a程序再运行a程序,两次运行的uid和pid有无变化
5.脱壳程序还没运行,此时想运行源文件apk,要用的方法
6.短信拦截设置默认Sms App必须要加的四个类有哪些
7.安卓使用的数据库是哪个?
8.数字证书包括哪些内容?
9.数字签名的理由有哪些
填空题(5*2=10分)
1.控制不同应用之间信任的是什么
2.文件系统的四个分区
3.META-INF目录文件夹下的三个文件有哪些
4.签名的debug模式使用的密钥库名称
5.获得root的两种方法
简答题(10*3=30分)
1.安卓安全的分类
2.安装与卸载的adb命令
3.安卓设备上的文件移动到电脑上的步骤
代码题(20*1=20分)
1.短信拦截的原理
2.onReceive方法代码补充:继承的父类是什么、Toast显示信息、拦截代码
分析题(20*1=20分)
APKTool分析crackme的步骤
20级期末试题
(只有部分)
填空
1.命令__获取root权限
2.保存联系人的数据库名字
3.签名是什么加密
4.Debug模式下用的密钥库是___
5.拦截短信的两种方式
6.v2签名用的密钥库
简答
画图说明串谋权限攻击
手机里一个用户应用的数据库文件(给了路径和名字)复制到电脑上的步骤
用APKTool静态分析方法登录Crackme的过程
壳程序和加壳程序的作用
版权归原作者 一陸向北 所有, 如有侵权,请联系我们删除。