Xposed快速入门例子(二)----- 调方法的合适时机

、前言

上篇文章已经介绍了如何用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 群里会实时分享技巧。包括一些简单实用的源码。我有时间也会回答大家的问题




你可能感兴趣的:(Xposed快速入门例子(二)----- 调方法的合适时机)