返回介绍

JavaScript API 3

发布于 2025-01-02 22:31:48 字数 11030 浏览 0 评论 0 收藏 0

WeakRef

  • WeakRef.bind(value, fn): 监控 value 对象,当被监控的对象即将被垃圾回收或者脚本即将被卸载的时候,调用回调函数 fn ,bind 返回一个唯一 ID,后续可以使用这个 ID 进行 WeakRef.unbind() 调用来取消前面的监控。这个 API 还是很有用处的,比如你想要在 JavaScript 的某个对象销毁的时候跟着销毁一些本地资源,这种情况下,这个机制就比较有用了。
  • WeakRef.unbind(id): 停止上述的对象监控,并且会立即调用一次 f n

x86Writer

  • new X86Writer(codeAddress[, {pc: ptr('0x1234')}]): 创建一个 x86 机器码生成器,并且在 codeAddress 指向的内存进行写入,codeAddress 是 NativePointer 类型,第二个参数是可选参数,用来指定程序的初始 EIP。在 iOS 系统上,使用 Memory.patchCode() 的时候,指定初始 EIP 是必须的,因为内存写入是先写入到一个临时的位置,然后再映射到指定位置的内存
  • reset(codeAddress[, { pc: ptr('0x1234') }]): 取消 codeAddress 位置的上次的代码写入
  • dispose(): 立即进行 X86 相关的内存修改清理
  • flush(): 代码中标签引用的解析,操作缓存立即应用到内存中去。在实际的应用中,当生成一段代码片段的时候,就应该调用一次这个函数。多个相关联的函数片段在一起使用的时候,也应该调用一次,尤其是要在一起协同运行的几个函数片段。
  • base: 输出结果的第一个字节码的内存位置,NativePointer 类型
  • code: 输出结果的下一个字节码的内存位置,NativePointer 类型
  • pc: 输出结果的指令指针的内存位置,NativePointer 类型
  • offset: 当前的偏移(JavaScript 数值)
  • putLabel(id): 在当前位置插入一个标签,标签用字符串 id 表示
  • putCallAddressWithArguments(fund, args): 准备好一个调用 C 函数的上下文环境,其中 args 表示被调用函数的参数数组(JavaScript 数组),数组里面可以是字符串形式指定的寄存器,可以是一个数值,也可以是一个指向立即数的 NativePointer
  • putCallAddressWithAlignedArguments(func, args): 跟上面一个函数差不多,但是参数数组是 16 字节对齐的
  • putCallRegWithArguments(reg, args): 准备好一个调用 C 函数的上下文环境,其中 args 表示被调用函数的参数数组(JavaScript 数组),数组里面可以是字符串形式指定的寄存器,可以是一个数值,也可以是一个指向立即数的 NativePointer
  • putCallRegWithAlignedArguments(reg, args): 参数数组 16 字节对齐
  • putCallRegOffsetPtrWithArguments(reg, offset, args): 准备好一个调用 C 函数的上下文环境,其中 args 表示被调用函数的参数数组(JavaScript 数组),数组里面可以是字符串形式指定的寄存器,可以是一个数值,也可以是一个指向立即数的 NativePointer
  • putCallAddress(address): 写入一个 Call 指令
  • putCallReg(reg): 写入一个 Call 指令
  • putCallRegOffsetPtr(reg, offset): 写入一个 Call 指令
  • putCallIndirect(addr): 写入一个 Call 指令
  • putCallNearLabel(labelId): 在前面定义的 Label 处创建一个 Call 指令
  • putLeave(): 创建一个 LEAVE 指令
  • putRet(): 创建一个 RET 指令
  • putRetImm(immValue): 创建一个 RET 指令
  • putJmpShortLabel(labelId): 创建一个 JMP 指令,跳转到 labelId 标志的位置
  • putJmpNearLabel(labelId): 创建一个 JMP 指令,跳转到 labelId 标志的位置
  • putJmpReg(reg): 创建一个 JMP 指令
  • putJmpRegPtr(reg): 创建一个 JMP 指令
  • putJmpRegOffsetPtr(reg, offset): 创建一个 JMP 指令
  • putJmpNearPtr(address): 创建一个 JMP 指令
  • putJccShort(labelId, target, hint): 创建一个 JCC 指令
  • putJccNear(labelId, target, hint): 在 labelId 处创建一个 JCC 指令
  • putAddRegImm(reg, immValue)
  • putAddRegReg
  • putAddRegNearPtr(dstReg, srcAddress)
  • putSubRegImm(reg, immValue)
  • putSubRegReg(dstReg, srcReg)
  • putSubRegNearPtr(dstReg, srcAddress)
  • putIncReg(reg)
  • putDecReg(reg)
  • putIncRegPtr(target, reg)
  • putDecRegPtr(target, reg)
  • putLockXaddRegPtrReg(dstReg, srcReg)
  • putLockIncImm32Ptr(target)
  • putLockDecImm32Ptr(target)
  • putAddRegReg(dstReg, srcReg)
  • putAddRegU32(reg, immValue)
  • putShlRegU8(reg, immValue)
  • putShrRegU8(reg, immValue)
  • putXorRegReg(dstReg, srcReg)
  • putMovRegReg(dstReg, srcReg)
  • putMovRegU32(dstReg, immValue)
  • putMovRegU64(dstReg, immValue)
  • putMovRegAddress(dstReg, immValue)
  • putMovRegPtrU32(dstReg, immValue)
  • putMovRegOffsetPtrU32(dstReg, dstOffset, immValue)
  • putMovRegPtrReg(dstReg, srcReg)
  • putMovRegOffsetPtrReg(dstReg, dstOffset, srcReg)
  • putMovRegRegPtr(dstReg, srcReg)
  • putMovRegRegOffsetPtr(dstReg, srcReg, srcOffset)
  • putMovRegBaseIndexScaleOffsetPtr(dstReg, baseReg, indexReg, scale, offset)
  • putMovRegNearPtr(dstReg, srcAddress)
  • putMovNearPtrReg(dstAddress, srcReg)
  • putMovFsU32PtrReg(fsOffset, srcReg)
  • putMovRegFsU32Ptr(dstReg, fsOffset)
  • putMovGsU32PtrReg(fsOffset, srcReg)
  • putMovqXmm0EspOffsetPtr(offset)
  • putMovqEaxOffsetPtrXmm0(offset)
  • putMovdquXmm0EspOffsetPtr(offset)
  • putMovdquEaxOffsetPtr(offset)
  • putLeaRegRegOffset(dstReg, srcReg, srcOffset)
  • putXchgRegRegPtr(leftReg, rightReg)
  • putPushU32(immValue)
  • putPushNearPtr(address)
  • putPushReg(reg)
  • putPopReg(reg)
  • putPushImmPtr(immPtr)
  • putPushax()
  • putPopax()
  • putPushfx()
  • putPopfx()
  • putTestRegReg(regA, regB)
  • putTestRegU32(reg, immValue)
  • putCmpRegI32(reg, immValue)
  • putCmpRegOffsetPtrReg(regA, offset, regB)
  • putCmpImmPtrImmU32(immPtr, immValue)
  • putCmpRegReg(regA, regB)
  • putClc()
  • putStc()
  • putCld()
  • putStd()
  • putCpuid()
  • putLfence()
  • putRdtsc()
  • putPause()
  • putNop()
  • putBreakpoint()
  • putPadding(n)
  • putNopPadding(n)
  • putU8(value)
  • putS8(value)
  • putBytes(data) 从 ArrayBuffer 中拷贝原始数据

