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

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
全部完~~
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Frida是一款免费的,基于Python和JavaScript来实现的,面向开发人员、逆向工程师和安全研究人员的动态检测工具包。 Frida拥有一套全面的测试套件,不但调试效率极高,而且在广泛的使用中经历了多年严格的测试。 尤其是,移动应用安全测试和服务巨头NowSecure对齐钟爱有加,在NowSecure内部,安全人员通过Frida这个工具套装,已经完成对大量的移动应用程序大规模深度的安全分析测试。目前依然在该公司的安全测试中扮演重要的角色。 基于Python和JavaScriptFrida,天生就是跨平台的动态调试工具,不但可以运行在Windows、Linux、macOS之上,而且还可以调试Windows应用程序、Linux应用程序,macOS、iOS、Andriod和QNX等几乎全平台的应用程序。可以说,一旦掌握Frida这套工具,就可以在全平台,对全平台的应用程序进行动态调试和分析。 Frida使用极其方便,在使用过程中,只需将你编写的JavaScript脚本通过Frida自身的工具注入到目标进程中,就可以HOOK任何功能,其中包括但不限于监视加密API或跟踪应用程序关键代码等。在使用过程中,无需知道被“研究”程序的源代码。 尤其是可以一边编辑JavaScript脚本,一边运行JavaScript脚本的功能对于调试分析来说极为友好。只需“保存”正在编辑的JavaScript脚本,就立即就能看到该脚本执行的结果,全称无需其它人工介入,也无需重新启动被“研究”的应用程序,极大地简化了分析流程,同时也极大地提高了工作效率。因此,得到了众多安全分析人士的青睐。 本课程从最基本的调试环境搭建开始,基于经典的Windows“扫雷”游戏的动态调试分析,编码等,循序渐进演示Firda在分析调试Windows应用程序中基本使用方法和技巧。拥有这些知识储备之后,在加上官方的参考文档,你就可以轻松地将这些知识“迁移”至分析和调试其他平台的应用程序。 课程资料,请看第一课中github链接。
### 回答1: Frida-server-15.2.2-android-x86是一款适用于安卓x86架构的Frida服务器的版本。Frida是一种开源的动态插桩框架,可用于安卓设备上的应用程序逆向工程和安全性评估。 Frida-server是Frida框架中的一部分,用于在安卓设备上与Frida客户端通信。Frida-server是在设备上运行的服务,可以与Frida客户端(通常是运行在PC上的Frida工具)进行通信,并接收来自客户端的指令。 Frida-server-15.2.2-android-x86适用于安卓x86架构的设备。x86是一种PC上常见的处理器架构,而不是常用于移动设备的ARM架构。因此,如果你的安卓设备是基于x86架构的,那么你可以使用这个版本的Frida-server在设备上运行Frida服务。 通过在设备上运行Frida-server,你可以利用Frida的强大功能来分析、修改和控制应用程序。Frida允许你动态地插入JavaScript代码到应用程序中,以实时地跟踪和修改应用程序的行为。你可以使用Frida进行代码注入、函数钩子、网络流量捕获、数据修改等操作,以便进行应用程序逆向工程、漏洞挖掘、安全性评估等任务。 总而言之,Frida-server-15.2.2-android-x86是一种适用于安卓x86架构设备的Frida服务器版本,通过在设备上运行Frida-server,你可以利用Frida框架的功能对应用程序进行逆向工程和安全性评估。 ### 回答2: frida-server-15.2.2-android-x86是一款用于Android x86架构的Frida服务器。Frida是一种强大的开源工具,用于分析、修改和调试软件。它可以通过脚本语言来进行动态注入和操作,支持多种平台和架构。 通过使用frida-server-15.2.2-android-x86,我们可以在Android x86设备上安装和运行Frida服务器。安装frida-server时我们需要将其推送到设备上,并在设备上运行它。运行成功后,我们可以通过Frida客户端连接到该设备上的Frida服务器,并使用Frida的功能进行应用程序的分析、修改和调试。 Frida-server-15.2.2-android-x86版本适用于Android x86架构的设备。在使用时,我们首先需要确保设备已经以root权限运行,并且具备adb工具的连接。然后,我们可以通过命令行将frida-server-15.2.2-android-x86安装到设备上。在设备上运行frida-server时,它会监听指定的端口,并等待Frida客户端的连接。 通过与Frida服务器建立连接,我们可以使用JavaScript或Python等脚本语言来进行动态插桩、API Hook、函数跟踪等操作。Frida提供了强大的API,使得应用程序的分析和修改变得更加简单高效。使用Frida,我们可以实时监测应用程序的行为,获取关键信息,进行漏洞分析,甚至可以修改应用程序的逻辑和数据。 总之,frida-server-15.2.2-android-x86是一款用于Android x86平台的Frida服务器,它提供了强大的功能和API,用于动态分析、修改和调试应用程序。通过与Frida客户端的连接,我们可以通过脚本语言来操作和控制应用程序,使得应用程序的分析和修改变得更加高效和可靠。 ### 回答3: Frida-Server是一款功能强大的开源工具,用于在Android设备上进行动态代码注入和调试。frida-server-15.2.2-android-x86指的是适用于Android x86架构的Frida-Server版本15.2.2。 Frida-Server能够以服务的形式运行在目标Android设备上,通过与Frida桌面端或其他脚本进行通信,来实现对目标应用程序的动态分析和操作。它提供了一套JavaScript API,允许我们在运行时通过修改和执行目标应用程序中的代码来实现功能扩展,如函数拦截、数据修改等。 在具体使用时,首先需要在目标Android设备上安装Frida-Server,这个版本适用于x86架构的设备。其次,需要将Frida-Server与Frida桌面端或其他脚本工具配合使用,以实现与目标应用程序的通信。我们可以通过Frida提供的命令行工具或编写脚本的方式来进行代码注入和调试。 Frida-Server-15.2.2-android-x86版本对于使用x86架构的Android设备来说是必需的,因为它能够确保Frida-Server能在这样的设备上正确运行。使用适合设备架构的版本,可以保证性能和稳定性,并且避免兼容性问题。 总而言之,Frida-Server-15.2.2-android-x86是一款用于在Android x86架构设备上进行动态代码注入和调试的工具,通过与Frida桌面端或其他脚本进行通信来实现相关功能。它可以帮助安全研究人员、开发人员等对Android应用程序进行潜在威胁分析、性能优化以及功能增强等工作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值