wx朋友圈Hook(一)

2020-10-03 12:01:12

一、定位到關鍵程式碼

第一次嘗試

首先想到使用adb shell dumpsys activity top程式碼

在這裡插入圖片描述

獲取朋友圈介面的Activity,com.tencent.mm/.plugin.sns.ui.SnsUploadUI,直接反編譯微信得到原始碼

第二次嘗試

然後發現程式碼實在太多,很難瀏覽,然後想到DDMS的軌跡追蹤功能,我們錄取一個發表朋友圈的軌跡,查詢OnClick方法,果然找到一個OnMenuItemClick

在這裡插入圖片描述

直接搜尋這個方法

在這裡插入圖片描述
無奈程式碼還是太多,感覺很難繼續分析下去

第三次嘗試

這裡考慮到使用DDMS的Dump View Hierarchy for UlAutomator功能,首先微信進入傳送朋友圈的介面,然後dump

在這裡插入圖片描述

最後找到「測試測試」對應的id,然後通過搜尋findViewById,得到了關鍵的程式碼

在這裡插入圖片描述

分析znn的呼叫情況

在這裡插入圖片描述

沒有發現函數的呼叫,但是發現了一個賦值,那就搜尋一下this.desc

在這裡插入圖片描述

果然找到一個賦值,但是當我們開始分析zno的a方法時,發現他只是一個介面

在這裡插入圖片描述

既然如此,那就只能考慮搜尋zno類的賦值了,全域性搜尋一下,檢視每一個賦值操作

在這裡插入圖片描述

終於找到關鍵的類QA

QA這裡先對傳入的引數進行了判斷,然後返回對應的類範例

在這裡插入圖片描述

this.ziU=0時:

阿

this.ziU=14時:

在這裡插入圖片描述

這裡應該已經可以猜測這個引數和朋友圈傳送的方式有關係了,繼續分析ziU的值

在這裡插入圖片描述

使用frida指令碼列印一下各種情況的this.ziU引數

import frida
import sys
jscode ='''
Java.perform(function(){
    var SnsUploadUI = Java.use('com.tencent.mm.plugin.sns.ui.SnsUploadUI');
    var ao = SnsUploadUI.ao.overload("android.os.Bundle");//過載
    ao.implementation = function(bundle)
    {
    var ret = ao.call(this, bundle);//呼叫方法獲取返回值
    send("sns type = " + this.ziU.value);//列印ziU的值
    return ret;
    }
}
);
'''
def message(message,data):
    if message["type"] == 'send':
        print("[*] {0}".format(message["payload"]))
    else:
        print(message)

process = frida.get_remote_device().attach("com.tencent.mm")
script = process.create_script(jscode)
script.on("message",message)
script.load()
sys.stdin.read()

最後總結如下:

9:純文字動態
,0:純圖片、圖片+文字動態
,14:純視訊、視訊+文字動態

由於微信不支援視訊加圖片,所以沒有進行這個測試