原文链接: 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()
被调用前都不会改变.
网友评论