Frida Javascript api #NativePointer 与 #ArrayBuffer (中文版)

原文链接: https://frida.re/docs/javascript-api/#nativepointer
欢迎加入 Frida 交流群: 1049977261

NativePointer

new NativePointer(s) :
通过 s 创建一个新的 NativePointer 对象, s 可以是一个数字也可以 是一个包含以 "0x" 开头的十六进制的数字字符串.
您可以使用 ptr(s) 作为这个方法的简写.
  • isNull() : 返回一个布尔值以便让您方便的检测指针是否为 NULL .

  • add(rhs) , sub(rhs) ,
    and(rhs) , or(rhs) ,
    xor(rhs) :
    通过将当前 NativePointer 对象与另一个数字或 NativePointer 对象进行加, 减, 与, 或, 异或来创建一个新的 NativePointer 对象.

  • shr(n) , shl(n) :
    通过将当前对象向右或向左移 n 位来创建一个新的 NativePointer 对象.

  • not() : 通过将当前对象进行位反转来创建一个新的 NativePointer 对象.

  • equals(rhs) : 通过比较当前对象与 rhs 是否拥有相同的指针来判断它们是否相同.

  • compare(rhs) :
    类似于 String#localeComare() 一样返回一个数字类型的比较结果.

  • toInt32() : 将当前对象转换成一个有符号的 32 位的整型数字.

  • toString([radix = 16]) :
    将当前对象转换成数字字符串, 可指定进制, 默认十进制.

  • toMatchPattern() :
    根据当前指针的原始数据返回一个 Memory.scan() 兼容的匹配模板(pattern)

  • readPointer() : 从当前内存地址上读取一个 NativePointer 对象.

    如果当前地址不可读则抛出一个 JavaScript 异常.

    writePointer(ptr) : 在当前内存地址上写入一个 ptr 对象.

    如果当前地址不可写则抛出一个 JavaScript 异常.

    readS8() , readU8() ,
    readS16() , readU16() ,
    readS32() , readU32() ,
    readShort() , readUShort() ,
    readInt() , readUInt() ,
    readFloat() , readDouble() :
    从当前内存地址上读取一个有符号或无符号的整型或浮点型数字.

    如果当前地址不可读则抛出一个 JavaScript 异常.

    writeS8(value) , writeU8(value) ,
    writeS16(value) , writeU16(value) ,
    writeS32(value) , writeU32(value) ,
    writeShort(value) , writeUShort(value) ,
    writeInt(value) , writeUInt(value) ,
    writeFloat(value) , writeDouble(value) :
    在当前内存地址上写入一个有符号或无符号的整型或浮点型数字.

    如果当前地址不可写则抛出一个 JavaScript 异常.

    readS64() , readU64() ,
    readLong() , readULong() :
    从当前内存地址上读取一个有符号或无符号的 64 位或 128 位的值,
    并返回相应的 Int64 / UInt64 对象.

    如果当前地址不可读则抛出一个 JavaScript 异常.

    writeS64(value) , writeU64(value) ,
    writeLong(value) , writeULong(value) :
    在当前内存地址上写入一个有符号或无符号的 Int64 / UInt64 对象.

    如果当前地址不可写则抛出一个 JavaScript 异常.

    readByteArray(length) :
    从当前内存地址上读取 length 个字节, 并将其作为一个 ArrayBuffer 对象返回.
    通过将这个对象传递到 send() 的第二个参数, 它可以有效的传输到您的 Frida 应用中.

    如果 length 个字节中的任意一个不可读则抛出一个 JavaScript 异常.

    writeByteArray(bytes) :
    在当前内存地址上写入 bytes , bytes 可以是 readByteArray() 返回的 ArrayBuffer 对象, 也可以是由 0 ~ 255 构成的整型数组. 例如: [ 0x13, 0x37, 0x42 ] .

    如果任意一个字节不可写入到指定的地址则抛出一个 JavaScript 异常.

    readCString([size = -1]) ,
    readUtf8String([size = -1]) ,
    readUtf16String([length = -1]) ,
    readAnsiString([size = -1]) :
    从当期内存地址上读取一个 ASCII, UTF-8, UTF-16, 或 ANSI 字符串.
    如果您知道字符串的字节尺寸, 您可以提供可选的 size 参数.
    如果这个字符串是以结束符结尾的, 您也可以省略 size 参数, 或者传入 -1 .
    同样的, 如果您知道字符串有多少个字符, 您也可以提供可选的 length 参数.

    如果 size length 个字节中的任意一个不可读则抛出一个 JavaScript 异常.

    注意, readAnsiString() 仅可用于 Windows.

    writeUtf8String(str) ,
    writeUtf16String(str) ,
    writeAnsiString(str) :
    将 JavaScript 字符串以结束符结尾进行编码并写入到当前内存地址.

    如果任意一个字节不可写入到指定的地址则抛出一个 JavaScript 异常.

    注意, writeAnsiString() 仅可用于 Windows.

    ArrayBuffer

    wrap(address, size) :
    通过已有的内存区域创建一个 ArrayBuffer 对象, NativePointer 类型的
    address 指定了区域的基础地址, 数字 size 则指定了尺寸.
    不同于 NativePointer 的读写相关的 API, 访问时不会进行校验, 这意味着
    坏的指针将会导致进程崩溃.