
本文介绍如何在 frida(尤其是 frida gadget 环境下)通过 java api 安全、可靠地遍历并打印 android 应用可访问的目录内容,适用于逆向分析中快速探查文件系统权限与敏感路径。
本文介绍如何在 frida(尤其是 frida gadget 环境下)通过 java api 安全、可靠地遍历并打印 android 应用可访问的目录内容,适用于逆向分析中快速探查文件系统权限与敏感路径。
在 Frida Gadget 注入场景中,由于运行于目标应用进程内且受限于其沙盒权限,无法直接调用 Node.js 或 POSIX 文件 API(如 fs.readdirSync),必须借助目标应用所处的 Android Java 运行时环境。核心思路是利用 java.io.File 类的 listFiles() 方法获取指定路径下的文件/子目录数组,并逐项输出。
以下是一个可直接复用的 Frida JavaScript 辅助函数 listdir(path):
Java.perform(function () {
function listdir(path) {
try {
const File = Java.use('java.io.File');
const file = File.$new(path);
const files = file.listFiles();
if (files === null || files.length === 0) {
console.log(`[!] Directory '${path}' is inaccessible, empty, or does not exist.`);
return;
}
console.log(`[+] Listing ${files.length} entries in '${path}':`);
for (let i = 0; i ' : f.length();
console.log(` ${i + 1}. ${name} ${isDir ? '(dir)' : `(size: ${size} B)`}`);
}
} catch (e) {
console.error(`[x] Exception while listing '${path}':`, e.message);
}
}
// 示例调用:替换为实际目标路径(需确保应用有读取权限)
listdir('/data/user/0/com.example.app/databases/');
listdir('/data/user/0/com.example.app/shared_prefs/');
});
✅ 关键说明与注意事项:
- ✅ 必须包裹在 Java.perform() 中,确保在 Java 主线程上下文执行;
- ✅ listFiles() 返回 null 表示无访问权限(如路径不存在、无读权限或被 SELinux 拒绝),不可直接 .length 调用,务必先判空;
- ✅ 输出中区分文件与目录,并显示大小(目录显示
),提升可读性; - ⚠️ 路径必须为绝对路径,且属于当前应用沙盒(如 /data/user/0/
/...)或已获授权的共享路径(如 getExternalFilesDir() 返回路径); - ⚠️ 避免尝试遍历 /data/data/ 根目录等高权限路径——即使包名匹配,也常因 SELinux 策略失败;建议优先从 context.getFilesDir()、getDatabasePath() 等已知可信路径入手;
- ? 可进一步扩展:结合 f.canRead() / f.canWrite() 增强权限探测,或递归调用实现树形遍历(注意栈深度与性能)。
该方法稳定兼容 Frida 12.8+ 及主流 Android 版本,是逆向工程中轻量级文件系统勘探的标准实践之一。










