对于自动化hook Il2cpp
的模块来说, dlopen
的hook相当于一个大门, 没有该大门口, 一切都是纸上谈兵
在 armabi-v7a 上hook dlopen
, 轻松的不要不要的, 甚至借用一下 virtual
系列app的 va++
核心提供的 hook_dlopen
函数的接口都行
可是到了 aarch64 这里, 找了一圈, 能用的 hook构件
也就一枚 And64InlineHook, 而且源项目好像还得自己手动修一下才能使用....
好了有 hook构件
了, 但是我看了一圈主流的 VirtualApp
商业授权做出来的 虚拟多开
系列软件, 基本上都没实现 aarch64 的 hook_dlopen
, 有的实现了却没有给调用, 自己去调用的话就会卡死

1
2
3
|
测试平台
机型: 红米K30 - 4G , 已Root
系统: miui11, android - 10
|
看雪上看到的一篇文章: Android9.0 hook dlopen问题
虽然半年前就看到这篇文章,但是基本上在看天书,现在拿出来看了一圈, 关键实现就是这里

虽然我看不懂什么 LR寄存器
什么的, 但是唯独看懂这第三个参数强制赋值为 dlerror
函数的函数地址, 以达到越过系统的限制
而关于那所谓的系统限制, 就是在安卓7开始, 系统就禁止 用户APP
打开/读取 部分 系统库文件
, 所以直接 dlopen linker
会直接失败, 具体可以使用 dlerror()
函数查看原因
貌似安卓9开始, dlopen就由 libdl.so
库进行导入, 反汇编看看
看了一下导出函数, 也就只有两个函数涉及到dlopen

让我康康这个 dlopen
长什么样!


中间的 .__loader_dlopen
是个跳板

最终指向的是got表的导出变量 __loader_dlopen

步骤很简单
- 加载
libdl.so
- 使用 dlsym() 获取
__loader_dlopen
- 打印该值, 顺便看看该内存所在maps的何处
1
2
3
4
5
6
7
|
LOGE( "pid: %d" , getpid());
void * libdl_handle = dlopen( "libdl.so" , RTLD_NOW);
LOGE( "libdl_handle: %p" , libdl_handle);
void * __loader_dlopen_addr = dlsym(libdl_handle, "__loader_dlopen" );
LOGE( "__loader_dlopen at: %p" , __loader_dlopen_addr);
|
先查看logcat
输出

__loader_dlopen
的值为0x700258f11c
使用adb shell去查看对应的内存区段
1
2
3
|
adb shell
su
cat / proc / 目标pid / maps
|

跑到 linker64
里去了, 把文件提取出来反汇编, 顺便先把这 __loader_dlopen
的偏移值算出来
0x700258f11c - 0x7002557000 = 0x3811C
利用刚刚算出来的偏移,转跳后发现指向的是 linker64 里的 __loader_dlopen
函数

[招生]科锐逆向工程师培训(2025年3月11日实地,远程教学同时开班, 第52期)!