1.
Memory.readByteArray(ptr, size)
-
作用:从指定指针读取
size字节的原始数据(返回ArrayBuffer)。 -
常用于:拿原始明文、密钥、加密前数据。
-
示例:
2. Memory.readUtf8String(ptr, length)
-
作用:读取 UTF-8 字符串,可选长度,适合 Java 层字符串、C风格字符串。
-
常用于:读取日志、token、id、密钥字符串等。
-
示例:
3. Memory.readCString(ptr, length?)
-
作用:读取以
\0结尾的 C 字符串。 -
区别:类似
readUtf8String,但专为 C 环境设计。 -
示例:
4. Memory.readPointer(ptr)
-
作用:读取一个地址指针(即从内存中读取8字节,得到新的地址)。
-
常用于:读取结构体中指向子结构/字符串的指针。
-
示例:
5. Memory.readU8/U16/U32/U64(ptr)
6. Memory.readS8/S16/S32/S64(ptr)
-
作用:读取指定指针的无符号/有符号整数。
-
适用场景:分析结构体字段、布尔标志、int 值。
-
示例:
7. hexdump(ptr, options)
-
作用:格式化打印内存内容,常搭配
readByteArray。 -
示例:
8. ptr.add(offset) / ptr.sub(offset)
-
作用:指针偏移运算,配合
readX系列一起读结构体字段。 -
示例:
Interceptor.attach(targetFunc, {
onEnter(args) {
const base = args[0];const keyPtr = Memory.readPointer(base.add(0x08)); // 假设偏移8处是 key 的地址
const keyStr = Memory.readUtf8String(keyPtr);
console.log(“Key:”, keyStr);const dataLen = Memory.readU32(base.add(0x10)); // 假设偏移10是长度
const dataPtr = base.add(0x20); // 假设偏移20是数据起始
const rawData = Memory.readByteArray(dataPtr, dataLen);console.log(“Raw Data:”);
console.log(hexdump(rawData, { length: dataLen }));
}
});