X86Relocator

  • new X86Relocator(inputCode, output): 创建一个代码重定位器,用以进行代码从一个位置拷贝到另一个位置的时候进行代码重定位处理,源地址是 inputCode 的 NativePointer, output 表示结果地址,可以用 X86Writer 对象来指向目的内存地址
  • reset(inputCode, output): 回收上述的 X86Relocator 对象
  • dispose(): 内存清理
  • input: 最后一次读取的指令, 一开始是 null,每次调用 readOne() 会自动改变这个属性
  • eob: 表示当前是否抵达了块结尾,比如是否遇到了下列任何一个指令:CALL, JMP, BL, RET
  • eoi: 表示 input 代表的属性是否结束,比如可能当前遇到了下列的指令:JMP, B, RET,这些指令之后可能没有有效的指令了
  • readOne(): 把一条指令读入 relocator 的内部缓存,返回目前已经读入缓存的总字节数,可以持续调用 readOne 函数来缓存指令,或者立即调用 writeOne() 或者 skipOne(),也可以一直缓存到指定的点,然后一次性调用 writeAll()。如果已经到了 eoi,则函数返回 0, 此时 eoi 属性也是 true
  • peekNextWriteInsn(): peek 一条指令出来,以备写入或者略过
  • peekNextWriteSource(): 在指定地址 peek 一条指令出来,以备写入或者略过
  • skipOne(): 忽略下一条即将写入的指令
  • skipOneNoLabel(): 忽略下一条即将写入的指令,如果遇到内部使用的 Label 则不忽略,这个函数是对 skipOne 的优化,可以让重定位范围覆盖的更全面
  • writeOne(): 写入下条缓存指令
  • writeOneNoLabel()
  • writeAll(): 写入所有缓存的指令

