我有一个android应用程序,我在其中加载了一个库,有时读取了一个文件。这是应用程序中正在使用的代码。
FILE *fp = fopen(file_name, "r");
if (fp == NULL) {
return res;
}
现在,我正在尝试使用Frida来钩住那个fopen
,以迫使它返回null,但是我似乎无法找出方法。
应用程序中包含的库称为libnative-lib.so
,而我在尝试钩住fopen
时包含以下针对frida的代码
Module.enumerateExports("libnative-lib.so", {
onMatch: function(e) {
if(e.type == 'function') {
if(e.name == "fopen") {
console.log("Function recognized by name");
Interceptor.attach(e.address, {
onEnter: function(args) {
console.log("Interceptor attached onEnter...");
},
onLeave: function(retval){
console.log("Interceptor attached onLeave...");
}
});
}
}
},
onComplete: function() {}
});
答案 0 :(得分:1)
您可以尝试调用Module.findExportByName(null, "fopen")
来获取fopen
的地址,而不是枚举特定库的导出(null参数告诉frida查看所有已加载库的导出)并以与您相同的方式使用Interceptor
API。
看起来应该像这样:
Interceptor.attach(Module.findExportByName(null, "fopen"), {
onEnter: function(args) {
console.log("Interceptor attached onEnter...");
},
onLeave: function(args) {
console.log("Interceptor attached onLeave...");
}
}
您尚未确切说明代码如何失败,但是要确保您所讨论的库实际上已在应用程序中加载,您可以列出所有已加载的模块:
Process.enumerateModules()
.forEach(function(m) {
// You can print just the name by using m.name or the entire system path with m.path
console.log(JSON.stringify(m));
});
另一种方法是使用Process.enumerateModules()
查找正确的模块,然后在获得的enumerateExports
对象上调用Module
。
如果模块名称不完全是fopen
,这将确保您在正确的模块中搜索libnative-lib.so
:
Process.enumerateModules()
.filter(function(m){ return m["path"].toLowerCase().indexOf("libnative") != -1 ; })
.forEach(function(mod) {
console.log(JSON.stringify(mod));
mod.enumerateExports().forEach(function (exp) {
if (exp.name.indexOf("fopen") != -1) {
console.log("fopen found!");
}
})
});
HTH,如果仍然不能解决您的问题,请在问题中添加一些其他信息。
答案 1 :(得分:0)
fopen将调用open
我建议使用条件来断言它会打开您的特定文件,而不是替换/覆盖。
Interceptor.attach(Module.findExportByName(null, "open"), {
onEnter: function(args) {
this.file_name = Memory.readCString(ptr(args[0]));
},
onLeave: function(retval) {
if ("your file name" === this.file_name) // passed from onEnter
retval.replace(0x0); // return null
}
});
顺便说一句,如果启用了标记--enable-jit
,则可以使用ECMAScript6进行过滤
Module.enumerateExports(moduleName).filter(ex => ex.name.includes('fopen')).forEach(ex => { .. })