Android逆向之旅---靜態方式分析破解視訊編輯應用「Vue」水印問題

編碼美麗發表於2018-05-03
一、故事背景

現在很多人都喜歡玩文藝,特別是我身邊的UI們,拍照一分鐘修圖半小時。就是為了能夠在朋友圈顯得逼格高,不過的確是挺好看的,修圖的軟體太多了就不多說了,而且一般都沒有水印啥的。相比較短視訊有一個比較有逼格的編輯工具「Vue」個人已經用了很長時間,拍出來的視訊藉助強大濾鏡真的很好看,顯得逼格也高,更重要的是有我最喜歡的功能就是可以新增視訊背景音樂,選擇自己喜歡的音樂,然後還可以編輯這段背景音樂,反正我個人覺的這個是我最喜歡用的產品了。但是好用的東西必定有它不好的地方,因為他真的很強大所以應用就把視訊加上了水印,為了更好的宣傳作用。為了更好的感覺這款應用的魅力之處,先看看原始視訊:

原始視訊 大約消耗"1.19M"流量


然後下面在來體驗一下我用Vue編輯之後的視訊內容:

水印視訊 大約消耗"1.19M"流量


個人覺得差距還是很大的,這樣的視訊發到朋友圈顯得逼格也高哈哈,可惜看到右下角那麼大的水印很難忍受,下面就來開始搞掉它!


其實有很多視訊都是有水印的,比如抖音視訊,不過這裡順便說一下抖音視訊其實傳到伺服器上是沒有水印的,而在我們儲存到本地的時候有水印的。因為開發過視訊的人都知道,一般是藉助ffmpeg庫新增水印,水印一般都是一張圖片。如果抖音後臺把視訊加上水印一方面是設計版權問題,因為現在很多原創作者一個作品視訊會在很多平臺發放,那麼同樣的視訊有抖音水印,西瓜水印,快手水印等。再者就是新增水印是有點消耗效能的,抖音現在每天上傳視訊數量巨大,每個視訊都新增水印伺服器壓力會很大的。介於這兩點抖音沒有選擇給伺服器後臺的視訊新增水印,只有使用者儲存到本地的時候把水印在本地新增,所以網上很多人都想去除抖音水印,其實很簡單直接抓包然後獲取視訊原始地址就可以了。不瞭解抖音的資料協議,可以看這篇文章:Android中分析某音視訊協議資料


二、逆向分析應用

說的有點遠了,接著回來看看我們這款應用給的水印問題,其實這個應用沒有視訊上傳功能,就是把本地視訊編輯加上濾鏡和背景音樂然後在儲存到本地,而儲存的過程中就把水印給新增上了,所以我們的目的去除水印,那麼就在這個過程做手腳就可以了。關於視訊新增水印的功能網上很多資料,大部分都是藉助ffmpeg的庫進行操作。先來看看這個應用新增的水印效果吧:

640?wx_fmt=png

然後我們看看應用的使用過程:

640?wx_fmt=png

他是通過分段拍攝處理然後合併的操作,直接跳到後面看看儲存的地方:

640?wx_fmt=png

看到這裡就在儲存視訊了,那麼新增水印的地方就很有可能在這個地方了,我們藉助UI工具直接提取這個進度條的id作為突破口資訊:

640?wx_fmt=png

看到了控制元件的resid值,然後去jadx中直接搜尋R.id.video_view,以後大家都這麼搜,如果搜不到在去public.xml中轉化成十進位制然後搜尋,這裡的應用就兩個dex不是很大,但是資源很多,大家可以用壓縮工具開啟apk把res資料夾刪了,因為Jadx卡需要解析res下的資源。這裡我們不檢視res下的東東就直接刪除,然後直接開啟apk即可,這樣也不用多開jadx開啟多個dex了:

640?wx_fmt=png

找到之後點選進入檢視詳情:

640?wx_fmt=png

果然看到用到了最常用的TextureVideoView這個是用來處理視訊濾鏡效果結合ffmpeg的常用手法,不過我們關心的是進度,因為儲存肯定有進度的。網上看到自定義了一個矩形動畫進度控制元件,點進去看看:

640?wx_fmt=png

的確檢視到了他有一個更新進度的方法,然後右鍵檢視這個方法的呼叫地方:

640?wx_fmt=png

點進去檢視詳情即可:

640?wx_fmt=png

