-
-
[原创]一种简单的注入zygote进程的方案
-
发表于:
2020-5-8 16:20
12485
-
很早就注册了看雪号,结果没分享过什么东西emm,发现现在大家用的注入方案基本上都是替换系统库,分享个不需要替换系统库的方案吧
先说限制:1.只能在Android 7.0及更高版本中使用;2.部分设备会报UnsatisfiedLinkError,还没找到原因,各位大神可以分析下~
注:本文分析的是Android 7.0的源码
zygote对应的可执行文件其实就是app_process
,它的main方法如下:
跟踪下去,最终会调用JNI_CreateJavaVM
创建虚拟机,这个方法是这样实现的:
注意看android::InitializeNativeLoader()
,这个函数直接调用了g_namespaces->Initialize()
,而g_namespaces
是一个LibraryNamespaces
指针,继续看下去,我们发现了宝藏:
public_native_libraries_system_config=/system/etc/public.libraries.txt,而ReadConfig方法很简单,读取传进来的文件路径,按行分割,忽略空行和以#开头的行,然后把这行push_back到传进来的vector里。
所以这个函数做了这几件事:
有了上面的分析基础,我们这样做就可以让我们自己的so库被zygote进程dlopen了:
到这,已经可以在zygote里加载自己的库了,但还有一个问题:zygote只打开了这个库,并没有调用任何函数,而我们常用的JNI_OnLoad
函数在这是不会被调用的,怎么才能让zygote执行自己的代码呢?各位估计已经知道了,写一个用__attribute__((constructor))
修饰的函数,这个函数会被登记在.init.array里,会在so被加载时调用,我们就完成了注入逻辑;接下来你就可以在zygote里做自己想要做的事了,玩的开心 :)
最后夹带点私货,此方案最先发表在我的博客上,顺便结合SandHook写了个简单的Xposed实现,感兴趣的可以去围观下~
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!
最后于 2020-6-5 09:14
被残页编辑
,原因: 尝试修复代码块高亮