一、前言
上篇文章已经介绍了如何用Xposed实现调一个小功能的方法(Xposed快速入门例子(一)----- 拉黑好友)
那么这个代码在什么时机调用呢?我主要想到了以下两个模式。
二、两种调用模式
1.发广播(主要用于测试)
具体思路就是往Xposed模块中注册广播,然后在其它app中发送广播过去。
那么在什么地方注册广播呢? 网上大佬们给的方法很多,但是很多都会出现重复接收的情况。
所以介绍一下我的思路。看以下代码
//注意:这是kotlin代码,kotlin中"=="相当于java中的"equals"
if (lpparam.processName=="com.tencent.mm"){
//在此处注册广播!
val intentFilter = IntentFilter().apply {
addAction("action_pull_black")
}
context.registerReceiver(myReceiver, intentFilter)
}
复制代码
可以看到注册广播的时候,我是用进程过滤的。因为微信的进程很多,所以不要用包名过滤。这样保证不会收到重复的广播!
/**
* 广播接收器
* */
private val myReceiver = object :BroadcastReceiver(){
override fun onReceive(context: Context?, intent: Intent) {
if (intent.action=="action_pull_black"){
val wxid = intent.getStringExtra("extra_wxid")
Handle.setBlack(wxid)
}
}
}
复制代码
通过广播接收器,可以看到收到了一个wxid,直接调拉黑的方法就可以了。
上图是我在app主页,写了一个EditText和一个Button。点拉黑就把广播发送了过去。看以下代码
btn_pull_black.setOnClickListener {
val wxid = et_wxid.text.toString()
if (wxid==""){
Toast.makeText(this, "wxid不能为空!", Toast.LENGTH_SHORT).show()
return@setOnClickListener
}
sendBroadcast(Intent().setAction("action_pull_black").apply {
putExtra("extra_wxid", wxid)
})
}复制代码
这样,第一种模式就完成了!
2.hook到微信的方法之后,再调相应的Xposed代码
一般做Xposed模块的项目,主要用到的就是这种模式。
我们可以设想一个实际场景,如果好友说了一句骂人的话,我们就把他拉黑。
所以我们现在要做的就是hook到这个聊天内容和好友的wxid。
如何hook呢。我看大佬们的方法也是千奇百怪。
我觉得做实用的思路就是微信巫师所提供的------trace微信的数据库。
这种方式的好处就是简单明了,不用适配微信的版本。
以下是打开微信的db文件(db文件是加密的,网上有很多解密的方法,请自行百度),通过分析找到了聊天记录的表所在的地方。
我们只要hook插入数据库的方法就可以了。
// Hook SQLiteDatabase to trace all the database operations.
@JvmStatic
fun traceDatabase() {
XposedHelpers.findAndHookMethod(
pkg.SQLiteDatabase, "insertWithOnConflict",
String::class.java, String::class.java, ContentValues::class.java, Int::class.java, object : XC_MethodHook() {
@Throws(Throwable::class)
override fun beforeHookedMethod(param: MethodHookParam) {
try {
val table = param.args[0] as String?
val values = param.args[2] as ContentValues?
val talker = values?.get("talker").toString()
if (table == "message") {
val content = values?.get("content").toString()
Log.e("Developer","hook到的---->content:$content\n" +
"talker--->$talker")
if (content == "滚") {
Handle.setBlack(talker)
}
}
} catch (e: Exception) {
}
}
})
}
复制代码
下面测试一下这个hook。我用我的微信给测试的微信号发一个“你好啊”
下图可以看到日志已经打印到logcat里了
所以这种方式也可以实时监控聊天记录。
如果我给测试的微信号发一个内容为“滚”的消息,那么测试的微信号肯定就拉黑我了!
三、Xposed修改免重启
修改Xposed代码的时候,每次都得重启设备,给测试工作带来了不少麻烦。
微信巫师中有一套免重启的方案,我拿来用了。文章最后会给出源码。
只要在源码的app主页,点击【重启微信】的按钮,就可以了。
源码下载地址:github.com/syxxjujing/…
下一篇文章计划分享利用群发助手,按照标签群发消息。
欢迎加QQ群:536941874 群里会实时分享技巧。包括一些简单实用的源码。我有时间也会回答大家的问题