1. 程式人生 > >Android逆向之旅---靜態方式分析破解視頻編輯應用「Vue」水印問題

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

https http mpeg 朋友圈 無需 爆破 資料 不可 fill

一、故事背景

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

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

二、逆向分析應用

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

技術分享圖片

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

技術分享圖片

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

技術分享圖片

看到這裏就在保存視頻了,那麽添加水印的地方就很有可能在這個地方了,我們借助UI工具直接提取這個進度條的id作為突破口信息:

技術分享圖片

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

技術分享圖片

找到之後點擊進入查看詳情:

技術分享圖片

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

技術分享圖片

的確查看到了他有一個更新進度的方法,然後右鍵查看這個方法的調用地方:

技術分享圖片

點進去查看詳情即可:

技術分享圖片

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

技術分享圖片

有了包名類名就好辦了,直接去查看這個類信息:

技術分享圖片

找到了a方法,看到這裏感覺遊戲了,保存本地視頻的文件有了,繼續往下跟進:

技術分享圖片

這裏有斷片了,方法點擊失敗,而且發現多層調用按照包名變量查找太費勁了,直接查看smali代碼比較直接,這裏記住這個小技巧,當在Jadx中查看一個方法失敗可以去查看smali代碼:

技術分享圖片

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

技術分享圖片

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

技術分享圖片

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

技術分享圖片

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

技術分享圖片

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

技術分享圖片

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

技術分享圖片

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

三、解決方案

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

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

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

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

技術分享圖片

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

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

技術分享圖片

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

技術分享圖片

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

四、二次打包

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

技術分享圖片

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

技術分享圖片

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

技術分享圖片

這裏就替換成功了,開始回編譯吧,可惜的是回編譯失敗。一般現在很多都會回編譯失敗問題,這類問題我一般都是避免,因為解決的話沒個頭了。那麽我們怎麽不反編譯就能替換這個文件呢?有的同學會想到直接用解壓工具解壓apk,然後替換會壓縮修改後綴名apk即可。這個你們可以去嘗試一下會發現壓縮成apk是有問題的,因為路徑問題沒法這麽做的,那麽我們該怎麽辦呢?這個就要借助我的逆向大黃書「Android應用安全防護和逆向分析」的第三章中介紹的aapt命令用法了,還沒有購買的同學趕緊入手吧。aapt命令可以用來操作apk文件的,比如查看apk的xml文件,添加刪除一個文件到apk中。用aapt命令添加無需解壓apk文件的,比如這裏我們替換這個文件,可以先刪除這個文件,命令如下:aapt remove -v vue.apk res\drawable- www.120xh.cn xxhdpi-v4\ www.taohuayuan178.com stamp_logo.png;這樣就把原始的水印圖片刪除了,然後在用命令添加我們的空白水印圖片:aapt add -v vue.apk res/drawable-xxhdpi-v4/stamp_logo. www.jypt178.cn png 這裏有個小小的坑,就是這個命令執行的路徑一定要包含res/drawable-xxhdpi-v4/stamp_logo.png文件,而命令中的這個路徑是不能變化的,不然添加是失敗的。

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

  • 第一、了解了視頻添加水印一般都采用ffmpeg庫的命令方式添加一張水印圖片
  • 第二、使用ps造一個空白png圖片
  • 第三、使用aapt命令實現apk包文件的原始操作

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