利用备份技术获取apk本地存储数据
即使设备没有root,我们也可以通过物理访问设备来获取应用程序的数据,我们还可以通过此方法改变一个应用程序的数据。如果一个应用程序将数据存储在客户端, 使用简单的密码或pin检查,攻击者有可能使用这种方法来绕过这些检查。在本文中,我们将讨论如何在一台没有root的设备上利用这种方法来改变应用程序特定的数据。主要操作步骤如下所示:
Step 1: 备份目标应用
Step 2: 去掉头部信息然后保存文件
Step 3: 做必要的修改
Step 4: 从原始的”.ab”文件获得头部信息
Step 5: 把修改过的内容附加在头信息后面
Step 6: 使用修改过的内容来恢复备份

下面以一个实际apk为例来介绍整个操作过程。
我们首先需要安装Star命令行工具,下载链接如下:http://sourceforge.net/projects/adbextractor/
下载后切换到Star命令行工具的目录,如下所示:

然后运行以下命令安装好Star工具。
dpkg -i star_1.5final-2ubuntu2_i386.deb
在这篇文章中,我们在一个没有root的设备上来尝试修改一个实例程序的内容。我们先给目标应用做一个备份,使用以下命令:
adb backup -f mybackup.ab com.***book.activity

从以上图片可以看到程序提示我们去确认备份。因此我们需要在设备上点击确认(但是本实例中用到的程序并不需要确认)。
当我们确认之后,它会创建一个”.ab”后缀的安卓备份文件。通常情况下,前24字节是头。因此我们使用dd工具来去除前24字节然后压缩为tar文件,使用以下命令:
dd if=mybackup.ab bs= skip=| openssl zlib -d > mybackup.tar
以上命令从输入读取源文件并跳过了头部的24字节

