这个长期更新的…主要记录学习和常用到的Frida_Js_API
dump内存
1 | Module.findBaseAddress('x.so'); //用于寻找指定so的基址 |
类型转换
1 | int64(v):>> new Int64(v) |
延迟调用与重复调用
1 | id = setTimeout(fn, delay) //延迟调用 |
Process模块
Process.arch:属性包含字符串ia32,x64,arm 或arm64
Process.platform:属性包含字符串windows, darwin,linux或qnx
Process.pageSize:包含虚拟内存页面大小(以字节为单位)的属性。这用于使脚本更加便携。
Process.pointerSize:包含指针大小(以字节为单位)的属性。这用于使脚本更加便携。
Process.isDebuggerAttached():返回一个指示调试器当前是否连接的布尔值
Process.getCurrentThreadId():获取此线程的操作系统特定的id作为数字
Process.enumerateThreads(callbacks):枚举所有线程,其中callbacks是一个对象,指定:
onMatch: function (thread):用thread对象调用包含:
id:操作系统特定的ID
state:字符串指定是running,stopped,waiting, uninterruptible或halted
context:与键对象pc和sp,其是指定EIP / RIP / PC分别
onComplete: function ():在结束时调用
枚举线程例子:
1 | Process.enumerateThreads({ |
Process.enumerateThreadsSync():同步版本的enumerateThreads(),返回线程数组。
Process.findModuleByAddress(address),
Process.getModuleByAddress(address),
Process.findModuleByName(name),
Process.getModuleByName(name):顾名思义根据模块名或地址互查。如果找不到这样的模块,find -prefixed函数会返回null,而get -prefixed函数会抛出异常
Process.enumerateModules(callbacks):枚举所有线程,其中callbacks是一个对象,指定:
onMatch: function (module):用module对象调用包含:
name:规范模块名称作为字符串
base:基地址为 NativePointer
size:大小以字节为单位
path:完整的文件系统路径作为一个字符串
此函数可能会返回字符串stop以提前取消枚举。
onComplete: function ()在结束时调用
枚举模块例子:
1 | Process.enumerateModules({ |
Process.enumerateModulesSync():同步版本 enumerateModules()
Module模块
Module.emuerateImports(name, callbacks):
枚举模块 name 的导入表,枚举到一个导入项的时候回调callbacks, callbacks包含下面2个回调:
onMatch: function(imp): 枚举到一个导入项到时候会被调用,imp包含如下的字段:
type,导入项的类型, 取值范围是 function或者variable
name,导入项的名称
module,模块名称
address,导入项的绝对地址
以上所有的属性字段,只有 name 字段是一定会有,剩余的其他字段不能保证都有,底层会尽量保证每个字段都能给出数据,但是不能保证一定能拿到数据,onMatch函数可以返回字符串 stop 表示要停止枚举。
onComplete: function(): 当所有的导入表项都枚举完成的时候会回调
Module.eumerateImportsSync(name): enumerateImports()的同步版本
Module.emuerateExports(name, callbacks): 枚举指定模块 name 的导出表项,结果用 callbacks 进行回调
onMatch: function(exp): 其中 exp 代表枚举到的一个导出项,包含如下几个字段:
type,导入项的类型, 取值范围是 function或者variable
name,导入项的名称
module,模块名称
address,导入项的绝对地址
onComplete: function(): 当所有的导入表项都枚举完成的时候会回调
Module.enumerateExportsSync(): Module.enumerateExports()的同步版本
Module.enumerateSymbols(name, callbacks): 枚举指定模块中包含的符号,枚举结果通过回调进行通知:
onMatch: function(sym): 其中 sym 包含下面几个字段:
isGlobal,布尔值,表示符号是否全局可见
type,符号的类型,取值是下面其中一种:
undefined
absolute
section
indirect
section,如果这个字段不为空的话,那这个字段包含下面几个属性:
id,小节序号,段名,节名
protection,保护属性类型, rwx这样的属性
name,符号名称
address,符号的绝对地址,NativePointer
这个函数返回 stop 的时候,表示要结束枚举过程
Module.findBaseAddress(name): 获取指定模块的基地址
Module.findExportByName(module | null, exp): 返回模块module 内的导出项的绝对地址,如果模块名不确定,第一个参数传入 null,这种情况下会增大查找开销,尽量不要使用。
### ModuleMap模块
new ModuleMap([filter]): 可以理解为内存模块快照,主要目的是可以作为一个模块速查表,比如你可以用这个快照来快速定位一个具体的地址是属于哪个模块。创建ModuleMap的时候,就是对目标进程当前加载的模块的信息作一个快照,后续想要更新这个快照信息的时候,可以使用 update 进行更新。 这个 filter 参数是可选的,主要是用来过滤你关心的模块,可以用来缩小快照的范围(注意:filter是过滤函数,不是字符串参数),为了让模块进入这个快照里,过滤函数的返回值要设置为true,反之设为false,如果后续内存中的模块加载信息更新了, 还会继续调用这个filter函数。
has(address): 检查 address 这个地址是不是包含在ModuleMap里面,返回bool值
find(address), get(address): 返回 address 地址所指向的模块对象详细信息,如果不存在 find 返回null,get 直接会抛出异常,具体的返回的对象的详细信息,可以参考 Process.enumerateModules()
findName(address), getName(address), findPath(address), getPath(address): 功能跟 find(), get() 类似,但是只返回 name 或者 path 字段,可以省点开销
update(): 更新ModuleMap信息,如果有模块加载或者卸载,最好调用一次,免得使用旧数据。
### Memory模块
Memory.scan(address, size, pattern, callbacks):
在 address 开始的地址,size 大小的内存范围内以 pattern 这个模式进行匹配查找,查找到一个内存块就回调callbacks
各个参数详细如下:
pattern 比如使用13 37 ?? ff来匹配0x13开头,然后跟着0x37,然后是任意字节内容,接着是0xff这样的内存块
callbacks 是扫描函数回调对象:
onMatch: function(address, size): 扫描到一个内存块,起始地址是address,大小size的内存块,返回 stop 表示停止扫描
onError: function(reason): 扫描内存的时候出现内存访问异常的时候回调
onComplete: function(): 内存扫描完毕的时候调用
Memory.scanSync(address, size, pattern): 内存扫描 scan() 的同步版本
Memory.alloc(size): 在目标进程中的堆上申请size大小的内存,并且会按照Process.pageSize对齐,返回一个NativePointer,并且申请的内存如果在JavaScript里面没有对这个内存的使用的时候会自动释放的。也就是说,如果你不想要这个内存被释放,你需要自己保存一份对这个内存块的引用。
Memory.copy(dust, src, n): 就像是memcpy
Memory.dup(address, size): 等价于 Memory.alloc()和Memory.copy()的组合。
Memory.protect(address, size, protection): 更新address开始,size大小的内存块的保护属性,protection 的取值参考 Process.enumerateRanges(),比如:Memory.protect(ptr(“0x123”, 4096, ‘rw-‘));
Hook一个Java类
1 | Java.perform(function () { |