微信即刻視頻下載器插件開發過程原理詳解

一、前言分析

微信在7.0版本發佈之後,我們可以看到有很大的改變,首先是UI上的變化,其次就是即刻視頻,因爲2018年是短視頻火爆的一年,有抖音的強悍吸粉,連微信也開始擔心社交地位以及用戶的時間被強佔,所以在各種屏蔽之後無果,開始嘗試自己的一個社交+短視頻的方式,這就是我們看到的即刻視頻,我們用過即刻視頻都知道,視頻現在只支持觀看卻不支持下載,但是有時候我們看到好友發佈了一個搞笑的視頻卻不能保存到本地也是挺難受的,所以這裏我們就開發一款插件可以支持下載。

二、逆向分析

下面就開始我們的分析,當然本文以及以後的插件開發我們都將用一種全新的分析方式找到hook點,這也是本文的一個新知識點和技能,大家不要關心插件的結果,看中的是文章的過程學習技術。

這裏可以看到我們story發佈頁面其實還是很簡單的,可以添加表情文字,配樂以及位置信息,當然我們後續還有一些插件比如可以添加本地自己喜歡的配樂,然後就開始發佈:

我們長按視頻發現只有刪除選項,但是有時候我們看到其他人的視頻我們想下載怎麼辦呢?到這裏就是我們的訴求了,我們本文的目的就是添加一個下載插件,首先我們用UI工具獲取當前頁面的元素信息:

看到我們找到這個刪除的選項了,看到id是ki,這時候我們會反編譯微信之後,以往的操作是去public.xml中查找這個id,然後去Jadx打開微信進行查找代碼,但是現在不這麼做了,因爲我們發現微信在後續的版本的dex非常大,用Jadx打開非常卡,所以我們需要分開dex進行打開操作,但是dex太多打開也很費勁,所以我們這裏直接藉助find命令進行操作,當然Windows中的是findstr命令。

首先我們還是去values/public.xml中找到這個id值,然後進行全局搜索:

看到這個16進制的值,進行搜索即可:

這裏的命令非常重要,後續我們都會用這個命令:find . |xargs grep -ri "搜索內容" 這樣我們就把這個id找到了對應的smali代碼中了,不過這裏還是有很多個,不過我們看到每個搜索結果前綴都可以看到dex,這樣就沒必要每個dex打開挨個搜索了,這樣我們就可以直接到指定的dex中找了,不過這裏發現好像很多而且沒有我們想要的,這時候就需要對即可視頻的瞭解了,其實這類的社交發送視頻的可能都有一個關鍵字就是:story,比如Instagram的快拍功能也是叫做Story功能。這時候我們在用grep進行過濾一下:

這樣我們就定位到應該是第8個dex文件中了,這時候打開即可,不過這裏不打開了,因爲到這裏其實對於我們這次操作沒多大作用,但是爲什麼要說這個呢?因爲後面的查找技術都是基於這個find命令的,所以以後大家不要在挨個打開dex文件查找了,效率很低,下面繼續來說本文的第二個技術點就是快速的找到我們想要的東西。

我們知道應用爲了開發調試方便,可能會在代碼中添加日誌信息,但是因爲一些特殊原因可能日誌有一個開關,可以控制debug包可以查看日誌,release不可以,不過有的公司爲了安全會用腳本把代碼中所有的系統打印日誌代碼全部幹掉,因爲日誌信息可以很快的定位到我們想要的東西,我們可以隨便打開微信的一個dex文件,查看他的日誌封裝類:

看到微信的日誌類是ab,因爲這個日誌應該有很多打印的方法,所以需要找到這個類的定義地方,這時候我們就可以用上面的find命令進行查找了:

注意:因爲find搜索之後會有很多信息,而我們其實就是想找到這個類,所以最好在做一層過濾,一般都是類名.smali即可,這樣很快就定位到指定的dex文件了,這個方法在後面非常常用。

我們這裏直接搜索這個類,當然應該搜索結果很多,可以再加一層過濾,就是類的後綴名即可,這樣就很快的定位到這個類是在第一個dex中,直接用Jadx打開即可:

這裏我們直接hook這些類,然後把參數打印出來就可以通過日誌定位我們想要的東西了:

不過到現在我們還沒有說我們想要啥呢?首先我們要是下載這個視頻,肯定需要這個視頻的地址,然後就是添加一個下載點擊的入口:

我們打開一個即可視頻就發現了,這裏的日誌輸出發現了一個storyitem的信息,裏面的確包括了下載地址,可以選擇多個即可視頻來回切換就發吸納了這個選中的日誌信息,然後繼續去搜索這個日誌信息:

日誌可能有點多不過沒關係,這個我們可能需要通過判斷,因爲是字符串信息,所以查找就比較方便,這樣我們就看到大致是在第10個dex中,然後找到這個類:

