Skip to content

Modules and Symbols

Before Hooking, it is usually necessary to get the memory base address of the target SO (Shared Object) or directly find the exported function address.

Get Module Base Address (native.module_base)

Get the start address of a loaded module.

lua
native.module_base(module_name) -> LuaPointer
  • Parameters: module_name (string) —— Full module name, e.g., libil2cpp.so.
  • Returns: Module base address. If the module is not found, usually returns 0 (null).

Alias Compatibility: native.get_module_base(name) is the same as this function.

Example:

lua
local base = native.module_base("libunity.so")
if base.not_null() then
    log("Unity Base: " .. base.to_hex())
end

Resolve Exported Symbol (native.resolve_symbol)

Find the symbol address in the SO Export Table.

lua
native.resolve_symbol(module_name, symbol_name) -> number
  • Parameters:
    • module_name: Module name.
    • symbol_name: Symbol name (C++ functions might be Mangled Names).
  • Returns: Absolute address of the symbol (number). Returns 0 if not found.

Example:

lua
local fopen_addr = native.resolve_symbol("libc.so", "fopen")
log("fopen address: " .. string.format("0x%X", fopen_addr))

Advanced Search (getModuleBase)

This interface is retained for more complex /proc/self/maps matching.

lua
native.getModuleBase(name, filter) -> number
  • Feature 1: Support finding BSS segment.
    • Pass libfoo.so:bss to name to find the BSS segment address of that SO.
  • Feature 2: filter filtering.
    • Pass permission string (e.g., r-xp) to precisely match memory segments.
lua
-- Get r-xp segment of libfoo.so
local code_base = native.getModuleBase("libfoo.so", "r-xp")

Made with ❤️