frida17.0.0 api变化

前段时间发现新装的frida ts type-hint突然不能提示Java类了,去frida.re上查了发现frida17.0.0改了很多Api,还把一些Api迁移到了独立的模块里,开一篇文章记录一下

获取类型补全

frida17新加了一个frida-pm包管理器,归在frida-tools这个python包下,运行frida-pm search就可以查目前可以下载哪些包

Java类的就是全部移到frida-java-bridge中了,运行frida-pm install frida-java-bridge安装对应包后在ts中导入即可

1
2
3
4
import Java from "frida-java-bridge"
Java.perform(() => {
console.log("test");
});

frida17同时添加了frida-compile这个工具,用于将ts转换为js,算是官方提供的支持,运行frida-compile your_script.ts -o your_script.js即可,输出产物和tsc输出的还是有很大不同的,把很多依赖也静态加载到产物里了

其他变化

这部分内容基本摘自 https://frida.re/news/ 只列举一些比较重要的变化

异步

终于有人发现enumerate系列的异步函数没啥软用了,现在enumerateXXX不再有Sync和非Sync的区别,只有同步的版本,下面这个摘自 frida.re 的例子就是新版本使用枚举函数(讲道理这样感觉正常多了)

1
2
3
for (const module of Process.enumerateModules()) {
console.log(module.name);
}

内存读写

现在内存读写被规范为只能在包装的指针上调用读写方法(ptr),然后支持了链式调用(也看起来正常多了)

1
2
3
const playerHealthLocation = ptr('0x1234');
const playerHealth = playerHealthLocation.readU32();
playerHealthLocation.writeU32(100);
1
2
3
4
5
6
const playerData = ptr('0x1234');
playerData
.add(4).writeU32(13)
.add(4).writeU16(37)
.add(2).writeU16(42)
;

模块(Module) API

原先通过模块获取符号又很多种写法,现在重新规范了相关的api
Module.getSymbolByName("libc.so","open")正式被删除了
现在使用Module.getGlobalExportByName('open')
看起来好像也正常多了
然后现在从指定模块种获取相关信息需要先调用Process.getModuleByName获取模块对象,然后再调用相关方法

1
2
3
const libc = Process.getModuleByName('libc.so');
const openImpl = libc.getExportByName('open');
const readImpl = libc.getExportByName('read');

事实上这种路径在老版本也适用,只是新版本删除了其他的路径,精简了api

Author

SGSG

Posted on

2025-07-10

Updated on

2025-07-10

Licensed under