2.2 进程 (Process)
Process.id: 进程id,数字。Process.arch: 架构,字符串:ia32,x64,arm,arm64Process.platform: 系统,字符串:windows,darwin,linux,qnxProcess.pageSize: 虚拟内存页大小(单位为字节),数字。这个属性可以帮助你写出移植性更好的脚本。Process.pointerSize: 指针大小(单位为字节),数字。同样可以提高你脚本的可移植性。Process.codeSigningPolicy:Process.isDebuggerAttached(): 指明当前是否有调试器调试,布尔值。Process.getCurrentThreadId(): 后去当前线程的系统级别的ID,数字。Process.enumerateThreads(): 枚举所有的线程,并返回一个对象数组,数组中每个对象都包含以下几个属性: *id: 数字,系统层级的id *state: 字符串,表示该线程的状态:running,stopped,waitting,uninterruptible,halted*context: 对象,包含pc,sp属性,这两个属性为NativePointer对象,用于指明EIP/RIP/PC和ESP/RSP/SP(分别对应ia32/x64/arm)。其他处理器也适用,比如eax,rax,r0,x0, 等等。Process.findModuleByAddress(address),Process.getModuleByAddress(address),Process.findModuleByName(name),Process.getModuleByName(name): 返回一个Module,该模块的地址/名称匹配搜索串。若没有找到目标模块,find类函数会返回null,而get类函数会抛出异常。Process.enumerateModules(): 枚举当前已加载的模块,返回值为模块对象列表。Process.findRangeByAddress(address),Process.getRangeByAddress(address): 返回一个对象,该对象描述了包含目标地址的内存块的详细信息。若没有找到这样的内存范围,前者会返回null,而后者会抛出异常。列举的详细信息,详情查看Process.enumerateRanges()。Process.enumerateRanges(protection|specifier): 枚举内存中满足protection条件的内存范围。protection参数应当为这样形式的字符串:rwx, 而rw-表示必须至少可写可读。或者可以传入specifier对象,该对象包含protection和coalesce两个键。protection键同上,coalesce键表示附件的range是否也是同样的保护机制(默认为false,也就是将range分离开)。该函数返回一个对象数组,其中每个对象包含以下属性: *base:NativePointer,表示基地址 *size: 大小,以字节为单位 *protection: 保护属性 *file: 对象,文件映射细节,包含以下属性: *path: 文件的系统地址 *offset: 偏移量,单位字节 *size: 文件大小,单位字节Process.enumerateMallocRanges(): 和enumerateRanges()类似,但是返回系统堆部分的内存。Process.setExceptionHandler(callback): 安装一个进程级的异常处理回调。该回调会在原进程处理函数调用前调用。该回调只有一个参数,details,该参数为为一个对象,包含以下属性: *type: 字符串:abort,access-violation,guard-page,illegal-instruction,stack-overflow,arithmetic,breakpoint,single-step,system*address:NativePointer,发生异常的地址 *memory: 包含以下属性的对象: *operation: 触发异常的操作,字符串:read,write,execute*address:NativePointer,异常发生时,存取的内存地址 *context: 对象,包含pc属性和sp属性,分别为指明EIP/RIP/PC和ESP/RSP/SP的NativePointer(对应ia32/x64/arm)。其他处理器也可以使用,比如eax,rax,r0,x0等等。你也可以通过给这些属性赋值来更新寄存器的值。 *nativeContext:NativePointer,包含操作系统的地址,以及架构特异的CPU上下文结构。这个参数是对context参数的补充,防止context提供的信息不足;不过我们不推荐使用这个参数,如果出错了也不要给我们提交pr。 你的回调函数将会决定如何处理异常。你可以单纯记录,并通过send函数和阻塞的recv函数来和你的app通信,也可以修改寄存器和内存,以恢复异常。如果你真的处理了该异常,那么该回调应该返回true,之后frida会立刻恢复该线程。如果你不返回true,frida会将该异常传递给进程的异常处理器,或者让操作系统终止该进程。
Last updated