1. 程式人生 > >Android中Xposed框架篇-微信實現本地視訊釋出到朋友圈功能

Android中Xposed框架篇-微信實現本地視訊釋出到朋友圈功能

本文轉載自微信實現本地視訊釋出到朋友圈功能
前一篇文章已經詳細介紹瞭如何使用Xposed框架編寫搖色子和剪刀石頭布作弊器,本文繼續介紹如何使用Xposed框架編寫微信外掛將本地小視訊釋出到朋友圈,這裡還是使用微信6.3.9版本進行操作。
微信6.3.9.apk
在之前的基礎之上,本次操作就應該非常簡單了,還記得之前的突破口是啥嗎?看過文章的同學應該知道是通過分析介面的控制元件來獲取id值,然後全域性搜尋。本文采用另外一種方式,下面來詳細介紹一下。微信正常情況下發布小視訊到朋友圈,會跳轉到這個釋出頁面。
這裡寫圖片描述
這個頁面有標題,小視訊,地理位置等資訊,而這些資訊應該會在請求釋出的時候攜帶到伺服器上,有點類似於檔案上傳功能。這個頁面是一個activity頁面,可能是從其他頁面跳轉過來的,同時會把這些元素資訊通過intent攜帶過來,而小視訊是個檔案,所以應該會攜帶檔案的名稱。有了這些猜想之後就可以開始操作了,首先得到這個頁面的activity名稱。
這裡寫圖片描述


看到這個頁面的名稱是SightUploadUI,藉助Jadx反編譯微信之後,找到這個類。
這裡寫圖片描述
直接看onCreate方法中有沒有對intent引數解析操作,或者可以在這個類中全域性搜一下getIntent欄位,也可以快速得到解析的地方。
這裡寫圖片描述
看到第一個欄位Kdescription,從欄位的名稱來看應該是描述資訊,而從下面的程式碼setText呼叫更可以確認了這個就是標題資訊。我們繼續查詢。
這裡寫圖片描述
又發現了一個欄位KSightDraftEntrance,這塊程式碼就有點多了,這是一個boolean型別,所以先不管了,因為後面即使是嘗試的話也就兩次操作,一次false一次true。可是到這裡再也搜不到其它欄位了,沒有找到最重要的視訊檔案路徑。這時就要想起在onCreate方法中有一個ae類初始化的時候把當前activity傳遞進去了,那麼可能它內部繼續進行了引數解析,進去檢視一下。
這裡寫圖片描述

果然在它內部還有三個欄位解析,分別是KSightThumbPath,KSightPath,sight_md5,從命名上猜想這些應該就是和視訊資訊相關的欄位了:KSightPath欄位是短視訊路徑,KSightThumbPath是短視訊的預設封面圖,sight_md5是短視訊的校驗值。得到了這五個引數,可以直接嘗試操作。在本地存放一個短視訊和封面圖片,然後計算短視訊的MD5,最後通過intent來啟動這個頁面即可。不管後面的上傳過程,先試驗能不能成功跳轉到這個頁面展示本地小視訊。這裡有一個問題,怎麼獲取這個啟動頁面的activity呢?有的同學可能這麼幹,直接編寫一個程式然後用它的activity啟動這個頁面。這個猜想理論上是可行的,不過我沒嘗試,因為我想微信肯定做了activity啟動安全防護,不可能在其它應用中啟動微信中的任意一個頁面。可以開啟一個聊天頁面,繼續使用adb shell dumpsys activity top命令檢視。
這裡寫圖片描述

知道了LauncherUI頁面下面怎麼獲取這個物件呢?這就需要藉助Xposed框架進行Hook了。
這裡寫圖片描述
我們Hook頁面的onResume方法,這是Activity生命週期中的比較晚的一個方法,所以攔截它就可以了。再攔截MethodHookParam的thisObject屬性就可以得到這個方法所屬的物件了,也就是LauncherUI型別。下面就簡單了,構造上面的五個引數得到intent直接啟動。
這裡寫圖片描述
這裡我們沒有做MD5操作,先看看不做會不會有問題。直接執行模組,然後重啟裝置生效,開啟微信介面瞬間看到效果了。
這裡寫圖片描述
果然跳轉到這個頁面了,下面點擊發送,會發現傳送失敗。
這裡寫圖片描述
微信小視訊長度不能超過15s,大小不能超過1M。這裡本地視訊是符合這兩個標準的,那麼就有應該是MD5校驗出問題了。獲取檔案的MD5碼這裡就不多解釋了,不過MD5弄成檔案的還是失敗。估計這裡不是真正意義上的MD5,可能加上了自己的演算法。全域性搜尋sight_md5。
這裡寫圖片描述
進入檢視方法。
這裡寫圖片描述
查詢這個方法在哪被呼叫。
這裡寫圖片描述
點選進入檢視。
這裡寫圖片描述
倒數第二個引數就是那個MD5碼值,全域性搜一下這個變數是在哪裡被使用的。
這裡寫圖片描述
看到這裡有賦值的地方,點選進入檢視。
這裡寫圖片描述
然後檢視這個kbVar變數,在上面的程式碼中。
這裡寫圖片描述
這裡可以先看看這個kb類的定義。
這裡寫圖片描述
aFL就是MD5碼值了,因為a這個方法可能是抽象的,所以得找到抽象定義的地方,在上面就是一個抽象類c。
這裡寫圖片描述
然後進入c類檢視抽象方法a。
這裡寫圖片描述
然後查詢a方法呼叫的地方。
這裡寫圖片描述
繼續檢視這個方法呼叫的地方。
這裡寫圖片描述
這時候我們多看一下,這個方法所屬的類是個單例。
這裡寫圖片描述
繼續檢視這個g方法被呼叫的地方,或者全域性搜一下jJA這個變數的使用。
這裡寫圖片描述
又回到MainSightContainerView類,這裡看到賦值的地方了,而且是給aFL欄位賦值的,這個就是上面看到kb類中的欄位值,這裡依然呼叫了一個方法計算MD5碼值,而且傳入的引數是視訊路徑。
這裡寫圖片描述
這裡首先判斷當前視訊檔案是否存在,然後再進行檔案操作。
這裡寫圖片描述
真正加密演算法是在a方法中,因為計算檔案的MD5碼比較耗時,所以這裡做了一個優化,只會計算檔案的前100KB資料。
這裡寫圖片描述
到這裡終於真相大白了,看到的確是用了MD5演算法,只是在後面又加了一個簡單的演算法。這裡為了簡單,可以直接把這幾個方法拷貝到Xposed模組程式碼中,然後把之前的intent中的sight_md5欄位值替換一下。
這裡寫圖片描述
到這裡可以看到,傳送成功了,終於實現了這個功能。
微信非常龐大,還好有一些強大的工具,下面就來總結收穫的知識。
一、使用adb shell dumpsys activity top命令快速定位頁面
二、使用Jadx進行方法跟蹤時候如果發現沒有結果,可能這個方法是抽象的,需要找到這個抽象方法最原始的定義的地方繼續跟蹤
專案在github:https://github.com/houjingyi233/WechatUploadVideo
宣告:本文介紹的知識點完全是從一個技術分享角度出發,絕非用於任何商業活動和用途,如果涉及到任何法律問題將由操作者本人負責。本文作者將不負任何法律責任!也請各位同學秉著技術角度出發的原則,切勿用於商業中!