x86 枚举类型

  • 寄存器:xar, xcx, xdx, xbx, tsp, xbp, xsi, xdi, sax, ecx, edx, ebx, esp, ebx, esi, edi, rax, rcx, rdx, rbx, rsp, rbp, rsi, rdi, r8, r9, r10, r11, r12, r13, r14, r15, r8d, r9d, r10d, r11d, r12d, r13d, r14d, r15d, xip, eip, rip
  • 跳转指令:jo, jno, jb, jae, je, jne, jbe, ja, js, jns, jp, jnp, jl, jge, jle, jg, jcxz, jecxz, jrcxz
  • 分支提示:no-hint, likely, unlikely
  • 指针类型:byte, sword, qword

ArmWriter (参考 X86Writer)

  • new ArmWriter(codeAddress[, {pc: ptr('0x1234')}])
  • reset(codeAddress[, {pc: ptr('0x1234')}])
  • dispose()
  • flush()
  • base
  • code
  • pc
  • offset
  • skip(nBytes)
  • putBImm(target)
  • putLdrRegAddress(reg, address)
  • putLdrRegU32(reg, val)
  • putAddRegRegImm(dstReg, srcReg, immVal)
  • putLdrRegRegImm(dstReg, srcReg, immVal)
  • putNop()
  • putBreakpoint()
  • putInstruction(insn)
  • putBytes(data)

ArmRelocator (参考 X86Relocator)

ThumbRelocator (参考 X86Relocator)

Arm enum types

  • 寄存器:r0~r15, sp, lr, sb, sl, fp, ip, pc
  • 条件码:eq, ne, hs, lo, mi, pl, vs, vc, hi, ls, ge, lt, gt, le, al

Arm64Writer (参考 X86Writer)

Arm64Relocator (参考 X86Relocator)

AArch64 enum types

  • 寄存器:x0 x1 x2 x3 x4 x5 x6 x7 x8 x9 x10 x11 x12 x13 x14 x15 x16 x17 x18 x19 x20 x21 x22 x23 x24 x25 x26 x27 x28 x29 x30 w0 w1 w2 w3 w4 w5 w6 w7 w8 w9 w10 w11 w12 w13 w14 w15 w16 w17 w18 w19 w20 w21 w22 w23 w24 w25 w26 w27 w28 w29 w30 sp lr fp wsp wzr xzr nzcv ip0 ip1 s0 s1 s2 s3 s4 s5 s6 s7 s8 s9 s10 s11 s12 s13 s14 s15 s16 s17 s18 s19 s20 s21 s22 s23 s24 s25 s26 s27 s28 s29 s30 s31 d0 d1 d2 d3 d4 d5 d6 d7 d8 d9 d10 d11 d12 d13 d14 d15 d16 d17 d18 d19 d20 d21 d22 d23 d24 d25 d26 d27 d28 d29 d30 d31 q0 q1 q2 q3 q4 q5 q6 q7 q8 q9 q10 q11 q12 q13 q14 q15 q16 q17 q18 q19 q20 q21 q22 q23 q24 q25 q26 q27 q28 q29 q30 q31
  • 条件码:eq ne hs lo mi pl vs vc hi ls ge lt gt le al nv
  • 索引模式:post-adjust signed-offset pre-adjust

MipsWriter (参考 X86Writer)

MipsRelocator (参考 X86Relocator)

MIPS enum types

  • 寄存器:v0 v1 a0 a1 a2 a3 t0 t1 t2 t3 t4 t5 t6 t7 s0 s1 s2 s3 s4 s5 s6 s7 t8 t9 k0 k1 gp sp fp s8 ra hi lo zero at 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文