當我們每次選擇一個即可視頻的時候都有這個日誌,而且看到item關鍵字,通過日誌我們發現,我們需要獲取那個qTS變量,但是看到前面有很多的方法調用,我們可以依次查找變量的調用地方也可以,我們查看rhg變量類型:

因爲多個即可視頻是可以左右滑動切換的,這裏看到是用了RecyclerView實現的,所以通過上面的那個一連串的調用可以發現qTS變量應該保存在itemView中的,而且看到下面的一行代碼發現:

StoryGalleryItemView可以直接設置Video的信息,所以猜想在這個View中應該保留了視頻的item信息,當然如果做過Android應用開發,這個也是很容易想到的,這樣就簡單了,我們查看這個類,當然我們發現這個類不在這個dex中,但是有沒發現import這個類,那說明這個類是和l這個類在同一個包下面的,那直接搜索即可:

這裏發現這個類是在第6個dex中:

這裏我們看到的qTS變量了,繼續搜索這個類型:

這裏搜到這個類是在第8個dex中:

這裏看到toString方法的打印信息,我們想要的url信息就是qTY.Url中,那麼到這裏我們就獲取到的即刻視頻的url信息了,這時候只需要hook加上反射即刻:

運行這個模塊,然後選擇一個即可視頻查看日誌信息:

有了下載地址還是不夠的,我們還需要一個下載的入口,我們通過查看別人的即刻視頻發現,沒有多餘的操作入口,所以這時候我們要是去添加可能比較麻煩,當然有的同學第一個想法就是我們在上面不是拿到了RecyclerView和ItemView的嗎?那麼我們現在只要給這個View添加點擊事件不就好了嗎?的確這個思路沒毛病,不過我測試了發現這個點擊事件不會走,猜想他可能做了點擊觸摸事件的處理,這時候沒關係,我們繼續通過日誌找入口,比如這裏我們點擊一下即可視頻頁面,發現了這些日誌:

其中最重要的就是downX,dispatchTouchEvent信息,這個做過應用開發都知道點擊事件應該是他們內部做處理了,我們查看這個日誌在哪裏即可:

通過查看發現很多信息,但是在其中看見了l這個類信息,進入查看看到這個方法了,看到有點擊的x,y座標信息,那麼如何在這個方法中做點擊事件呢?這個做過應用開發處理Touch和Click事件衝突的同學都知道,可以在Touch方法中做到點擊事件的,就是通過判斷down和up的時間間隔不要超過一定時間一般是200ms就認爲是點擊事件:

然後我們運行打印日誌信息查看:

這裏看到的確走到了點擊事件,那麼接下來也簡單了,我們在點擊之後就彈出一個下載的對話框吧,展示對話框我們知道需要依賴於當前頁面的Activity,這個很簡單,我們dump出當前頁面的activity信息,然後hook他的onResume方法獲取全局變量即可:

直接hook頁面的onResume方法:

有了變量之後展示對話框就簡單了:

然後在對話框中添加一個點擊事件即可,因爲有了視頻的地址,那麼下載就簡單多了:

到這裏我們就成功的把插件完成了,看到本文和之前的寫插件的分析過程是不是不太一樣,的確這個以後都會採用這種高效的方式。

三、技術總結

1、本文不在按照之前的那種逐個打開dex文件挨個搜索了,而是採用高效的有目的的定位搜索方法,當然我們知道微信的dex文件很多,如果應用的dex文件很多的話,可以採用這種搜索方式非常高效。

2、我們知道之前也說過app逆向的入口也就那麼幾個,查看頁面元素信息,抓包查看URL,查看日誌信息,而一般大型app都會對日誌進行封裝一層,而且通過本文發現,通過日誌定位逆向入口是非常便捷的,只需要找到日誌的封裝類,然後hook之後打印參數即可,不費吹灰之力即可找到入口信息。

3、藉助Mac的find命令,代替以往的Jadx打開多個dex文件依次查找的低效率方式,看到本文就發現了幾乎都是靠這個命令進行定向查找指定類代碼信息,當然這個也是被逼無奈,因爲微信7.0之後的dex文件特別多,逐個查找太費勁了,而且我的電腦直接打開Jadx打開微信幾乎都是卡死的。所以無奈想到這種方式。其實發現還是非常好用的,而且後面的插件都採用這種方式處理。

本文的目的只有一個就是學習更多的逆向技巧和思路,如果有人利用本文技術去進行非法商業獲取利益帶來的法律責任都是操作者自己承擔,和本文以及作者沒關係,本文涉及到的代碼項目可以去編碼美麗小密圈自取,歡迎加入小密圈一起學習探討技術

四、總結

到這裏我們就把即可視頻的下載插件開發完了,當然這個不是結束而只是開始,後續我們會繼續開發很多個插件,當然在說明一點就是開發插件不要在乎結果,大家一定要看過程,我想傳播的是逆向技巧而不是一個單純的插件。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章