Skip to content

native/Foundation/IOUniformer · IO 重定向 hook 总入口 ​

native 层 IO 重定向的核心,537 行。hook libc 的 execve、linker 的 do_dlopen,把路径参数经 SandboxFs.relocate_path 重定向到虚拟沙箱目录。由 NativeEngine 的 nativeEnableIORedirect 触发初始化。

核心 API ​

从源码提取的真实函数:

函数作用
IOUniformer::init_env_before_all()全局初始化,读取 V_KEEP_ITEM_*/V_FORBID_ITEM_*/V_REPLACE_ITEM_SRC_*/V_REPLACE_ITEM_DST_* 环境变量,注册到 SandboxFs
hook_function(addr, new_func, old_func)按地址 hook(inline hook 封装)
hook_function(handle, symbol, new_func, old_func)按符号名 hook
HOOK_DEF(int, execve, pathname, argv, envp)拦截 execve:dex2oat 路径重定向 + 注入 --inline-max-code-units=0 阻止内联
HOOK_DEF(void*, do_dlopen_V19, filename, flag, extinfo)Android 9 的 do_dlopen 路径重定向
HOOK_DEF(void*, do_dlopen_V24, name, flags, extinfo, caller_addr)Android 7+ 的 do_dlopen 路径重定向

与 Java 侧的映射 ​

NativeEngine 声明的 native 方法对应关系:

NativeEngine native 方法IOUniformer 内部行为
nativeEnableIORedirect(selfSoPath, apiLevel, previewApiLevel)调 init_env_before_all + 注册所有 libc hook
nativeIORedirect(origPath, newPath)等价 add_replace_item
nativeIOWhitelist(path)等价 add_keep_item
nativeIOForbid(path)等价 add_forbidden_item
nativeGetRedirectedPath(orgPath)调 relocate_path
nativeReverseRedirectedPath(redirectedPath)调 reverse_relocate_path

execve 拦截流程 ​

--inline-max-code-units=0(API > 25)或 --inline-depth-limit=0(API ≤ 25)阻止 dex2oat 内联优化,确保后续 ART 方法 hook(见 VMPatch)能命中被内联的方法。

do_dlopen 版本分支 ​

linker 的 do_dlopen 签名随 Android 版本变化,IOUniformer 用 findSymbol 探测三种符号名定位真实入口:

详见 虚拟存储与 IO 重定向。

基于 VirtualApp 与 epic,仅供学习研究。VirtualApp 禁止商用。