Frida Javascript api # Module 与
原文链接: https://frida.re/docs/javascript-api/#module
欢迎加入 Frida 交流群: 1049977261
Module
Module.load(), Process.enumerateModules() 等方法返回的对象.
-
name: 规范的模块名称 -
base:NativePointer类型的基础地址 -
size: 以byte为单位的尺寸 -
path: 完整的文件系统路径字符串 -
enumerateImports():
列举导入的模块, 返回一个包含以下属性的数组:-
type: 要么是function, 要么是variable. -
name: 导入名称. -
module: 模块名称. -
address:NativePointer类型的绝对地址. -
slot: 导入的模块的NativePointer类型的内存地址.
对于所有导入的模块, 只有
name属性保证会存在. 特定平台的后端将会尽力解析出其他字段, 甚至超出原始源数据提供的内容, 但不保证会成功. -
-
enumerateExports():
列举导出的模块, 返回一个包含以下属性的数组:-
type: 要么是function, 要么是variable. -
name: 导出的名称. -
address:NativePointer类型的绝对地址.
-
-
enumerateSymbols():
列举模块的符号, 返回一个包含以下属性的数组:-
isGlobal: 一个标志着符号是否全局可见的布尔值. -
type: 下列字符串中的一种:- unknown
- section
- undefined (Mach-O)
- absolute (Mach-O)
- prebound-undefined (Mach-O)
- indirect (Mach-O)
- object (ELF)
- function (ELF)
- file (ELF)
- common (ELF)
- tls (ELF)
-
section: 如果有的话, 包含以下属性:-
id: 包含分区序号(section index), 断片名称(segment name) (如果的适用的话) 以及分区名称 (与 [r2][] 的分区 ID 格式一致) 的字符串. -
protection: 读写权限, 同Process.enumerateRanges().
-
-
name: 符号名称. -
address:NativePointer类型的绝对地址. -
size: 以byte为单位的符号尺寸, 如果有的话.
-
enumerateSymbols() 仅可用于 i/macOS 以及基于 Linux 的操作系统
我们当然也很想支持其他的平台, 所以如果您发现这个方法很实用并且想要帮我们一把, 请保持联系. You may also find the DebugSymbol API adequate, depending on your use-case.
-
enumerateRanges(protection): 类似于Process.enumerateRanges, 但它仅限模块内. -
findExportByName(exportName),getExportByName(exportName): 返回导出模块. 当找不到相应的模块时, find 前缀的方法返回 null 而 get 前缀的方法抛出异常.
-
Module.load(name): 加载指定的模块, 并返回一个Module对象. 如果指定的模块无法加载, 则抛出异常. -
Module.ensureInitialized(name): 确保指定模块被初始化.
This is important during early instrumentation, i.e. code run early in the process lifetime, to be able to safely interact with APIs. One such use-case is interacting with ObjC classes provided by a given module. -
Module.findBaseAddress(name),Module.getBaseAddress(name):
返回指定模块的基础地址. 当找不到相应的模块时, find 前缀的方法返回 null 而 get 前缀的方法抛出异常. -
Module.findExportByName(moduleName|null, exportName),
Module.getExportByName(moduleName|null, exportName):
返回指定模块的导出模块的绝对地址.
如果您不确定指定模块的名称, 您可以传入null, 但这可能会消耗大量资源, 应当尽量避免.
当找不到相应的模块时, find 前缀的方法返回 null 而 get 前缀的方法抛出异常.
ModuleMap
-
new ModuleMap([filter]):
创建一个针对指定地址属于哪个模块优化过的模块地图.
创建时会对已加载的模块进行一次快照, 您可以调用update()来刷新这个快照.
filter参数是可选的, 它允许您传入一个方法用于过滤模块列表.
这在您只关心应用本身的模块时很实用, 并且它允许您快速的检查一个地址是否属于这个应用的某一个模块.filter方法接受一个 Module 参数并且必须对每一个应当保留在地图内的模块返回true. 这个方法将在每一次地图更新时对已加载的各个模块执行一次.
-
has(address): 检查address是否属于已包含地图内的模块, 返回一个布尔值. -
find(address),get(address):
返回一个address归属的 Module 的详情.
当找不到相应的模块时,find()方法返回 null 而get()方法抛出异常. -
findName(address),getName(address),
findPath(address),getPath(address):
类似于find()和get(), 但进返回name或者path字段.
这意味着当您不需要其他的信息时将消耗更少的资源. -
update(): 更新地图.
您应当在模块被加载或者卸载时调用这个方法, 以免在过期的数据上进行操作. -
values():
返回一个当前地图中包含的 Module 的数组.
返回的数组是深度复制过的并且在update()被调用前都不会改变.