欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

WeChat8Xposed通用hook框架适配新版微信--修复NotificationManagerCompat适配异常

程序员文章站 2024-03-14 10:57:52
...

说明

原文首发于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 类无法找到了

而是其他的类。