WeChat8Xposed通用hook框架适配新版微信-单元测试适配新微信

说明

原文首发于WeChat8Xposed通用hook框架适配新版微信-单元测试适配新微信

如有访问异常或者问题讨论请前往原文浏览

前言

最近在研究个人的微信bot,也就是想做一个微信聊天的机器人。搜索之下发现了一个有意思的库WechatSpellbook

Wechat Spellbook 是一个使用Kotlin编写的开源微信插件框架,底层需要 Xposed 或 VirtualXposed 等Hooking框架的支持,而顶层可以轻松对接Java、Kotlin、Scala等JVM系语言。让程序员能够在几分钟内编写出简单的微信插件,随意揉捏微信的内部逻辑。

正好做下研究,利用这个框架配合xposed做 微信数据抓取 微信公众号阅读量的采集分析 还有微信机器人的制作

问题出现

在使用中发现该库已经无法正常满足最版本的微信hook
需要重新对其做适配工作

于是我新建了一个项目 WeChat8Xposed

地址在 https://github.com/HuRuWo/WeChat8Xposed

fork了原库的代码作为组件 导入之后开始做适配工作。

MirrorUnitTest 测试版本适配

我们知道的。xposed要生效hook到指定的位置的类和方法

最重要的就是类名和方法名

而由于大多数软件开启了混淆模式,有时候神奇的路径就会变化。即使是非常微小的版本差异也会导致路径大相径庭。

WechatSpellbook 原作者非常贴心的准备了一个MirrorUnitTest 测试文件来解析文件路径。

MirrorUnitTest原理分析

通过阅读MirrorUnitTest的源码,我大致了解就是通过apk的文件dex分析,来寻找指定的目标类。

几个核心的测试类方法:

apkFile.exists()

检查安装包文件 也就是你要hook的版本的微信安装包 记得放在指定目录下面

MirrorClasses + MirrorMethods + MirrorFields

映射类 映射方法 映射变量 也即是我们讲的特征值

变成一个Objects 传入MirrorUtil 作为查找目标类的特征值

val objects = MirrorClasses + MirrorMethods + MirrorFields

MirrorUtil

核心的适配 自动适配表达式 的工具类

通过传入特征值来寻找和记录类路径

  1. MirrorUtil.clearUnitTestLazyFields(instance)

清除上次的缓存

2.MirrorUtil.generateReportWithForceEval(objects)

测试是否能找到目标类

apkFile.delete()

删掉因为解析产生出来的垃圾文件 大概有几百M 测试完成通过将全部自动删除

下载目标版本的apk文件

值得注意的是 原作者的库里留下了测试文件 MirrorUnitTest

针对一些目标版本做了测试从6.60版本一直到6.73版本的适配测试

如何做一个新版的适配测试呢

这就要拉下来我们要适配的版本apk

今天是2021-6-21日,官网最新的版本是 v806版本 下载链接 https://dldir1.qq.com/weixin/android/weixin806android1900_arm64.apk我们把

它拉下来放到文件下apks/domestic目录下面

编写测试可用性脚本

测试脚本新增一行

@Test fun verifyPlayStorePackage8_0_6() { 
verifyPackage("$DOMESTIC_DIR/wechat-v8.0.6.apk") 
}

然后点击运行测试 查看输出日志 分析通过特征值是否找到了指定的目标类一测就出问题了

没有找到 NotificationManagerCompat

scriptjava.lang.Error: Failed to evaluate NotificationManagerCompat       at 
com.gh0u1l5.wechatmagician.spellbook.mirror.android.support.v4.app.Classes$$special$$inlined$wxLazy$1.invoke(WechatGlobal.kt:112)       at kotlin.SynchronizedLazyImpl.getValue(LazyJVM.kt:74)       at 
com.gh0u1l5.wechatmagician.spellbook.WechatGlobal$UnitTestLazyImpl.getValue(WechatGlobal.kt:138)       at 
com.gh0u1l5.wechatmagician.spellbook.util.MirrorUtil.generateReportWithForceEval(MirrorUtil.kt:64)       at 
com.gh0u1l5.wechatmagician.spellbook.MirrorUnitTest.verifyPackage(MirrorUnitTest.kt:84)       at 
com.gh0u1l5.wechatmagician.spellbook.MirrorUnitTest.verifyPlayStorePackage8_0_6(MirrorUnitTest.kt:152)       at java.lang.reflect.Method.invoke(Native Method)       at 
org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)       at 
org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)       at 
org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)       at 
org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)       at 
androidx.test.internal.runner.junit4.statement.RunBefores.evaluate(RunBefores.java:80)       at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)       at 
org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78)       at 
org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57)       at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)       at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)       at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)       at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)       at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)       at org.junit.runners.ParentRunner.run(ParentRunner.java:363)       at 
androidx.test.ext.junit.runners.AndroidJUnit4.run(AndroidJUnit4.java:104)       at org.junit.runners.Suite.runChild(Suite.java:128)       at org.junit.runners.Suite.runChild(Suite.java:27)       at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)       at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)       at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)       at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)       at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)       at org.junit.runners.ParentRunner.run(ParentRunner.java:363)       at org.junit.runner.JUnitCore.run(JUnitCore.java:137)       at org.junit.runner.JUnitCore.run(JUnitCore.java:115)       at androidx.test.internal.runner.TestExecutor.execute(TestExecutor.java:56)       at 
androidx.test.runner.AndroidJUnitRunner.onStart(AndroidJUnitRunner.java:388)       at 
android.app.Instrumentation$InstrumentationThread.run(Instrumentation.java:2091)

