0x00 前言
因为工作上的原因需要分析某个软件将网络下载的文件解压到那个路径,通过比对文件夹大小很难定位到具体位置,所以考虑使用xposed插件来做,因为没有现成的,所以只能自己动手来做一个了
需要如下准备工作
1.刷入xposed框架的安卓机一台
2.有基础的安卓开发经验
3.了解过xposed插件的套路
0x01 入手点 File.createNewFile
一般应用下载文件会用到File类的createNewFile方法,就通过hook这个方法来做,查看File类的源码,里面有一个变量是
private final String path;
path保存了要操作的文件的路径,可以把这个变量拿出来看下是不是我们想要的东西,以下是代码
@Override
public void handleLoadPackage(XC_LoadPackage.LoadPackageParam loadPackageParam) throws Throwable {
Class clazz = loadPackageParam.classLoader.loadClass("java.io.File");
XposedHelpers.findAndHookMethod(clazz, "createNewFile", new XC_MethodHook() {
@Override
protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
XposedBridge.log("hooking createNewFile ");
Field[] fields = param.thisObject.getClass().getDeclaredFields();
for (int i = 0; i < fields.length; i++) {
if (fields[i].getName().equals("path")) {//找到我们想要的属性
fields[i].setAccessible(true);//设置可访问
XposedBridge.log("wubin: " + fields[i].get(param.thisObject));//打印出来
}
}
super.beforeHookedMethod(param);
}
});
}
安装到机器上重启之后,发现能够成功打印下载路径
2020-01-13 15:22:38.753 5784-5821/? I/EdXposed-Bridge: hooking createNewFile
2020-01-13 15:22:38.753 5784-5821/? I/EdXposed-Bridge: OneT1me createNewFile:/data/user/0/com.estrongs.android.pop/files/local_crash_lock
2020-01-13 15:22:41.808 5948-5970/? I/EdXposed-Bridge: hooking createNewFile
2020-01-13 15:22:41.808 5948-5970/? I/EdXposed-Bridge: OneT1me createNewFile:/data/user/0/com.android.dialer/cache/persistent_log/plain_text/0
2020-01-13 15:22:54.738 6707-6741/? I/EdXposed-Bridge: hooking createNewFile
2020-01-13 15:22:54.738 6707-6741/? I/EdXposed-Bridge: OneT1me createNewFile:/data/user/0/com.estrongs.android.pop/files/local_crash_lock
2020-01-13 15:22:54.738 6707-6740/? I/EdXposed-Bridge: hooking createNewFile
2020-01-13 15:22:54.738 6707-6740/? I/EdXposed-Bridge: OneT1me createNewFile:/data/user/0/com.estrongs.android.pop/files/native_record_lock
2020-01-13 15:22:54.922 6707-6766/? I/EdXposed-Bridge: hooking createNewFile
2020-01-13 15:22:54.923 6707-6766/? I/EdXposed-Bridge: OneT1me createNewFile:/data/user/0/com.estrongs.android.pop/files/security_info
2020-01-13 15:22:57.782 6707-6741/? I/EdXposed-Bridge: hooking createNewFile
2020-01-13 15:22:57.782 6707-6741/? I/EdXposed-Bridge: OneT1me createNewFile:/data/user/0/com.estrongs.android.pop/files/local_crash_lock
但是跑过去查看这个文件,发现没有了,于是反编译这个apk,发现这个apk下载完成后会解压文件,完成后会删掉这个文件,于是就有了下面的工作
0x02 继续File.renameTo
上一步未能成功抓到释放的文件在那边,猜测可能是解压后用了renameTo方法,于是继续hook,上代码
XposedHelpers.findAndHookMethod(clazz, "renameTo",File.class, new XC_MethodHook() {
@Override
protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
XposedBridge.log("hooking renameTo");
Field[] fields = param.thisObject.getClass().getDeclaredFields();
for (int i = 0; i < fields.length; i++) {
if (fields[i].getName().equals("path")) {
fields[i].setAccessible(true);
XposedBridge.log("wubin: " + fields[i].get(param.thisObject));
}
}
super.beforeHookedMethod(param);
}
});
这一步,能够成功抓取到我想要的软件释放的文件的路径了,大功告成
2020-01-13 15:25:44.847 4851-4938/? I/EdXposed-Bridge: OneT1me renameTo:/data/system/netstats/xt.1578293607407-
2020-01-13 15:25:44.847 4851-4938/? I/EdXposed-Bridge: OneT1me renameTo:/data/system/netstats/xt.1578293607407-
2020-01-13 15:25:44.847 4851-4938/? I/EdXposed-Bridge: OneT1me renameTo:/data/system/netstats/xt.1578293607407-
2020-01-13 15:25:44.848 4851-4938/? I/EdXposed-Bridge: OneT1me renameTo:/data/system/netstats/xt.1578293607407-
2020-01-13 15:25:45.343 7916-7997/? I/EdXposed-Bridge: OneT1me renameTo:/data/user_de/0/com.google.android.tts/cache/cmn-cn
2020-01-13 15:25:57.537 5683-8036/? I/EdXposed-Bridge: OneT1me createNewFile:/storage/emulated/0/Android/data/com.google.android.tts/files/download_cache/cmn-tw_5.zip
2020-01-13 15:25:57.537 5683-8036/? I/EdXposed-Bridge: OneT1me createNewFile:/storage/emulated/0/Android/data/com.google.android.tts/files/download_cache/cmn-tw_5.zip
0x03 后记
后续可以扩展,记录所有软件的操作文件的行为。
包括查询文件是否存在exist、delete、createNewFile、renameTo等方法的操作。
可以制作成一个安全权限管理的文件,或者对重点文件监控设置是否允许操作。
需要注意的是,这个只能抓到java类的操作文件的方法,对native方法不生效,大神可以扩展一下