如何在Android中使用Frida钩住fopen?

时间:2019-06-11 15:26:27

标签: hook fopen frida

我有一个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() {}                         
  }); 

2 个答案:

答案 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 => { .. })