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 类无法找到了

而是其他的类。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值