-
-
[原创]以WechatEnhancement为例看Xposed插件适配APP不同版本的方法
-
发表于:
2019-4-1 16:16
8314
-
[原创]以WechatEnhancement为例看Xposed插件适配APP不同版本的方法
最近在研究Xposed插件,那么一个很基本的问题就是:如何让同一个插件能够适配想要hook的App的多个不同的版本。
那么就从比较著名的WechatEnhancement插件入手吧。根据描述,它支持多个版本的微信。
话不多说,开始动手。先下载源代码并解压缩,然后切换到文件夹的根目录并输入
也就是列出根目录以及所有子目录下包含version
字符串(不区分大小写)的所有文件。得到以下结果:
因为源代码应该是在
./app/src/main/java/me/firesun/wechat/enhancement/
文件夹下,所以我们接下来要重点关注该文件夹下的文件。
那么就从./app/src/main/java/me/firesun/wechat/enhancement/Main.java
开始看起。
先贴源代码:
首先,该类实现了IXposedHookLoadPackage
接口,并重写了handleLoadPackage
函数。在该文件中搜索version
,发现关键代码:
这句话即是获取微信版本号的代码。HookParams.WECHAT_PACKAGE_NAME
的值为"com.tencent.mm"
,即微信的包名。
继续往下看:
这里再一次提到了HookParams
类。那么我们就看看这是一个什么类。
贴一下./app/src/main/java/me/firesun/wechat/enhancement/util/HookParams.java
的源代码:
可以看到HookParams
类是一个懒汉式单例模式类。它的属性有LuckyMoneyReceiveUIClassName
等等。
那么,由于第一次运行HookParams.hasInstance()
当然会返回false,因此会执行SearchClasses.init(context, lpparam, versionName);
。
那么就看看SearchClasses.java
:
看一下init
方法:
先不看loadConfig
函数,因为预感核心代码并不在这里。看generateConfig
函数。
首先,第一行调用了HookParams.getInstance();
。那么,HookParams
类中的私有instance
属性将被初始化。接下来,hp
的versionName
属性将被设置为当前微信的版本号。hp
的versionCode
属性将被设置为HookParams
类的VERSION_CODE
常量。注意,这个VERSION_CODE
常量代表着当前插件的版本号,不是微信的版本号。
接着,调用了getVersionNum
函数:
int versionNum = getVersionNum(versionName);
这个函数的作用是将微信的版本号字符串转换成整数以方便比较版本号的大小。
那么接下来几行代码的逻辑就很清楚了:将当前版本号与某个版本号相比较,然后对hp
的属性进行设置。那么我们终于知道了HookParams
正是用来存放与hook有关的参数的单例模式类。
剩下的代码逻辑大致是这样的:扫描微信apk得到其中的所有的类名,然后通过一定的规则过滤类名得到要hook的方法名,设置到hp
的属性中。
接下来看看loadPlugins
方法:
首先,plugins
属性是私有静态IPlugin
数组,存放着所有插件类的实例。所有插件类都需要实现IPlugin
接口。loadPlugins
调用了所有插件的hook
方法。插件的hook
方法通过给XposedHelpers.findAndHookMethod
传入HookParams
的属性(告诉Xposed要hook什么方法),来完成hook。
总结:
WechatEnhancement插件通过HookParams
单例模式类来存放要hook的类名和方法名,Main
类通过最终调用SearchClasses.generateConfig
方法来设置HookParams
的属性,实现版本适配。最终,Main.loadPlugins
方法会调用各插件各自的hook
方法,根据HookParams
存放的要hook的类名和方法名,来hook相应的方法。
免责声明:
本文不包含对微信的逆向分析,仅探讨Xposed插件版本适配的方法。如有任何人滥用本文的技术造成任何后果,本人不承担任何责任!
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)
最后于 2019-4-1 16:18
被crownless编辑
,原因: