原文链接: https://frida.re/docs/javascript-api/#nativefunction
欢迎加入 Frida 交流群: 1049977261
NativeFunction
-
new NativeFunction(address, returnType, argTypes[, abi])
:
创建一个用于调用NativePointer
类型的address
处的方法的NativeFunction
对象,returnType
指明了返回值的类型,argTypes
数组指明了参数类型. 如果不是系统的默认值, 您也可以提供可选的abi
参数. 对于参数可变的方法, 请在固定参数与可变参数之间加上'...'
条目.Structs & Classes by Value
至于按值传递的结构或类, 请提供一个包含结构的字段类型的数组, 而不是字符串.
您可以将它们层层嵌套, 以表示结构内部的结构.
注意, 返回的对象也是一个NativePointer
, 因此可以将其传递给Interceptor#attach
.它必须严格匹配结构或者类, 所以如果您有一个三个整型的结构, 您必须传入
['int', 'int', 'int']
.对于有虚拟方法的类, 第一个参数必须是 vtable 的指针.
对于涉及到返回值比
Process.pointerSize
要大的 C++ 场景, 第一个参数必须是用于预分配空间的NativePointer
. (例如, WebKit 中常见的场景)例如:
// LargeObject HandyClass::friendlyFunctionName();
var friendlyFunctionName = new NativeFunction(friendlyFunctionPtr,
'void', ['pointer', 'pointer']);
var returnValue = Memory.alloc(sizeOfLargeObject);
friendlyFunctionName(returnValue, thisPtr);
### Supported Types
- void
- pointer
- int
- uint
- long
- ulong
- char
- uchar
- float
- double
- int8
- uint8
- int16
- uint16
- int32
- uint32
- int64
- uint64
- bool
### Supported ABIs
- default
- Windows 32-bit:
- sysv
- stdcall
- thiscall
- fastcall
- mscdecl
- Windows 64-bit:
- win64
- UNIX x86:
- sysv
- unix64
- UNIX ARM:
- sysv
- vfp
-
new NativeFunction(address, returnType, argTypes[, options])
:
类似于前一个构造器, 但第四个参数options
是一个包含一个或多个以下键的对象:-
abi
: 和上面一样的枚举. -
scheduling
: 字符串类型的调度行为, 仅限于:- cooperative:
允许其他线程在调用原生函数时执行JavaScript代码.
即在调用之前放开锁, 然后再重新获取它. 这是默认行为. - exclusive:
禁止其他线程在调用原生函数时执行JavaScript代码.
即持续占有 JavaScript 锁. 这会更快一些, 但有可能导致死锁.
- cooperative:
-
exceptions
: 字符串类型的异常行为, 仅限于:- steal:
如果被调用的方法抛出了一个原生异常, 例如对一个无效的指针撤销引用, Frida 将调整栈堆并拦截这个异常, 将其转换成一个可以被处理的 JavaScript 异常. 这有可能导致应用处于未定义的状态, 但在试验时能有效避免进程崩溃. 这是默认行为. - propagate:
让应用处理调用方法期间的任何原生异常.(或者让通过Process.setExceptionHandler()
安装的异常处理器进行处理)
- steal:
-
traps
: 字符串类型的, 待启用的代码陷阱. 仅限于:
-
NativeCallback
-
new NativeCallback(func, returnType, argTypes[, abi])
:
创建一个新的NativeCallback
并将 JavaScript 方法func
作为其实现方式,returnType
指明了返回值的类型,argTypes
数组指明了参数类型.
如果不是系统的默认值, 您也可以提供可选的abi
参数.
关于受支持的类型和 abi 请参考NativeFunction
.
注意, 返回的对象也是一个NativePointer
, 因此可以将其传递给Interceptor#replace
.
当与 Interceptor#replace() 一起使用时,func
将伴随有多个实用属性的this
参数一起被调用, 类似于 Interceptor#attach().
SystemFunction
new SystemFunction(address, returnType, argTypes[, abi])
:
类似于NativeFunction
, 但它提供了线程最后一个错误状态的快照.
返回的值是一个包裹着实际返回值作为value
的对象, 以及一个平台相关的字段, UNIX 上是errno
, 而 Windows 上则是lastError
.new SystemFunction(address, returnType, argTypes[, options])
:
和上面一样, 但是像NativeFunction
对应的构造器一样接受一个options
对象.