此版本带来了几项令人兴奋的新功能。

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 问题。