WeChat8Xposed通用hook框架适配新版微信--修复NotificationManagerCompat适配异常
说明
原文首发于WeChat8Xposed通用hook框架适配新版微信-单元测试适配新微信
如有访问异常或者问题讨论请前往原文浏览
前言
最近在研究个人的微信bot,也就是想做一个微信聊天的机器人。搜索之下发现了一个有意思的库WechatSpellbook。
Wechat Spellbook 是一个使用Kotlin编写的开源微信插件框架,底层需要 Xposed 或 VirtualXposed 等Hooking框架的支持,而顶层可以轻松对接Java、Kotlin、Scala等JVM系语言。让程序员能够在几分钟内编写出简单的微信插件,随意揉捏微信的内部逻辑。
正好做下研究,利用这个框架配合xposed做 微信数据抓取 微信公众号阅读量的采集分析 还有微信机器人的制作
问题出现
在使用中发现该库已经无法正常满足最版本的微信hook
需要重新对其做适配工作
于是我新建了一个项目 WeChat8Xposed
地址在 https://github.com/HuRuWo/WeChat8Xposed
fork了原库的代码作为组件 导入之后开始做适配工作。
测试NotificationManagerCompat类无法找到
没有找到 NotificationManagerCompat
没有找到 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)
思考为什么
做过开发都知道NotificationManagerCompat
就是一个关于通知信息的东西
如果我们要hook关于通知的行为 就要hook NotificationManagerCompat这个类的相关方法
同时这个方法也就处于我们的v4/v7的兼容包下面
分析解决问题
旧版特征值过滤器
object Classes {
val NotificationManagerCompat: Class<*> by wxLazy("NotificationManagerCompat") {
findClassesFromPackage(wxLoader!!, wxClasses!!, "android.support.v4.app")
.filterByField("android.app.NotificationManager")
.firstOrNull()
}
}
不难看出 就是 找 android.support.v4.app
目录下 带 android.app.NotificationManager
变量值的类
jadx静态分析apk
老办法 jadx打开apk文件
分析包结构目录
显然在旧版的android.support.v4.app
目录下也就是没有所谓的NotificationManagerCompat
类
androidx代替v4/v7
日常做安卓开发的我稍微的想了一分钟,不难得出。微信在高版本的微信里面使用了
androidx代替v4/v7
具体的可以看这个 https://developer.android.google.cn/jetpack/androidx/
反正我的软件也做了这个兼容的切换
同理修复路径
任意的搜索android.app.NotificationManager
这个类的引用关系,不难找到在androidx.core.app
下面有这个的引用。也就是说
新版的 androidx.core.app 代替了原版的 android.support.v4.app
调整特征值
object Classes {
val NotificationManagerCompat: Class<*> by wxLazy("NotificationManagerCompat") {
findClassesFromPackage(wxLoader!!, wxClasses!!, "androidx.core.app")
.filterByField("android.app.NotificationManager")
.firstOrNull()
}
}
跑测试文件验证
已经成功 不再报错 NotificationManagerCompat
类无法找到了
而是其他的类。