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平台,
open在libsystem_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




