Android逆向之旅---Android中如何获取在非Root设备中获取应用隐私数据

一、前言

今天在开发的过程中遇到一个问题,就是关于AndroidManifest.xml中的allowBackup属性,也算是自己之前对这个属性的不了解,加上IDE的自动生成代码,没太注意这个属性,但是没想到这个属性会直接导致隐私数据的丢失。下面就来看一下这个属性的影响到底有多大。他的作用是什么?

二、Android中的allowBackup属性

1、allowBackup安全风险描述
Android API Level 8及其以上Android系统提供了为应用程序数据的备份和恢复功能,此功能的开关决定于该应用程序中AndroidManifest.xml文件中的allowBackup属性值[1] ,其属性值默认是true。当allowBackup标志为true时,用户即可通过adb backup和adb restore来进行对应用数据的备份和恢复,这可能会带来一定的安全风险。

Android属性allowBackup安全风险源于adb backup容许任何一个能够打开USB 调试开关的人从Android手机中复制应用数据到外设,一旦应用数据被备份之后,所有应用数据都可被用户读取;adb restore容许用户指定一个恢复的数据来源(即备份的应用数据)来恢复应用程序数据的创建。因此,当一个应用数据被备份之后,用户即可在其他Android手机或模拟器上安装同一个应用,以及通过恢复该备份的应用数据到该设备上,在该设备上打开该应用即可恢复到被备份的应用程序的状态。

尤其是通讯录应用,一旦应用程序支持备份和恢复功能,攻击者即可通过adb backup和adb restore进行恢复新安装的同一个应用来查看聊天记录等信息;对于支付金融类应用,攻击者可通过此来进行恶意支付、盗取存款等;因此为了安全起见,开发者务必将allowBackup标志值设置为false来关闭应用程序的备份和恢复功能,以免造成信息泄露和财产损失。

2、allowBackup安全影响范围
Android API Level 8以及以上系统

3、allowBackup安全风险详情
1) allowBackup风险位置:

AndroidMannifest.xml文件android:allowBackup属性

2) allowBackup风险触发前提条件:

未将AndroidMannifest.xml文件中的android:allowBackup属性值设为false

3) allowBackup风险原理:

当allowBackup标志值为true时,即可通过adb backup和adb restore来备份和恢复应用程序数据

三、如何在非root设备上获取隐私数据

好了,上面我们就了解了,原来allowBackup属性的风险很大。下面我们看看现在如果这个属性是false的话,我们怎么在没有root的设备去获取数据呢?

首先我们看这样一个场景,现在市场上有一些应用锁类的app,他们就是给每个应用打开的时候添加一个密码,在打开app的时候需要输入密码才能进入指定的应用,一般会把自己的银行app,通讯类的app加密。现在市场上这些应用锁的原理也很简单,一般是三种方式实现:

1、最古老的方式,启动一个Service然后隔一段时间去轮训,获取当前的topActivity,然后进行操作。

2、因为Android5.0以后,获取当前的topActivity需要授权,所以这里还需要做一个操作就是引导用户去开一些功能。

3、通过辅助功能,可以监听当前Window的变化,这种方式比上面的轮训方式高效的多了。

其实1和2两种方式差不多,唯一的区别就在于获取topActivity的方式,其实google意识到了,获取topActivity是很危险的一件事:

在之前的一篇文章中说到了:Android中通过应用锁盗取账号,恶意的软件,可以通过这个功能,使用一个类似于QQ或者支付宝这样的app,当用户启动QQ或者支付宝的时候,我们可以监听到,然后就启动我们自己的模拟QQ或者支付宝的登录页面然后就可以获取到用户名和密码了,完成盗取。

下面我们来看一个市场上比较火的一款应用锁app:智能应用锁

我们下载apk,之后使用aapt查看他的AndroidManifest.xml内容:

aapt dump xmltree applock.apk AndroidManifest.xml > D:\demo.txt

注:我们在拿到一个apk的时候,如果想知道apk中的一些资源和配置信息,aapt命令是个不错的选择,同时,他能够删除apk中的一些资源,添加一些资源到apk中都是可以的。

这里因为AndroidManifest.xml内容有点多,就重定向到一个txt文件中,我们看到allowBackup属性为true,因为非0的都是true。好吧,说明applock.apk这个应用咋们是可以使用adb backup命令进行隐私数据的备份的。下面咋们就来看一下如何进行备份:

1、第一步:使用adb backup -f applock.ab com.thinkyeah.smartlockfree 进行数据的备份

adb backup [-system|-nosystem] -all [-apk|-noapk] [-shared|-noshared] -f <档案名称> [需要备份的应用包名]
1> [-system|-nosystem]