看到這裡是a.n.a方法通過回撥來更新進度的,不過這裡有個問題就是這個a方法點選跳轉失敗的,這個之前說過了,因為Jadx可能解析類失敗,所以我們需要手動去找這個方法,檢視n型別:

640?wx_fmt=png

有了包名類名就好辦了,直接去檢視這個類資訊:

640?wx_fmt=png

找到了a方法,看到這裡感覺遊戲了,儲存本地視訊的檔案有了,繼續往下跟進:

640?wx_fmt=png

這裡有斷片了,方法點選失敗,而且發現多層呼叫按照包名變數查詢太費勁了,直接檢視smali程式碼比較直接,這裡記住這個小技巧,當在Jadx中檢視一個方法失敗可以去檢視smali程式碼:

640?wx_fmt=png

最後呼叫的是h類的a方法,再去Jadx中找這個h類:

640?wx_fmt=png

到這裡,就開始豁然開朗了因為我們已經找到最關鍵的地方了,就是這個執行ffmpeg命令的方法,因為我之前做過視訊應用,用ffmpeg做過濾鏡效果。所以看到這種程式碼瞬間就眼前一亮。不過你沒做過也沒關係,這裡可以直接hook操作了:

640?wx_fmt=png

直接攔截方法,列印引數看結果即可,這裡順便就把我去除水印的幾個方法介紹一下吧:

640?wx_fmt=png

首先我想到的第一個方案是:過濾新增水印的命令引數,因為新增水印的命令網上很多:

640?wx_fmt=png

那麼我就把相關的四個命令給刪除了。所以看到我上面的處理命令程式碼比較簡單自己看就好了。不過可惜的是這個方案我執行失敗了,我猜想可能是哪個-filter_complex還有其他用途不能直接刪除,但是這個命令的引數值太複雜了看得我頭疼,所以放棄用了第二個方案:就是在-filter_complex命令引數中修改水印圖片的位置,讓其超過手機螢幕,這樣就看不到水印了,這個方案肯定靠譜的,我們執行這個Xposed模組,然後看看日誌:

640?wx_fmt=png

看到命令被列印出來了,而且看到了預設的水印圖片,這個圖片地址一定要記住,後面會給出一個更加巧妙的破解方案就是要用到這個地址。看到水印的xy座標值,我們直接修改:

640?wx_fmt=png

然後在操作Vue錄製視訊,發現視訊的確沒有水印效果了,這裡不方便上次視訊,大家可以自己操作看效果就好了。


三、解決方案

那麼到這裡我們大致就搞清楚了這個應用新增水印的流程和技術,主要就是藉助ffmpeg庫利用命令進行新增水印,我們去除水印的方式比較粗暴就是直接修改水印圖片的位置。但是到這裡就結束了嗎?肯定不是,因為我們想讓每個人都能用到無水印效果的Vue,所以得弄出一個成品apk檔案。那麼這裡有很多思路:

第一個思路:修改smali程式碼,修改xy值,然後回編譯。這個的確是個思路但是我覺得修改smali程式碼有點費勁。

第二個思路:弄一個空白的水印圖片,放在手機的sd卡,然後修改smali程式碼,替換預設的水印圖片地址,這個思路靠譜但是還是需要修改smali程式碼不方便。

第三個思路:從上面的命令看到那個預設的水印圖片存在sd卡的目錄,可以直接用空白圖片替換這個有水印的圖片,這個思路可以,不過可惜的是不可信,因為我們去檢視這個目錄:

640?wx_fmt=png

我操作了三次,就產生三張圖片,也就說這裡每次編輯視訊都會從一個地方弄個水印圖片後面的數字是變化的,所以這種方案我們沒法提前預知圖片名字無法完成提前替換。

第四個思路:這個是在第三個思路基礎上想到的,也是最終方案。我們從第三個思路中可以看到這個水印圖片肯定不是本地用程式碼生成的,從網上下載下來的可能性也很低,因為是同樣的圖片,而且沒必要從網上獲取,所以想了一下發現這圖片肯定在本地apk中,那麼不多猜想直接解壓apk去res下查詢:

640?wx_fmt=png

皇天不負有心人總算被我找到了,也驗證了我的猜想,我們對比這個和sd卡中的預設水印圖片:

640?wx_fmt=png

