file 文件读写——读写目标应用沙箱及外部存储
基础用法
// 读文件
var content = file.read('/sdcard/Download/test.txt');
console.log('[+] 文件内容: ' + content);
// 写文件
file.write('/sdcard/Download/output.txt', 'Hello JsHook');
支持的路径
JsHook 运行在目标应用进程内,所以它的文件访问权限和目标应用一致:
- 目标应用沙箱:
/data/data/<包名>/files/、/data/data/<包名>/cache/— 默认有权限 - 外部存储:
/sdcard/、/storage/emulated/0/— 取决于目标应用是否声明了存储权限 - root 专属路径:
/data/adb/jshook/— 需要内核驱动或守护进程 IPC
如果开了内核驱动模式,JsHook 的守护进程可以以 root 身份读写任何路径,不受目标应用权限限制。
读取目标应用的 SharedPreferences
目标应用的配置文件存在沙箱的 shared_prefs/ 目录下,格式是 XML:
var prefs = file.read('/data/data/com.example.app/shared_prefs/config.xml');
console.log('[+] SharedPreferences: ' + prefs);
保存调试日志
调试过程中可以把日志写到文件里,方便事后翻:
file.write('/sdcard/jshook-debug.log', JSON.stringify({
time: Date.now(),
event: 'gold-changed',
detail: { old: oldGold, new: newGold }
}));
追加写入
file.append('/sdcard/jshook-debug.log', '\n更多日志...');
文件列表
var files = file.list('/sdcard/Download/');
files.forEach(function (f) {
console.log('[+] ' + f.name + ' (' + f.size + ' bytes)');
});
注意事项
路径要写完整
// 错误
file.read('Download/test.txt');
// 正确
file.read('/sdcard/Download/test.txt');
外部存储权限
Android 10+ 的分区存储(Scoped Storage)下,即使目标应用声明了存储权限,也不一定能直接访问任意路径。尽量用目标应用自己的沙箱路径。
二进制文件
JsHook 的 file 模块主要面向文本读写。读二进制文件可能需要转 base64:
var binaryContent = file.read('/data/data/com.example.app/databases/app.db');
var base64Content = base64.encode(binaryContent);
和 Frida File API 的区别
Frida 原生 API 也有文件读写,但 JsApi 的 file 模块更贴近 Android 沙箱结构、对中文路径和特殊字符处理更稳。日常使用优先用 JsApi。