簡介
前段時間偶然發現一個直播軟體,裡面的內容嘛,很刺激,就是那種你們懂得。但是好看的全部都提示我需要鑽石觀看,作為一個優秀的好青年,怎麼捨得用自己辛辛苦苦賺的錢去看這種東西,剛好對逆向還是懂些皮毛,於是,便開始了下面的內容,由於該軟體比較,想要測試的夥伴,可以私信我哦
準備工作
熟悉逆向的小夥伴應該都知道,要破解它首先需要反編譯了,看看原始碼,才有下手的方向。這時候就不得不介紹一下,反編譯的三個好夥伴了。
1.dex2jar 這個是用來把java編譯後的dex檔案重新轉化為jar檔案,這兒普及一下,dex檔案就是能夠被DVM或者Art虛擬機器執行的檔案,記錄了所有類檔案的資訊。說白了就是用這個來提取你能看得懂的java程式碼
下載地址:sourceforge.net/projects/de…
2.jd-gui 這個就是用來開啟上面的jar檔案的工具
下載地址:www.softpedia.com/get/Program…
3.apktool 抄一下百度,GOOGLE提供的APK編譯工具,能夠反編譯及回編譯apk,(很重要)
下載地址: ibotpeaches.github.io/Apktool/
下載好這三個就可以開始逆向之旅了
提取jar檔案
1.把需要破解的apk檔案重新命名,字尾修改為zip,並解壓出來
把dex檔案轉為jar檔案
1.將三個檔案拷貝到dex2jar目錄下
2.用d2j-dex2jar.bat 檔案,將dex轉為jar(在當前目錄開啟cmd視窗 shift + 滑鼠右鍵)然後執行命令:d2j-dex2jar.bat classes.dex
如下所示
執行完成之後會生成如下jar檔案,至於error.zip,這是錯誤日誌說明反編譯的時候某些地方報錯了,只要不影響到裡面程式碼的主體結構,可以暫時不要管
同時別忘了將另外兩個dex檔案也轉換出來
分析原始碼
得到三個jar檔案之後使用jd-jui.exe開啟三個jar檔案,我這兒就只開啟前兩個檔案了,因為我在分析的時候發現第三個檔案對我們分析用處不大,就不管它了。
上面可以看出,有很多個包,其實很多都是引用的系統程式碼,或者就是第三方架包,我們需要定位到該app的工程目錄,縮小範圍,別還沒開始看到這麼多包就退縮了。這兒講幾個技巧
1.使用apktool反編譯apk檢視AndroidManifest.xml檔案
這個檔案相信做adnroid開發的都不陌生吧,應用的包名,以及啟動activity等,所有activity都會被註冊在這裡面,通過可以很輕鬆的找到該app的工程目錄
2.直接猜
先別噴,這兒的猜是有經驗的猜,並不是要你一個一個的開啟看,我們玩開發的都知道,應用的包名基本上都是com.組織名.專案名,結合該應用的名字,也可以很快定位
3.全域性搜
通過觀察app執行時的一些固定引數,再使用jd-gui的全域性搜尋功能,可以很快定位到檔案。後面也會一直使用他
具體分析過程
到這兒基本上了解的也查不多了,剩下的就是找到目的碼塊了,先分析一下他的效果:
開啟app檢視,普通的直播可以直接進去觀看,再看看收費直播,可以預覽10秒左右,但是上面會有收費彈窗遮擋。十秒之後視訊會黑屏彈出收費視窗。
可以正向思考一波,自己遇到這種需求應該怎麼做。再結合它的效果,可以推斷一下,他是首先請求伺服器直播列表資料,裡面包含每個直播間的資訊,包括是否收費,推流地址,然後再點選播放,跳轉到一個activity中,當收費直播的話,就彈出收費視窗,並且在預覽十秒之後,停止播放。
分析完之後,再找到程式碼驗證一下我們分析的是不是正確的,先從彈窗入手,可以看到他的彈窗會有固定資訊“收費”兩字,所以全域性搜尋一下“收費”
看結果,找到了兩個類,點進去觀察一下,很明顯,第一個類對我們來說是有用的,
PayLiveBlackBgView.class 顧明思意,他是該軟體的播放背景view,再看看行明顯的漢字,明白了,這個就是來控制倒數計時的,再往下走走可以看到
private int proview_play_time = 15000; 定義了一個變數,預覽時間15s,這時候是不是有種思緒大開的節奏,我們可以延長預覽時間,就可以實現一直看的功能了,這兒我試了一下,把15000多加了兩個0,重新編譯會報錯,因為15000在smail裡面被定義成了一個short多加兩個零會超過長度,就報錯了,當然熟悉smail語法的也可以這樣改試試。
既然上面改時間不行,再往下看看,有個startCountDown(開啟倒數計時)
看下他的大概邏輯,先停止倒數計時,再判斷parmLong 是否大於 0L ,然後建立計時器,計時結束之後,destoryVideo。
這時候又可以有兩種實現方式了
1.計時結束之後不呼叫destoryVideo 2.乾脆不讓他計時
我選擇第二種方法,實現呢就是在判斷parmLong 是否大於 0L時讓他返回false,自然就不會進入下面的計時方法了。
使用apktool
知道怎麼改之後就需要用到apktool這個東西了。使用方法我介紹一下,先把你要反編譯的apk檔案,和他放在一起,就像下面一樣
然後在當前資料夾下開啟命令視窗,執行
apktool d huanghou.apk
執行完之後,會在當前目錄下輸入
開啟資料夾,通過之前的jar檔案路徑,找到對應的smail檔案位置,如下所示
用記事本或者別的工具開啟檔案,我用的Notepad++,開啟之後你會發現,這尼瑪是什麼玩意,完全看不懂啊,哈哈。其實我也看不懂,不過沒關係,現學現賣就好了,剛才我們找到了個startCountDown方法是吧 ctrl+f 搜尋一下,找到該方法
看到 if-lez v2 , : cond_0 , 這個if應該就是判斷parmLong 是否大於 0L的了,他的意思大概為
如果vA小於等於0則跳轉到:cond_0 ,只需要把條件改為不成立即可,這兒copy一段:
條件跳轉分支:
"if-eq vA, vB, :cond_**" 如果vA等於vB則跳轉到:cond_**
"if-ne vA, vB, :cond_**" 如果vA不等於vB則跳轉到:cond_**
"if-lt vA, vB, :cond_**" 如果vA小於vB則跳轉到:cond_**
"if-ge vA, vB, :cond_**" 如果vA大於等於vB則跳轉到:cond_**
"if-gt vA, vB, :cond_**" 如果vA大於vB則跳轉到:cond_**
"if-le vA, vB, :cond_**" 如果vA小於等於vB則跳轉到:cond_**
"if-eqz vA, :cond_**" 如果vA等於0則跳轉到:cond_**
"if-nez vA, :cond_**" 如果vA不等於0則跳轉到:cond_**
"if-ltz vA, :cond_**" 如果vA小於0則跳轉到:cond_**
"if-gez vA, :cond_**" 如果vA大於等於0則跳轉到:cond_**
"if-gtz vA, :cond_**" 如果vA大於0則跳轉到:cond_**
"if-lez vA, :cond_**" 如果vA小於等於0則跳轉到:cond_**
挑一個相反的吧,把lez換為gtz。儲存就OK了
回編譯
修改完之後,就該測驗一下,在資料夾下執行
apktool b huanghou
會在huanghou資料夾下生成兩個資料夾
在dist資料夾下會生成修改後的apk檔案了,這時候先彆著急安裝,還需要給apk簽名,沒有簽名檔案的話先用studio生成一個,或者百度一下生成個簽名檔案
執行命令
jarsigner -verbose -keystore mykey.keystore -signedjar signed_myapp.apk myapp.apk myAlias
-keystore mykey.keystore指明需要使用的簽名檔案
-signedjar signed_myapp.apk指明生成的簽名過的apk的名稱(路徑)
myapp.apk表示未簽名的apk檔案
myAlias表示簽名檔案mykey.keystore的別名(在生成這個簽名檔案的時候配置的屬性)
簽名完成之後就可以直接安裝看效果了,後面的效果我測試了,倒數計時被幹掉了,也就是視訊可以一直觀看,但是上面一直會有收費視窗,你們可以自行思考一下,怎麼把收費視窗也遮蔽掉。成品apk可以私信我,我發給你們,有需要的話,也會出後續。
總結一下
這次逆向還是很簡單的,沒有涉及到混淆,程式碼邏輯也不算太複雜,很適合小白入手,程式碼分析過程很重要,看懂了程式碼才有解決思路。遮蔽方法也多種多樣,再推薦大家可以嘗試用Hook的方法來遮蔽彈窗,當下比較流行的xspoed框架。很多apk都會有簽名驗證,二次打包後不一定能用。好了就到這兒了,覺得還可以的點個贊哦。