完全一樣,肉眼沒法辨別了。好了到這裡我們就開始大膽嘗試吧,弄個空白圖片,直接替換res下的水印圖片,這樣應用內部在使用多個地方使用水印圖片都是我們替換之後的空白圖片,這個思路還是很巧妙的。


四、二次打包

下面就怎麼生成一個空白圖片呢?這個不難,誰叫我們會PS呢?開啟PS軟體,通過上面檢視那個res圖片的大小尺寸是132*40的:

640?wx_fmt=png

記得一定要選擇透明的,尺寸也是注意是畫素單位,然後確定就好了:

640?wx_fmt=png

然後儲存為png格式即可。直接替換原來的水印圖片:

640?wx_fmt=png

這裡就替換成功了,開始回編譯吧,可惜的是回編譯失敗。一般現在很多都會回編譯失敗問題,這類問題我一般都是避免,因為解決的話沒個頭了。那麼我們怎麼不反編譯就能替換這個檔案呢?有的同學會想到直接用解壓工具解壓apk,然後替換會壓縮修改字尾名apk即可。這個你們可以去嘗試一下會發現壓縮成apk是有問題的,因為路徑問題沒法這麼做的,那麼我們該怎麼辦呢?這個就要藉助我的逆向大黃書「Android應用安全防護和逆向分析」的第三章中介紹的aapt命令用法了,還沒有購買的同學趕緊點選「閱讀原文」購買吧。aapt命令可以用來操作apk檔案的,比如檢視apk的xml檔案,新增刪除一個檔案到apk中。用aapt命令新增無需解壓apk檔案的,比如這裡我們替換這個檔案,可以先刪除這個檔案,命令如下:

aapt remove -v vue.apk res\drawable-xxhdpi-v4\stamp_logo.png

這樣就把原始的水印圖片刪除了,然後在用命令新增我們的空白水印圖片,命令如下:

aapt add -v vue.apk res/drawable-xxhdpi-v4/stamp_logo.png 

這裡有個小小的坑,就是這個命令執行的路徑一定要包含res/drawable-xxhdpi-v4/stamp_logo.png檔案,而命令中的這個路徑是不能變化的,不然新增是失敗的。


就這樣我們用aapt命令巧妙的替換了水印圖片,當然要二次簽名了,因為我們替換檔案了。二次簽名簡單不多解釋了,這樣我們就安裝弄好之後的應用,執行都是成功的,這個有點出乎我的意料,應用沒做簽名校驗防止二次打包嗎?正當我懷疑的時候,發現問題了,視訊濾鏡失效了,所以這個應用還是做了檢測了。不過沒關係,這時候第一眼就要想到我寫的爆破工具kstools,不瞭解這個工具的同學可以檢視這裡:Android中爆破簽名校驗問題工具kstools原理解析,這裡要注意得先用工具獲取正確的原始簽名,不然還是失敗的,好了這裡在繼續操作安裝吧,這下就可以愉快的操作無水印的高逼格視訊編輯工作了。到這裡我們就把所有的流程都說完了,內容還是很多的,下面來總結一下本文獲取的知識點:

  • 第一、瞭解了視訊新增水印一般都採用ffmpeg庫的命令方式新增一張水印圖片

  • 第二、使用ps工具生成一張空白的png圖片

  • 第三、使用aapt命令實現apk包檔案的原始操作

而且這個ffmpeg庫非常強大,還可以去除水印,不過去除之後很難看,但是可以讓原始的水印看不清了,現在也有這樣的需求。感興趣的同學可以去檢視這個命令如何去除水印效果吧。下面來看看去除水印之後的視訊:

無水印視訊 大約消耗"1.19M"流量


嚴重說明

本文涉及的樣本和修改之後的apk包擔心被人二次利用,所以不方便全網公開,如果感興趣的同學可以去小密圈獲取,只作為學習研究目的,如果有人非法操作帶來的任何法律問題都是自己負責。和本文以及本文作者無關!點選立即進入小密圈


五、總結

本文通過逆向分析一個視訊編輯的應用學習到了很多知識點最大的收穫就是視訊庫ffmpeg的瞭解和使用,不管對於後續開發還是破解都會有很大的作用!


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

http://www.520monkey.com



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

360創始人周鴻禕、CSDN創始人蔣濤、看雪創始人段鋼聯袂推薦! 點選檢視圖書詳情

640?wx_fmt=jpeg

長按下面

相關文章