Frida官方手册 - JavaScript API(篇三)

发布者:freakish
发布于:2017-11-03 19:38

JavaScript API

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

全部完~~


声明:该文观点仅代表作者本人,转载请注明来自看雪