Skip to content

native/Foundation/SymbolFinder · ELF 符号查找 ​

427 行。按进程 PID 解析 /proc/<pid>/maps,加载指定 so 的符号表,查找符号的运行时地址。与 fake_dlfcn 互补:fake_dlfcn 处理文件级 ELF,SymbolFinder 处理已加载 so 的运行时地址。

关键函数 ​

从源码提取:

函数作用
find_name(pid, name, libn, &addr)在 pid 进程的 libn 中查找符号 name,写入 addr
find_libbase(pid, libn, &addr)查 libn 在 pid 进程的加载基址
load_symtab(filename)加载 so 文件的符号表(symtab_t)
load_memmap(pid, mm, &nmmp)解析 /proc/<pid>/maps,得到各 so 的地址区间
lookup_sym(s, type, name, &val)在符号表里按类型+名字查
lookup_func_sym(s, name, &val)仅查 FUNC 类型符号
get_syms(fd, symh, strh)从 ELF 的 section header 取符号表与字符串表

查找流程 ​

与 fake_dlfcn 的分工 ​

场景用谁
取文件内符号偏移(文件未加载)fake_dlfcn
取已加载 so 的运行时地址(带 PID)SymbolFinder
符号已通过 linker 导出系统 dlsym

VMPatch 用 SymbolFinder 定位 ART 的 OpenDexFiles、CompileMethod 等内部函数地址,再走 inline hook 替换。

ELF 解析细节 ​

load_symtab 解析 ELF 流程:

支持 32/64 位 ELF(通过 Elf32_Shdr/Elf64_Shdr 适配),my_pread 替代 pread 以兼容老内核。

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