Android中應用是否可以接入微信SDK分享應用內的短視訊功能?

編碼美麗發表於2018-07-23
一、分析微信分享功能的流程

如果我們自己的應用突然有一天想接入微信分享功能,這個功能是可以把應用的短視訊分享到朋友圈或者好友,這樣使用者體驗好而且傳播速度也快,當然短視訊上一定要有水印,那有的同學會好奇怎麼不直接分享短視訊連結呢?這個大家都懂得,微信有時候很任性讓你沒法分享,所以今天就直接來看那種被微信遮蔽分享的能否直接分享本地短視訊呢?我們先看看微信分享功能是怎麼使用,這個直接去官網下載分享SDK包,然後呼叫指定的方法即可,我們看到這個類:

640?wx_fmt=png

看到視訊分享可以接受一個視訊連結,但是這個並不是我們想要的,因為這個不是分享應用本地視訊,不過通過測試,把這個videoUrl填寫成本地的視訊地址,也能分享成功,但是開啟還是一個頁面所以就會出現錯誤。所以這個類不是我們想要的,那麼我們就沒辦法繼續探究了嗎?真的不能分享應用本地短視訊嗎?我們可以這麼做,就是分析微信分享的整個流程了,這個比較簡單,直接檢視他的jar即可:

640?wx_fmt=png

我們在用Jadx開啟微信搜尋這個類:

640?wx_fmt=png

繼續看他的父類:

640?wx_fmt=png

這裡有一個intent檢測,我們也看到這裡有很多日誌資訊,因為通過後面的程式碼跟蹤我們發現很麻煩,所以我們這麼做通過放開微信的日誌資訊來快速的定位程式碼位置,這裡看到有一個日誌類:

640?wx_fmt=png

所以我們直接用Xposed攔截這些日誌方法,然後把引數資訊列印就可以了:

640?wx_fmt=png

然後我們執行Xposed模組,在去啟動微信分享看看日誌流程是什麼:

640?wx_fmt=png

我們看到這些資訊了,其實前面還有:

640?wx_fmt=png

再往前就是我們的分享入口類:

640?wx_fmt=png

而我們可以用 adb shell dumpsys activity top 檢視分享的當前頁面是啥:

640?wx_fmt=png

然後檢視日誌資訊也有這個類:

640?wx_fmt=png

所以微信分享其實是有幾個頁面Activity進行中轉了,而這個也是我們跟蹤的點,不要盲目的去跟蹤,我們只需要跟蹤頁面即可:

->WXEntryActivity

->UIEntryStub

->SendAppMessageWrapperUI

->SnsUploadUI 

我們要是想看分享頁面的資訊,可以從SendAppMessageWrapperUI這個頁面開始分析:

640?wx_fmt=png

不過看到這裡反編譯程式碼失敗了,這裡我們可以設定Jadx的一個選項就好了:

640?wx_fmt=png

儲存就可以看到程式碼了:

640?wx_fmt=png

然後開始分析會看到下面一個函式程式碼:

640?wx_fmt=png

看到這裡就是構造intent引數,然後啟動分享頁面了,看看構造intent引數結構:

640?wx_fmt=png

我們要想知道分享視訊到朋友圈需要哪些引數,可以攔截頁面列印Intent中的所有引數值:

640?wx_fmt=png

執行之後我們分享本地一個短視訊看看日誌資訊:

640?wx_fmt=png

看到了如果分享短視訊就是這麼幾個引數,其中:

  • Ksnsupload_type=14:固定值表示分享的是短視訊型別

  • sight_md5:短視訊檔案的MD5值

  • KSightPath:短視訊本地路徑

  • KSightThumbPath:短視訊的封面圖

然後在回到之前構造intent的分享引數地方之後發現,分享型別是38或者39都是走視訊邏輯,並且視訊路徑從分享物件WXFileObject的filePath欄位中獲取:

640?wx_fmt=png

而視訊的封面圖和MD5都是自己內部計算的,也就是說我們用微信分享理論上是可以支援的,在回到我們自己的分享程式碼中:

640?wx_fmt=png

這個時候看到微信分享SDK中的確有這個類可以用,那麼我們就構造一下,然後執行看看是否能分享成功:

640?wx_fmt=png

可惜的是分享失敗,通過微信內部日誌發現,分享檔案不支援:

640?wx_fmt=png

在回到微信SDK內部檢視WXFileObject這個類的type是多少:

640?wx_fmt=png

看到了這裡直接把type寫死是6了,也就是說雖然微信開放了這個類,但是這個類其實是用不了的,微信為了以後的功能擴充套件就把這個分享短視訊功能先做了,但是不給SDK用。那如果想用怎麼辦呢?可能有的同學第一想法是修改這個type值,但是這個方法直接返回常量,所以要想修改一個方法的返回值而且是直接返回常量的值,可以用繼承的方式修改,如果有變數的話可以用反射去修改,繼承修改原始類也是一個不錯的選擇:

640?wx_fmt=png

我們只需要自定義個類繼承WXFileObject這個類,然後重寫他的type方法,強制讓返回值是38或者39,從之前的分析來看只有type是這兩個值才會走分享視訊邏輯了。然後在用我們這個自定義類進行分享操作即可,執行看一下效果:

640?wx_fmt=png

這裡發現分享還是失敗,然後看到微信內部日誌有這個錯誤資訊:

640?wx_fmt=png

通過日誌看到在微信應用中沒有找到WXFileObjectWrapper這個類所以崩潰了,想一想的確找不到,因為這個類在我們應用中自定義的,而微信為了保證應用分享功能,內建就是這麼幾個類可以保證反射成功:

640?wx_fmt=png

而這個是微信SDK中提供的可以分享的物件型別:

640?wx_fmt=png

在構造分享物件Bundle的時候,會把應用中的所有引數資訊轉化成Bundle,然後通過啟動頁面傳遞到微信中,微信內部拿到這個Bundle之後開始構造指定物件。


二、微信分享流程

到這裡我們幾乎分析完了微信分享功能的邏輯實現了,大致總結一下其實很簡單,第三方應用整合微信分享SDK,然後開始構造SDK提供的幾種分享物件型別,比如連結分享,圖片分享等。然後SDK內部會把上層構造的分享引數放到一個Bundle中,然後用Intent啟動微信分享頁面入口WXEntryActivity,然後微信內部會通過解析Bundle來開始構造出分享物件,然後去進行後續的分享邏輯。而微信內部已經實現了本地短視訊分享功能,但是type是38和39,而微信SDK中提供的可以使用的分享物件型別type沒有這兩個值,微信是為了擴充套件以後分享型別所以就暫時沒有開放,而微信內部已經做了那部分功能,等時機成熟了會在SDK中開放的,而最後我們想著通過繼承類修改物件的型別type發現有一個問題就是我們自定義的型別微信中肯定是沒有的,微信在通過Bundle構造出分享物件的時候通過反射的,那麼我們自定義的物件在微信中肯定沒有,那麼構造就會失敗。所以從這一層面來看微信也是考慮了安全問題。


嚴重說明

本文的目的只有一個就是學習逆向分析技巧,如果有人利用本文技術進行非法操作帶來的後果都是操作者自己承擔,和本文以及本文作者沒有任何關係,本文涉及到的程式碼專案可以去編碼美麗小密圈自取,長按下方二維碼加入小密圈一起學習探討技術

640?wx_fmt=png


三、總結

其實本文的目的其實很簡單,通過分析微信分享SDK和微信程式碼來實現第三方應用的短視訊分享功能,可惜微信做了安全校驗,我們沒法欺騙過去,所以從上面分析可以知道我們是做不了這部分功能的,除非等微信SDK內部開發那塊功能。不過在整個過程中我們可以瞭解到一些,比如有時候跟蹤程式碼太過繁瑣除了列印堆疊資訊,一般應用內部都有一個統一的列印日誌類,我們可以hook那個類,把日誌列印出來跟蹤會更快高效一點。而本文其實只是開始,因為後面一篇文章來介紹如何把抖音短視訊分享到朋友圈,敬請期待!


手機檢視文章不方便,可以網頁看

http://www.520monkey.com


《Android應用安全防護和逆向分析》 

 點選檢視圖書詳情

640?wx_fmt=jpeg

長按下面

相關文章