NP管理器
分析软件
打开算法助手
附加绿色软件进程,开启onClick
监听功能

启动微信触发一下长按菜单的点击事件,然后我们回到算法助手看日志,通过控件标题来判断是哪个

我们复制类名ot4.k
打开NP管理器
,搜索类名,只有一个结果点进去,点击导航按钮长按<init>
这个方法名点击查看调用处

一样只能找到一个结果,我们点进去,点导航,长按p
方法单独转成Java
这样不会有其它代码干扰

我们往下滑看到这里2131320032
这个ID就是菜单文字的ID,可以通过AutoJs
等软件查看到,this.z.d
的类型是ArrayList
,最后还转成MenuItem
不然看出这应该是菜单的集合,类型为MenuItem

编写我们的Hook代码先获取ArrayList
类型的this.z.d

下面他会判断是不是instanceof
于x3
,我们找一下这个类名跳转进去,应该可以找到我们想要的结果了

我们退出Java
反编译页面,搜索x3
我们长按跳转过去,转成Java
看看

我们可以看到setIcon
和setIcon
方法

那我们要先Hook
的话要拿到他的构造方法,和类名一样的方法名就是构造方法了,我们搜索x3
,他有三个参数,Context context
int i
int i2

第一个context
肯定是上下文,我们Hook
Activity就能获取到,不用管,后面两个不知道,我们尝试Hook
一下这个方法,打印参数看看结果是什么
XposedBridge.hookAllConstructors("cm4.x3".findClass(application.classLoader), object : XC_MethodHook() {
override fun beforeHookedMethod(param: MethodHookParam) {
val context = param.args[0] as Context
val i = param.args[1] as Int
val i2 = param.args[2] as Int
("x3 constructor called with parameters:").d()
("Context: $context").d()
("i: $i").d()
("i2: $i2").d()
}
})
我们重新打开微信,触发一下长按消息事件,可以看到12
很多,x2
应该是GroupID
最后这个11
是我Hook上的,i
应该是一个ID
,你们可以测试一下,应该这两个参数随便写都行

我们来实现最后的Hook
代码,倒数第二行dObject.removeAt(8)
是删除ArrayList
第9个元素的意思,因为他的添加按钮代码有判断,一行超过6个就不能添加了,所以我们为了适配所有消息,删除没用的搜一搜按钮,最后效果就出来了

接下来我们添加点击事件,我们一开始onClick
监听的类名ot4.k
就是点击事件了,我们通过TextView
也就是菜单名称来判断是点了哪个菜单,并弹出Tosat
,来看看效果吧


全部代码
var launcherUiActivity: Activity? = null
"com.tencent.mm.ui.LauncherUI".hook(application.classLoader, "onCreate", Bundle::class.java) {
launcherUiActivity = it.thisObject as Activity?
}
"ot4.r".hook(application.classLoader, "p", Int::class.java, Int::class.java) { param ->
val thisObject = param.thisObject
val zObject = XposedHelpers.getObjectField(thisObject, "z")
val dObject = XposedHelpers.getObjectField(zObject, "d") as MutableList<Any>
val x3Class = "cm4.x3".findClass(application.classLoader)
val x3Constructor = x3Class.getConstructor(Context::class.java, Int::class.javaPrimitiveType, Int::class.javaPrimitiveType)
val setTitleMethod = x3Class.getMethod("setTitle", CharSequence::class.java)
val setIconMethod = x3Class.getMethod("setIcon", Int::class.javaPrimitiveType)
val menu = x3Constructor.newInstance(launcherUiActivity, 114, 11)
setTitleMethod.invoke(menu, "吾爱破解")
setIconMethod.invoke(menu, R.drawable.cow)
dObject.removeAt(8)
dObject.add(menu)
}
"ot4.k".hook(application.classLoader, "onClick", View::class.java) { param ->
val linearLayout = param.args[0] as LinearLayout
val textview = (linearLayout.getChildAt(0) as LinearLayout).getChildAt(1) as TextView
if (textview.text == "吾爱破解") {
Toast.makeText(textview.context, "吾爱破解帕帝天秀", Toast.LENGTH_SHORT).show()
}
}
这个hook
方法是扩展的函数,有需要的回复一下我发评论区