注意,在执行以上命令的时候可能会出现以下错误:
openssl:Error: 'zlib' is an invalid command,
解决方法是安装openssl以及补丁。参考链接:http://www.linuxfromscratch.org/blfs/view/svn/postlfs/openssl.html
下载地址: http://www.openssl.org/source/openssl-1.0.1k.tar.gz
补丁地址:http://www.linuxfromscratch.org/patches/blfs/svn/openssl-1.0.1k-fix_parallel_build-1.patch
编译及安装:
patch -Np1 -i ../openssl-1.0.1k-fix_parallel_build-.patch && ./config --prefix=/usr \
--openssldir=/etc/ssl \
--libdir=lib \
shared \
zlib-dynamic &&
make
测试编译结果:
make test
以root用户安装:
make MANDIR=/usr/share/man MANSUFFIX=ssl install &&
install -dv -m755 /usr/share/doc/openssl-1.0.1k &&
cp -vfr doc/* /usr/share/doc/openssl-1.0.1k
备份完毕后使用tar创建一个”.list”文件,这是为了保证在重新打包备份时保持顺序正确。
tar -tf mybackup.tar >mybackup.list
现在我们得到了以下文件:
mybackup.ab:从设备导出的备份文件
mybackup.tar:从dd命令生成的文件
mybackup.list:从tar文件产生的list文件
我们新建一个文件夹backup,把这几个文件连同abe.jar放到新建文件夹中。

我们可以使用以下命令解压tar文件:
tar -xf mybackup.tar

从上图可以看到,生成了一个新文件夹“apps”。我们可以在这个目录中找到应用相关的信息。

查看location_preferences.xml文件,其内容如下:

我们使用vim把其中的“北京”修改为“American”。

接下来我们需要把修改后的文件恢复到设备上。
为了恢复修改后的文件,需要把文件转换成(.ab)格式,并把”.ab”文件头附加回去。具体方法是:
首先,使用star命令创建”.tar”文件,然后把文件头附加回去。
star -c -v -f newbackup.tar -no-dirslash list=mybackup.list

现在我们获得了“newbackup.tar”文件。然后我们把原始的文件头附加在修改后的tar文件前面。
dd if=mybackup.ab bs= count= of=newbackup.ab

你可以从上图中看到,我们只拷贝了一块文件。文件为”newbackup.ab”
最后一步是把修改后的内容附加在头后面,使用以下命令:
openssl zlib -in newbackup.tar >> newbackup.ab
至此,我们的备份文件准备完成。然后我们使用以下命令把备份文件恢复到设备上:
adb restore newbackup.ab
得到如下信息:

在手机root的情况下我们可以直接到应用的路径中去查看shared preferences文件。
在不root的情况下,你可以通过再次备份数据到本地计算机进行查看。
从下图可以看到文件已经被修改:

我们应该如何保护我们的应用呢?
如果你的应用中存在敏感信息,你可以停用备份功能。可以修改AndroidManifest.xml文件为:
android:allowBackup=”false”
参考文章:
http://forum.xda-developers.com/showthread.php?t=2011811
http://nelenkov.blogspot.in/2012/06/unpacking-android-backups.html
利用备份技术获取apk本地存储数据的更多相关文章
- 手把手教你开发Chrome扩展三:关于本地存储数据
手把手教你开发chrome扩展一:开发Chrome Extenstion其实很简单 手把手教你开发Chrome扩展二:为html添加行为 手把手教你开发Chrome扩展三:关于本地存储数据 HTML5 ...
- html5本地存储数据,实现自动登录功能
背景: 在项目中遇到一个需求:用户登录完之后,网站自动保存用户id存储在本地,在下次打开网页时,通过id判断是否要进行登录操作. 技术方案: 在HTML5中,本地存储是一个window的属性,包括lo ...
- 黄聪:360浏览器、chrome开发扩展插件教程(3)关于本地存储数据
转载:http://www.cnblogs.com/walkingp/archive/2011/04/04/2003875.html HTML5中的localStorage localStorage与 ...
- vue 本地存储数据 sessionStorage
在vuex 下的 action下的userAction.js中添加 export function login(from, self) { axPost('/api/login', from, fun ...
- Kotlin安卓页面本地存储数据(方法和封装)
直接上代码 封装: //存储key对应的数据 fun saveData(context: Activity, key: String, info: String) { val sharedPrefer ...
- 当执行sql更新失误,添加了错误的判断条件,导致数据表数据出错时,如何利用备份数据库实现联合更新还原数据。
首先得有备份数据库,没有备份肯定无法联合更新回复. 我错误更新了 [SBSDB].[dbo].[wallet_user_info]中的用户名user_name 我的备份数据库及对应数据表SBSDBTe ...
- H5本地存储技术
H5 Web存储技术 前言 web存储技术在初期的时候被定义为HTML5的一部分作为其API.后来被独立出来作为一份独立的标准. web存储标准包含localStorage对象和sessionStor ...
- 利用HTML5开发Android(4)---HTML5本地存储之Web Storage
Web Storage是HTML5引入的一个非常重要的功能,可以在客户端本地存储数据,类似HTML4的cookie,但可实现功能要比cookie强大的多,cookie大小被限制在4KB,Web Sto ...
- 容器化RDS|计算存储分离 or 本地存储?
随着交流机会的增多(集中在金融行业,规模都在各自领域数一数二),发现大家对 Docker + Kubernetes 的接受程度超乎想象, 并极有兴趣将这套架构应用到 RDS 领域.数据库服务的需求可以 ...
随机推荐
- X86和X64环境下的基本类型所占用的字节大小
同样的程序代码,使用Visual Studio 进行编译,当目标平台分别为x86或x64环境时,其编译结果是不同的.在x86环境下,指针都是4个字节的:而在x64环境下,指针都是8字节的.测试代码如下 ...
- Git冲突与解决方法
1.git冲突的场景 情景一:多个分支代码合并到一个分支时: 情景二:多个分支向同一个远端分支推送代码时: 实际上,push操作即是将本地代码merge到远端库分支上. 关于push和pull其实就分 ...
- linux svn配置与使用
svn错误码对照表: http://docs.sharpsvn.net/current/html/T_SharpSvn_SvnErrorCode.htm https://www.cnblogs ...
- linux并发服务器设计
linux 并发服务器: http://blog.csdn.net/ygl840455828ygl/article/details/52438167 http://www.2cto.com/os/20 ...
- maven一模块字段调用另一个模块数据生成下拉框
店铺运营数据录入表实现的下拉框实现 从片区管理中提取分区数据,在招商管理(MIS)模块中获取并以下拉框的形式展现 ctrl类: 1.首先在ctrl类注入需提取另一模块字段的serviceclient接 ...
- [Android] Activity间切换,传递数据
前面照着android系统的裁剪图片的功能自己写了一个相似的工具.功能是大体上实现了,但留下了一个调用的问题:如何从我的程序调用这个裁剪工具,并且获得裁剪后的图片呢? 其实这个也很简单了,就是inte ...
- 留言板0.4_model中的数据库(2)
今天就讲讲:如何将后台数据呈现在HTML页面中,以及url配置时的两点技巧吧. 1.首先在"views.py"中提取出后台数据 def getform(request): mess ...
- 【前端】NodeJs包管理工具NPM
NPM是随同NodeJS一起安装的包管理工具,能解决NodeJS部署上的很多问题. 测试是否安装成功,出现版本提示表示安装成功. npm -v NPM常用命令 官方文档:https://www.npm ...
- 解决mysql日志显示时间和“Got an error reading communication packets” 问题
[root@calldb3 data]# tail -f mysql.error :.884160Z to db: 'calldb' user: 'call' host: '172.31.50.220 ...
- Go 在 TiDB 的实践
https://blog.csdn.net/RA681t58CJxsgCkJ31/article/details/79215751 更多TiDB链接: https://my.oschina.net/z ...