Logo 逆向知识库

Frida JavaScript API 语法

基本概念#

NativePointer 是一切的起源,比如实例为 p。

  • p.readCString() 读取字符串
  • Interceptor.Attach(p, { … }) 打桩
  • p = Process.findModuleByName("libshell.so").base 获取模块基址
  • p = Module.findExportByName(null, "strcmp"); 获取函数基址

代码补全是非常重要的,因为函数名称都很长,意思却很直观,忘记的函数打两个字符就能找到。

 

数据操作#

"A".charCodeAt(0); // 65
String.fromCharCode(65); // A
String.fromCharCode.apply(null, [65, 66, 67]) // ABC
123.toString(16).padStart(2, '0') // 相当于 "%02x"

let array = [1, 15, 255, 128];
let hexArray = array.map(num => num.toString(16).toUpperCase().padStart(2, '0')); // 相当于 .hex();

// 数组比较 —— 用 JSON.stringify
let header = new Uint8Array(ptr(123).readByteArray(4));
if (JSON.stringify([...header]) == "[127,69,76,70]") {
	// IS a ELF
}

 

文件/内存操作#

⚠️注意:这里和原生 JavaScript 或 NodeJS 截然不同

var ranges = Process.enumerateRanges('r--');
obj = ranges[0];
p = ptr(obj.base)// A NativePointer
var file = new File("./flag.txt", "rb");
var buf = ptr(obj.base).readByteArray(obj.size);
file.write(buf);
file.close();