这个指令是告诉adb 在备份时是否要连同系统一起备份
若没有打的话 默认是-system 表示会一起备份系统
注意!若连系统一起备份 在还原的时候会复盖系统档案 对于已经升级后的手机是非常不好的
我不知道在没有ROOT的情况下 adb是否有权限去还原系统档案 但就算如此 还是不建议这样做
因此 -nosystem是建议一定要打上的指令
2> -all
这个指令除非只是要备份单一APP 不然是一定要打上去的 
这个是问你是否要备份全部的APP 若有加上-nosystem的指令
那么他就只会备份你目前已经安装上去的APP 而不会连系统APP一起备份
3> [-apk|-noapk]
默认是-noapk 这个的意思是是否连安装的APK一起备份
若为-noapk 则只会备份APK的资料档(像是游戏存盘 设定 之类的)
4> [-shared|-noshared]
默认是-noshared 这个会问你是否连手机储存空间或是SD卡的档案一起备份

关于这个应用的包名,我们可以直接从上面dump出来的AndroidManifest.xml中获取即可:

获取包名之后,我们就可以执行命令,我们把导出来的文件保存到当前目录下:applock.ab,注意这里的格式是ab,这个也是Android中备份文件的格式要求。

当我们执行这个命令的时候,设备端会出现一个提示页面:

这时候会提示我们输入备份密码,这里为了简单,不输入,直接点击备份即可。

下面,我们还需要借助一个工具来解析这个ab文件。


第二步:使用android-backup-extractor(abe)工具来解析ab文件

这个工具是开源的,用Java语言写的。源码位于:https://github.com/nelenkov/android-backup-extractor

这里没有直接下载源码,然后编译了,直接在网上下载了一个编译好的

这里我就下载好了,可以从这里下载:http://download.csdn.net/detail/jiangwei0910410003/9523470

用法也很简单:

看到我们使用unpack参数来将ab文件转化成tar文件:

java -jar abe.jar unpack applock.ab applock.tar

我们在用解压缩软件查看内容:

我们现在如果想知道他的密码,那么可以直接查看SharePreferences文件即可,因为一般都会把密码放到这里保存,不过这是一个非常危险的操作,如果你在不进行加密的话,那更是危险了。

我们查看SmartLockConfig.xml内容:

好吧,被我们猜中了,他尽然把手势密码以明文的方式保存在这里。这里他用的是手势方式加密:03678,代表的应该是一个L:

到这里我们就成功的破解了智能应用锁的加密app的功能,而且是在没有root的情况下。下面来总结一下:

1、这个智能应用锁的app现在在市场的下载量还是蛮高的,已经有100W的下载量了,但是我们看到他的一不留神allowBackup属性设置成true,这样就导致了数据可能被外泄,不过这个属性google不知道怎么去对待他的,他的默认值尽然是true,而且更为有趣的是,在使用各大IDE工具,默认新建的工程之后,这个属性的值也是true

     

上面就是现在比较常用的两个IDE工具:Eclipse和AndroidStudio,看到当我们新建一个工程的时候,他默认都是把这个属性设置成true的,那么当你不设置设置个属性的时候,也是可以进行备份的,因为默认值也是true的,所以按照google的想法,应该是为了防止数据的丢失,就留了这一个功能。便于用户备份数据。但是这里会隐含一些安全问题,所以我们在开发的时候,如果不去注意这个属性的话,就会吃亏的,所以在开发的过程中一定要记得把这个属性设置成false,特别是非常重要的需要账号登录的app。

2、上面分析了智能应用锁的app,并非只是一个案例,其实现在很多app都有这个问题,我们看看豌豆荚app

他也是没有手动的改变这个属性为false的,所以他的数据也是可以导出来的。

再看看优酷视频app

也是一样,不过像这些app,他们的账号登录密码啥的信息肯定不是放在本地的,而是放到服务端进行验证的,不像应用锁这样的,他不需要联网也是可以进行操作的,所以密码必须放到本地。但是只要有这个属性allowBackup为true的话,就会被查看到沙盒数据,就是不安全的。最后我们再来看看微信5.0版本也有这个问题,不过他在6.0之后已经把allowBackup设置成false了:

这里我们看到他没有设置allowBackup属性,但是刚刚说了,默认值就是true,所以还是可以导出来的,下面我们可以使用上面的导出步骤进行操作:

这里,其实微信他把通讯录和聊天记录,都是保存到db中,但是这个db是进行加密的,然后保存到一个目录下面的,关于这个db加密,其实是需要反编译微信,然后动态调试跟踪代码来破解了,这个后面会写一篇文章详细介绍的,因为我们知道,通讯录和聊天内容是没有网络就可以查看的,那么加解密肯定是放在本地做的,只要是放在本地做的,那么就可以进行破解。

