首页
社区
课程
招聘
[原创]以WechatEnhancement为例看Xposed插件适配APP不同版本的方法
发表于: 2019-4-1 16:16 8314

[原创]以WechatEnhancement为例看Xposed插件适配APP不同版本的方法

2019-4-1 16:16
8314

最近在研究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属性将被初始化。接下来,hpversionName属性将被设置为当前微信的版本号。hpversionCode属性将被设置为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编辑 ,原因:
收藏
免费 2
支持
分享
最新回复 (3)
雪    币: 3344
活跃值: (2009)
能力值: ( LV9,RANK:140 )
在线值:
发帖
回帖
粉丝
2

How about this?
https://github.com/pylerSM/YouTubeBackgroundPlayback
配一个json,还可以动态更新。

2019-4-1 18:03
0
游客
登录 | 注册 方可回帖
返回
//