Xposed快速入門例子(二)----- 調方法的合適時機

影月發表於2018-08-24

、前言

上篇文章已經介紹瞭如何用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,直接調拉黑的方法就可以了。

Xposed快速入門例子(二)----- 調方法的合適時機

上圖是我在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檔案是加密的,網上有很多解密的方法,請自行百度),通過分析找到了聊天記錄的表所在的地方。

Xposed快速入門例子(二)----- 調方法的合適時機

我們只要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修改免重啟

修改Xposed程式碼的時候,每次都得重啟裝置,給測試工作帶來了不少麻煩。

微信巫師中有一套免重啟的方案,我拿來用了。文章最後會給出原始碼。

只要在原始碼的app主頁,點選【重啟微信】的按鈕,就可以了。



原始碼下載地址:github.com/syxxjujing/…

下一篇文章計劃分享利用群發助手,按照標籤群發訊息。

歡迎加QQ群:536941874 群裡會實時分享技巧。包括一些簡單實用的原始碼。我有時間也會回答大家的問題


Xposed快速入門例子(二)----- 調方法的合適時機


相關文章