不过这里看到微信在后续的版本已经修复了这个问题,6.0版本之后就不能导出来数据了,那么5.0的用户其实还是会受影响的。

3、还是回到这个应用锁app中来,其实在这里还是想吐槽一番的,作为下载量蛮高的app,尽然把密码用明文保存到xml中,这种做法其实是对用户的不负责,首先这里完全可以使用MD5来做密码验证就可以了,为何要暴露明文,其次是为何把这么重要的数据保存到xml中,稍微加点难度破解的放到so中也是可以的呀~~

4、破解场景:之前我看到好几个同事都下载了这个app,去加密相册app,QQ和微信啥的呀,其实现在看来并没有什么用,当我拿到手机的那一刻,什么都是可以做的,而且不需要root,只需要一个命令就可以了,完全的悄无声息,没法察觉的就看到密码了。

5、所以在开发的过程中,我们在最后一步发包的过程中一定要检查一下这个属性是否为false,因为他牵涉到你的太多隐私信息了

补充:

1、我们可以使用adb backup命令来做一下操作,就是我们在开发过程中,如果遇到手机没有root的,但是又想查看沙盒数据,那么这个也是一种方式,当然我们可以使用run-as命令来操作,不了解run-as的同学可以看这篇文章:Android中的run-as命令使用 但是这个也是一种方式,虽然看上去有点繁琐。

2、与上面的adb backup命令相对应的还有一个就是adb restore命令,他是用来恢复数据的,具体用法:

adb restore applock.ab

这时候也会在客户端出现确认页面:

点击恢复数据即可。

那么这里又有一个问题了,现在如果我想改了这个应用锁的密码,其实很简单:

然后在保存成ab文件,然后还原。密码就被修改了。那么比如有些应用它把一些隐私的链接url这样的信息保存到xml中,那就蛋疼了,我们可以导出来数据,然后修改url为我们自己的url,然后在还原,我擦,如果是一些上报,或者是登录的url,我们就可以在这里做手脚,达到我们想要的目的了。

四、技术概要

1、分析了现阶段应用锁的原理以及如何使用应用锁来进行账号盗取

2、使用aapt命令查看apk包中信息

3、使用adb backup/restore进行应用数据的备份和还原

4、使用abe工具查看备份文件

5、我们在备份完数据之后,可以尝试查看一些应用的隐私数据,同时还可以篡改信息,在还原。都是可以的。

6、在开发过程中对于没有root的设备,adb backup也是可以用来查看开发应用的沙盒数据的,只是过程有点复杂。

五、总结

从这篇文章我们可以可以看到,一个属性的不留意,会带来多大的风险,当然这个属性也是很蛋疼的,就是他默认值是true,所以在你不管他的情况下还是有问题的,必须手动的去设置成false才可以,所以这个也是导致现在市场上很多app都存在这样的风险。其次这里我们主要分析了一个智能应用锁的信息,发现他犯了一个最大的错误就是把密码用明文的方式保存在xml中,破解难度为0,如果有一些你的朋友或者你的老婆,想看你的微信和QQ,同时又发现了你用了这个app去加密,那么你就惨了,你老婆只要会adb命令,或者看到这篇文章之后,就两步,然后看到你不想让她看到的数据,好吧,然后就没然后了~~,所以我们开发者在开发一个app的时候,不仅要的是用户体验,更重要的时候对用户的隐私负责。我们用户在下载和安装一些app的时候也是需要注意的就是多留点心~~

更多内容:点击这里

PS: 关注微信,最新Android技术实时推送

时间: 2024-10-12 19:20:09

Android逆向之旅---Android中如何获取在非Root设备中获取应用隐私数据的相关文章

Android逆向之旅---Android中的sharedUserId属性详解

一.前言 今天我们来看一下Android中一个众人熟悉的一个属性:shareUserId,关于这个属性可能大家都很熟悉了,最近在开发项目,用到了这个属性,虽然知道一点知识,但是感觉还是有些迷糊,所以就写篇文章来深入研究一下. 关于Android中的sharedUserId的概念这里就简单介绍一下: Android给每个APK进程分配一个单独的空间,manifest中的userid就是对应一个分配的Linux用户ID,并且为它创建一个沙箱,以防止影 响其他应用程序(或者其他应用程序影响它).用户I

Android逆向之旅---Android应用的安全的攻防之战

