版权归作者所有,如有转发,请注明文章出处:https://cyrus-studio.github.io/blog/
open() 判断不严谨导致 dex 重复 dump
源码:https://github.com/CYRUS-STUDIO/FART/blob/master/fart10/art/runtime/art_method.cc
比如:
int dexfilefp = open(dex_path.c_str(), O_RDONLY);
if (dexfilefp > 0) {
close(dexfilefp);
}
这个判断条件其实是不严谨的,导致 if 中 的 close(dexfilefp); 一直没有执行,dex 会重复 dump。
open() 的返回值语义是:
-
成功时:返回一个非负整数(即 >= 0),它是打开的文件描述符。
-
失败时:返回 -1
正确的判断方式应该是:
if (fp >= 0) {
// 成功打开
} else {
// 打开失败,打印错误信息
LOG(ERROR) << "open dex file failed";
}
减少不必要的 I/O,提高 dump 成功率。
dump 目录创建失败(mkdir failed errno: 13)
FART 中通过 mkdir 函数在 sdcard 上创建 dump 文件存放目录,但是这样必须 app 拥有存储卡读写权限。不然 mkdir 会执行失败。
下面是一个 frida 脚本,调用系统 的 mkdir 函数创建目录
function mkdir(path) {
const libc = Module.findExportByName(null, "mkdir");
if (!libc) {
console.error("[-] Cannot find mkdir symbol.");
return;
}
const mkdirNative = new NativeFunction(libc, 'int', ['pointer', 'int']);
const pathStr = Memory.allocUtf8String(path);
const mode = 0o777; // 权限
const result = mkdirNative(pathStr, mode);
if (result === 0) {
console.log("[+] mkdir success:", path);
} else {
const errnoLocation = Module.findExportByName(null, "__errno");
if (errnoLocation) {
const errnoPtr = new NativeFunction(errnoLocation, 'pointer', []);
const errnoValue = Memory.readU32(errnoPtr());
console.error("[-] mkdir failed errno:", errnoValue);
} else {
console.error("[-] mkdir failed");
}
}
}
调用 mkdir 创建目录 /sdcard/fart/com.cyrus.example
mkdir("/sdcard/fart/com.cyrus.example");
结果如下:</

最低0.47元/天 解锁文章
1377

被折叠的 条评论
为什么被折叠?



