此版本带来了几项令人兴奋的新功能。
File API
使用我们 JavaScript File API 的读者可能已经注意到,它支持写入指定文件,但之前无法读取。 现在已经支持了。
例如,将文本文件的每一行作为字符串读取:
const f = new File('/etc/passwd', 'r');
let line;
while ((line = f.readLine()) !== '') {
console.log(`Read line: ${line.trimEnd()}`);
}(请注意,这里假定文本文件使用 UTF-8 编码。目前不支持其他编码。)
你也可以从某个偏移处读取指定数量的字节:
const f = new File('/var/run/utmp', 'rb');
f.seek(0x2c);
const data = f.readBytes(3);
const str = f.readText(3);也可以省略参数,以读取文件的剩余部分。但如果只想一次读取整个文本文件,还有一种更简单的方式:
const text = File.readAllText('/etc/passwd');读取二进制文件也同样简单:
const bytes = File.readAllBytes('/var/run/utmp');(其中 bytes 是 ArrayBuffer。)
有时你可能还想将字符串写入文本文件:
File.writeAllText('/tmp/secret.txt', 'so secret');或者写入 ArrayBuffer:
const data = args[0].readByteArray(256);
File.writeAllBytes('/tmp/mystery.bin', data);回到前面的示例,seek() 也支持相对偏移:
f.seek(7, File.SEEK_CUR);
f.seek(-3, File.SEEK_END);获取当前文件偏移也同样简单:
const offset = f.tell();Checksum API
这次添加的另一项 JavaScript API 用于计算校验和。虽然这完全可以用“用户空间”JavaScript 实现, 但由于 Frida 依赖 GLib,而 GLib 已经开箱即用地提供了 Checksum API,我们几乎可以零成本获得该功能。 我们所需要做的只是将其暴露出来。
将这些组合起来,就意味着我们可以读取文件并计算其 SHA-256:
const utmp = File.readAllBytes('/var/run/utmp');
const str = Checksum.compute('sha256', utmp);或者进行更精细的控制:
const checksum = new Checksum('sha256');
checksum.update(File.readAllText('/etc/hosts'));
checksum.update(File.readAllBytes('/var/run/utmp'));
console.log('Result:', checksum.getString());
console.log(hexdump(checksum.getDigest(), { ansi: true }));(可以通过我们的 TypeScript bindings 详细了解此 API。)
文末
此版本还有几项其他好东西,请一定查看下面的更改日志。
尽情享用!
更改日志
- gumjs:扩展 File API。
- gumjs:添加 Checksum API。
- gumjs:修复从根目录进行相对 ESM 导入时的处理。
- glib:(win32) 为普通文件添加 Input/OutputStream 支持。
- build:在 Windows 上将 XP SDK 设为可选。
- node:目标改为 Electron 19.0.0,而不是 19.0.0-alpha.1。
- node:定义 openssl_fips 以规避 node-gyp 问题。
oleavr