我正在尝试理解Xposed是如何做钩子部分的,它为用户提供了API来非常容易地钩住任何方法。
我已经浏览了Xposed Bridge的源代码,该jar文件在每次启动时都驻留在每个进程中。我还发现他们使用java反射来获取类方法、参数等,以便通过JNI将其传递给Native方法。
有一件事,我不能弄清楚的是Xposed是如何钩住进程并能够完全控制它的。
我试图弄清楚挂钩是发生在Java端的XposedBridge jar文件中,还是发生在原生代码中的艺术级别。
发布于 2016-07-31 00:30:13
问得好。XPosed通过修改app_process文件来工作,该文件是ART VM和以前的Dalvik VM。
这个新修改的ART/Dalvik VM将加载XPosedBridge.jar文件以及在执行时已在系统中注册的所有xposed模块。现在,这种情况只发生一次,因为Android的工作方式是有一个从头开始创建的Java VM (称为Zygote),然后每次应用程序启动时,这个VM都会被派生出来,让新应用程序有自己的VM。
此外,这个修改后的ART/Dalvik VM将在Zygote的fork函数之后添加一个回调,以允许它触发所有截获packageOnLoad事件的xposed模块代码。
最后,为了允许它拦截单个类的方法,XposedBridge中的hookMethod功能(这是您在创建xposed模块时使用的库)将修改VM中为您试图挂钩的特定类定义的本机类结构,以便将您试图挂钩的方法的方法指针重定向到新的替换方法。
https://stackoverflow.com/questions/38504544
复制相似问题