我有一个在 Android 12 模拟器上运行的应用程序,它将其设置保存到
/data/data
,并将其下载的文件保存到 /data/media/0/android/data
。
“下载的文件”,我指的是其操作所需的文件,这些文件是在第一次执行后下载的。
我尝试将其配置为从模拟器与 Windows 共享的文件夹中保存和加载这些文件,通常称为 “共享文件夹”。
这些文件的总大小约为 6GB,我的目标是避免为每个模拟器重复这些文件,使它们都能够从同一文件夹中读取。
应用程序不提供将此数据移至 SD 卡的选项,我已通过查看
settings > app > storage
检查了这一点。
我尝试将它与 Frida 挂钩;然而,该应用程序似乎具有某种形式的反挂钩或反调试,因为它一执行就会崩溃。
我尝试使用以下 Frida 脚本来挂钩 system_server:
frida -U -p <system_server_pid> -l tracker.js
var functionsToHook = ['open', 'fopen', 'read', 'write', 'close', 'stat'];
functionsToHook.forEach(function(func) {
Interceptor.attach(Module.findExportByName(null, func), {
onEnter: function(args) {
try {
var path = Memory.readCString(args[0]);
console.log("path:", path);
if (path.includes('/data/media/0/android/data'))
console.log(func + ' called on folder: ' + path);
}
catch (e) {
//console.log('Error reading memory:', e);
}
}
});
});
当我打开应用程序时,我观察到它读取了许多文件和文件夹,但无法访问
/data/media/0/android/data
文件夹。
是否可以通过挂钩特定功能并重定向应用程序以在共享文件夹中搜索其文件来实现此所需的行为?
如果是这样,我应该研究或尝试哪个功能?
为了测试应用程序是否具有反挂钩或反调试功能,无需任何脚本即可与 Frida 连接。
关于您的 Frida 脚本:您正在挂钩六个方法“open”、
fopen
、read
、write
、close
、stat
,并根据您的 Frida 代码,您假设每个函数都获取文件路径作为第一个参数中的 C 字符串 (args[0]
) - 事实并非如此。
open
第一个参数是 char*
-> 没问题fopen
第一个参数是 char*
-> 没问题read
第一个参数是文件描述符(int
)->代码将崩溃write
第一个参数是文件描述符(int
)->代码将崩溃close
第一个参数是文件描述符(int
)->代码将崩溃stat
第一个参数是 char*
-> 没问题因此您可以看到,有三个挂钩方法不起作用,并且很可能会导致应用程序崩溃,因为您对参数类型做出了错误的假设。 所以你应该从你的代码中删除这些钩子。
此外,您不限制要读取的字符串的最大长度。字符串以 null 结尾,这意味着如果您执行
Memory.readCString(args[0])
它将开始读取“指针”处的数据(即使它是不同的值)并读取直到发现空字节。因此它可以在返回之前读取 10、100、100、1000 甚至多个兆字节的数据,或者尝试从不允许读取的地址读取数据,这将导致应用程序崩溃。
Linux 上的路径字符串的最大长度为 PATH_MAX = 4096
字节,因此我会将
readCString
限制为该大小:结合两者,你会得到这个脚本:
var functionsToHook = ['open', 'fopen', 'stat'];
functionsToHook.forEach(function(func) {
Interceptor.attach(Module.findExportByName(null, func), {
onEnter: function(args) {
try {
var path = ptr(args[0]).readCString(4096);
console.log("path:", path);
if (path.includes('/data/media/0/android/data'))
console.log(func + ' called on folder: ' + path);
}
catch (e) {
//console.log('Error reading memory:', e);
}
}
});
});