如何修复这个异常

这个异常意味着特征类没有找到 需要重新制作特征类
也就是要重新适配路径核心就在mirror文件夹下面
有所有通用映射规则的 也就是wechat应用程序包的类结构映射。
哪个类出现异常就要修复哪个类的问题

具体的修复下篇分析。

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Axure新版微信元件库是适用于Axure软件的一套基于微信设计风格的元件集合。该元件库包含了微信平台上常见的各种UI元素,如按钮、文本框、下拉菜单、标签、图标等,以及各种页面模板和交互组件,能够帮助用户快速地设计和原型化微信应用的界面和功能。 新版微信元件库的设计风格与微信官方设计风格高度一致,每个元件的颜色、形状、字体等细节都经过精心的调整,以确保用户设计的原型与实际微信界面一致。另外,该元件库还根据微信平台的特点和使用习惯,加入了一些独特的交互效果和动画效果,以提升用户的体验。 使用新版微信元件库可以带来很多好处。首先,它大大节省了设计师的时间和精力。不需要从零开始设计每一个细节,只需从元件库中选择需要的元素,然后进行适当的修改和组合,就能快速实现设计想法和需求。其次,使用统一的元件库能够保持设计的一致性和整体性,使得设计的界面看起来更加专业和现代化。此外,使用元件库的原型可以更好地与开发人员进行沟通,减少沟通误差,提高工作效率。 总之,Axure的新版微信元件库是一个非常实用的设计工具,它不仅能够帮助用户节省时间和精力,还能提供专业的设计风格和交互效果,使得微信应用的原型设计更加高效和精准。无论是设计师还是开发人员,都可以从中获得很大的帮助和便利。 ### 回答2: Axure新版微信元件库是一个用于Axure原型设计工具的插件,旨在帮助设计师更快速、高效地创建微信界面原型。这个元件库包含了微信官方的界面元素和交互组件,用户可以直接在Axure中使用这些预设的元件来设计微信页面,并且可以根据自己的需求进行自定义。 使用Axure新版微信元件库,设计师可以省去自己手动绘制微信界面元素的时间,只需通过拖拽、调整大小等简单操作就可以快速构建出完整的界面原型。这个元件库还提供了不同尺寸的屏幕模板,方便设计师在不同设备上进行适配。 此外,Axure新版微信元件库还包含了微信的常用交互组件,如菜单、标签页、输入框等,设计师可以根据需要将这些组件拖拽进原型中,并设定相应的交互动作,以实现更加真实的界面交互效果。同时,该元件库还提供了丰富的样式和颜色设置,使得设计师可以轻松地定制界面的外观。 总之,Axure新版微信元件库为设计师提供了一个方便、快速的原型设计工具,使得他们可以更加高效地将设计理念转化为可视化的界面原型,进一步提升工作效率。 ### 回答3: Axure新版微信元件库是一款用于Axure RP软件的设计工具,专门用于快速搭建微信界面原型的设计工具。 该元件库包含了微信中常用的各种组件和元素,如聊天界面、朋友圈、公众号等,可以帮助设计师更加便捷地进行微信界面的设计和原型展示。 新版微信元件库在原有的基础上进行了升级和优化。首先,添加了更多的元素和组件,包括最微信界面元素,保持与微信官方最新版本的同步。其次,对原有的元件进行了改进和优化,提高了使用的便捷性和效率。例如,增加了更多的快捷键和样式预设,使设计过程更加高效。 此外,新版微信元件库还提供了丰富的交互效果和动画效果支持,可以让设计师更加直观地展示界面的交互过程。设计师可以通过简单的拖拽和设置,实现按钮点击效果、页面跳转效果等。 总的来说,Axure新版微信元件库是一款功能强大、易用性高的设计工具,能够帮助设计师快速搭建微信界面的原型,并展示出丰富的交互效果。无论是对于专业设计师还是初学者来说,都是一个非常实用的工具。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值