最近有客户提到一个需求,如下:
image.png
他要导出whatsapp程序下面的xml数据,并再手动输入用户手机号以及国家区号之后生成一个json文件,我们都知道/data/data目录存放存储包私有数据,对于设备中每一个安装的 App,系统都会在内部存储空间的 data/data 目录下以应用包名为名字自动创建与之对应的文件夹。
用户卸载 App 时,系统自动删除 data/data 目录下对应包名的文件夹及其内容。
该目录下又把存储内容进行了分类:
data/data/包名/cache: 存放的 APP 的缓存信息
data/data/包名/databases: 存放 APP 的数据库信息
data/data/包名/files: 存放 APP 的文件信息
data/data/包名/shared_prefs: 存放 APP 内的 SharedPreferences
所以他这个数据比较隐私,如果手机没有root的话是没有权限获取的,为了做这个小功能再把我小米手机root一下?感觉不太好,于是下载了genymotion模拟器,我也不知道为啥我的genymotion好像一直都有root权限,这块我没太弄明白,有清楚的人可以给我留言。
因为用户要的是macos的app,所以需要在macos app里面获取genymotion模拟器里面的/data/data数据,经过一番研究最终通过:
image.png
在程序你面添加:
rm -rf ~/Downloads/keystore.xml
~/Library/Android/sdk/platform-tools/adb pull /data/data/com.whatsapp/shared_prefs/keystore.xml ~/Downloads/keystore.xml
通过adb的pull命令可以把设备里面的文件拷到外面,这里需要设置程序权限:
最后效果:
https://www.youtube.com/watch?v=mpXtJ-lM480&feature=youtu.be
拓展
如果在安卓上访问别的apk的私密数据该怎么做呢?
Java的File类可以对文件做一系列操作。开始的思路是通过File.listFiles()来获取目标应用的子文件列表,然后对指定的文件进行exists()判断。但是当进入到包名下的一个目录时,里面的文件夹用isDirectory()和isFile()判断,返回的都是false,同时用canRead()做判断,返回的也是false。判断是文件访问权限的问题,但是通过chmod 744之后,canRead()仍然返回false。看样子通过File对/data分区的操作仍然受系统安全性限制。
后来找到了另外一种方法来判断,通过执行shell命令ls -R ,获取指定应用目录下文件的列表,从而判断文件是否存在。
这是执行shell命令的方法
public static ArrayList execCmdsforResult(String[] cmds) {
ArrayList<String> list = new ArrayList<String>();
try {
Process process = Runtime.getRuntime().exec("su");
OutputStream os = process.getOutputStream();
process.getErrorStream();
InputStream is = process.getInputStream();
int i = cmds.length;
for (int j = 0; j < i; j++) {
String str = cmds[j];
os.write((str + "\n").getBytes());
}
os.write("exit\n".getBytes());
os.flush();
os.close();
BufferedReader reader = new BufferedReader(new InputStreamReader(is));
while (true) {
String str = reader.readLine();
if (str == null)
break;
list.add(str);
}
reader.close();
process.waitFor();
process.destroy();
return list;
} catch (Exception localException) {
}
return list;
}
网友评论