You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Frida 17中Module.getExportByName报TypeError: not a function的旧脚本迁移方法咨询

Frida 17中Module.getExportByName报TypeError: not a function的旧脚本迁移方法咨询

嘿,这个问题我之前帮同事调Frida脚本的时候刚好碰到过,立马就能给你捋明白~

你遇到的TypeError: not a function本质是Frida 17对Module.getExportByName的参数校验做了严格升级——旧版本里传null作为第一个参数(模块名)的写法,在Frida 17里彻底不被允许了。之前Frida会默认帮你遍历所有模块找导出,但17版本开始要求你明确指定目标模块,或者自己实现遍历逻辑。

下面给你两种最常用的迁移方案,按需选就行:

方案一:明确指定目标模块名(推荐,性能更高)

如果你的脚本是针对特定平台写的,直接写出目标函数所在的系统模块名就行:

  • 对于Android/Linux平台,open函数在libc.so里,代码改成:
    var openFunction = Module.getExportByName("libc.so", "open");
    
  • 对于iOS平台,openlibsystem_c.dylib里,代码改成:
    var openFunction = Module.getExportByName("libsystem_c.dylib", "open");
    
  • 对于Windows平台,open对应的系统函数在kernel32.dll(或ucrtbase.dll)里,改成:
    var openFunction = Module.getExportByName("kernel32.dll", "OpenFile");
    

方案二:遍历所有模块自动查找(适合跨平台通用脚本)

如果你的脚本需要兼容多平台,不想写死模块名,可以手动遍历所有加载的模块,逐个查找导出函数:

let openFunction = null;
// 遍历所有已加载的模块
Module.enumerateModules().forEach(module => {
  try {
    // 尝试从当前模块获取open函数
    const targetFunc = Module.getExportByName(module.name, "open");
    if (targetFunc) {
      openFunction = targetFunc;
      return; // 找到就停止遍历
    }
  } catch (e) {
    // 跳过那些没有权限访问的模块,避免报错中断脚本
  }
});

// 后续判断是否找到函数再使用
if (openFunction) {
  console.log("成功找到open函数:", openFunction);
  // 这里写你的hook逻辑
} else {
  console.log("未找到open函数");
}

额外注意点

  • 别再传null或者空字符串给Module.getExportByName的第一个参数了,Frida 17会直接抛出参数错误,也就是你看到的TypeError(这个错误提示确实有点误导,容易以为函数不存在,但其实是参数不合法)。
  • 如果你要hook的是自己的APP模块里的导出函数,那就直接写APP的模块名(比如libnative-lib.so),和之前的逻辑一致,只是不能再用null代替。

内容来源于stack exchange

火山引擎 最新活动