Hello! 欢迎来到豆浆编程!

【android】读取字符串 指针等


avatar
landou 2025-05-18 1.45k

1. Memory.readByteArray(ptr, size)

  • 作用:从指定指针读取 size 字节的原始数据(返回 ArrayBuffer)。

  • 常用于:拿原始明文、密钥、加密前数据。

  • 示例

javascript
const buf = Memory.readByteArray(ptr, 32);
console.log(hexdump(buf));

2. Memory.readUtf8String(ptr, length)

  • 作用:读取 UTF-8 字符串,可选长度,适合 Java 层字符串、C风格字符串。

  • 常用于:读取日志、token、id、密钥字符串等。

  • 示例

javascript
console.log(Memory.readUtf8String(ptr)); // 自动以 \0 结尾
console.log(Memory.readUtf8String(ptr, 16)); // 读取固定长度

3. Memory.readCString(ptr, length?)

  • 作用:读取以 \0 结尾的 C 字符串。

  • 区别:类似 readUtf8String,但专为 C 环境设计。

  • 示例

javascript
console.log(Memory.readCString(ptr));

4. Memory.readPointer(ptr)

  • 作用:读取一个地址指针(即从内存中读取8字节,得到新的地址)。

  • 常用于:读取结构体中指向子结构/字符串的指针。

  • 示例

javascript
let p = Memory.readPointer(ptr);
console.log("指向地址为: " + p);

5. Memory.readU8/U16/U32/U64(ptr)

6. Memory.readS8/S16/S32/S64(ptr)

  • 作用:读取指定指针的无符号/有符号整数。

  • 适用场景:分析结构体字段、布尔标志、int 值。

  • 示例

javascript
let flag = Memory.readU32(ptr.add(4)); // 读取偏移4的unsigned int
let len = Memory.readS64(ptr); // 读取 signed long

7. hexdump(ptr, options)

  • 作用:格式化打印内存内容,常搭配 readByteArray

  • 示例

javascript
console.log(hexdump(ptr, { length: 32 }));

8. ptr.add(offset) / ptr.sub(offset)

  • 作用:指针偏移运算,配合 readX 系列一起读结构体字段。

  • 示例

javascript
let field = ptr.add(0x10); // 偏移0x10字节
let val = Memory.readU32(field);

 

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 }));
}
});

暂无评论

发表评论