如何重定向应用程序读取/保存其文件的位置?

问题描述 投票:0回答:1

我有一个在 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
文件夹。

是否可以通过挂钩特定功能并重定向应用程序以在共享文件夹中搜索其文件来实现此所需的行为?

如果是这样,我应该研究或尝试哪个功能?

android hook frida
1个回答
0
投票

为了测试应用程序是否具有反挂钩或反调试功能,无需任何脚本即可与 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); } } }); });
    
© www.soinside.com 2019 - 2024. All rights reserved.