一.前言 在前两篇破解的文章中,我们介绍了如何使用动态调试来破解apk,一个是通过调试smali源码,一个是通过调试so代码来进行代码的跟踪破解,那么今天我们就这两篇文章的破解方法,来看看Android中开发应用的过程中如何对我们的应用做一层安全保护,当然现在市场中大部分的应用已经做了一些防护策略,但是没有绝对的安全,破解只是时间上的问题.所以攻破和防护是相生相克,永不停息的战争,没有绝对的安全,也没有万能的破解之道. 下面我们就来看看如何做到我们的应用更安全,我们主要从这五个方面来看看怎么操作

我的Android进阶之旅------&gt; Android在TextView中显示图片方法

面试题:请说出Android SDK支持哪些方式显示富文本信息(不同颜色.大小.并包含图像的文本信息),并简要说明实现方法. 答案:Android SDK支持如下显示富文本信息的方式. 1.使用TextView组件可以显示富文本信息.在TextView组件中可以使用富文本标签来显示富文本信息,这种标签类似于HTML标签,但比HTML标签简单,支持有限的几种显示富文本的方式.如<font>标签用于设置字体和颜色,<b>用于设置粗体.包含这些标签的文本不能直接作为TextView.se

我的Android进阶之旅------&gt; Android为TextView组件中显示的文本添加背景色

通过上一篇文章 我的Android进阶之旅------> Android在TextView中显示图片方法 (地址:http://blog.csdn.net/ouyang_peng/article/details/46916963) 我们学会了在TextView中显示图片的方法,现在我们来学习如何为TextView组件中显示的文本添加背景色.要求完成的样子如图所示: 首先来学习使用BackgroundColorSpan对象设置文字背景色,代码如下: TextView textView=(TextV

我的Android进阶之旅------&gt;Android疯狂连连看游戏的实现之实现游戏逻辑(五)

在上一篇<我的Android进阶之旅------>Android疯狂连连看游戏的实现之加载界面图片和实现游戏Activity(四)>中提到的两个类: GameConf:负责管理游戏的初始化设置信息. GameService:负责游戏的逻辑实现. 其中GameConf的代码如下:cn\oyp\link\utils\GameConf.java package cn.oyp.link.utils; import android.content.Context; /** * 保存游戏配置的对象

我的Android进阶之旅------&gt;Android利用Sensor(传感器)实现水平仪功能的小例

这里介绍的水平仪,指的是比较传统的气泡水平仪,在一个透明圆盘内充满液体,液体中留有一个气泡,当一端翘起时,该气泡就会浮向翘起的一端. 利用方向传感器返回的第一个参数,实现了一个指南针小应用. 我的Android进阶之旅------>Android利用Sensor(传感器)实现指南针功能 (地址:http://blog.csdn.net/ouyang_peng/article/details/8801204) 接下来,我们利用返回的第二.三个参数实现该水平仪.因为第二个参数,反映底部翘起的角度(当

Android逆向之旅---静态方式破解微信获取聊天记录和通讯录信息

一.猜想数据存放路径 微信现在是老少皆宜,大街小巷都在使用,已经替代了传统的短信聊天方式了,只要涉及到聊天就肯定有隐私消息,那么本文就来讲解如何获取微信的聊天记录以及通讯录信息. 首先我们在没有网络的时候,打开微信同样可以查看聊天记录,说明微信会把聊天记录保存到本地,那么这么多信息肯定会保存在数据库中,所以我们可以去查看微信的databases目录看看内容: 可惜的是,我们在这个里面并没有发现一些有用的数据,所以这时候就了解到了微信因为把重要信息的数据库存在其他目录下面,我们可以直接把微信的整个

Android逆向之旅---SO(ELF)文件格式详解

第一.前言 从今天开始我们正式开始Android的逆向之旅,关于逆向的相关知识,想必大家都不陌生了,逆向领域是一个充满挑战和神秘的领域.作为一名Android开发者,每个人都想去探索这个领域,因为一旦你破解了别人的内容,成就感肯定爆棚,不过相反的是,我们不仅要研究破解之道,也要研究加密之道,因为加密和破解是相生相克的.但是我们在破解的过程中可能最头疼的是native层,也就是so文件的破解.所以我们先来详细了解一下so文件的内容下面就来看看我们今天所要介绍的内容.今天我们先来介绍一下elf文件的

Android逆向之旅---解析编译之后的Resource.arsc文件格式

一.前言 快过年了,先提前祝贺大家新年快乐,这篇文章也是今年最后一篇了.今天我们继续来看逆向的相关知识,前篇文章中我们介绍了如何解析Android中编译之后的AndroidManifest.xml文件格式:http://blog.csdn.net/jiangwei0910410003/article/details/50568487 当时我说到其实后续还要继续介绍两个文件一个是resource.arsc和classes.dex,今天我们就来看看resource.arsc文件个格式解析,class