前段時間偶然發現一個直播軟件,裏面的內容嘛,很刺激,就是那種大家懂得。可是好看的所有都提示我須要鑽石觀看,做爲一個優秀的好青年,怎麼捨得用本身辛辛苦苦賺的錢去看這種東西,恰好對逆向仍是懂些皮毛,因而,便開始了下面的內容,因爲該軟件比較
,想要測試的夥伴,能夠私信我哦html
熟悉逆向的小夥伴應該都知道,要破解它首先須要反編譯了,看看源碼,纔有下手的方向。這時候就不得不介紹一下,反編譯的三個好夥伴了。java
1.dex2jar 這個是用來把java編譯後的dex文件從新轉化爲jar文件,這兒普及一下,dex文件就是可以被DVM或者Art虛擬機執行的文件,記錄了全部類文件的信息。說白了就是用這個來提取你能看得懂的java代碼android
下載地址:sourceforge.net/projects/de…git
2.jd-gui 這個就是用來打開上面的jar文件的工具github
下載地址:www.softpedia.com/get/Program…服務器
3.apktool 抄一下百度,GOOGLE提供的APK編譯工具,可以反編譯及回編譯apk,(很重要)app
下載地址: ibotpeaches.github.io/Apktool/框架
下載好這三個就能夠開始逆向之旅了ide
1.把須要破解的apk文件重命名,後綴修改成zip,並解壓出來工具
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這個東西了。使用方法我介紹一下,先把你要反編譯的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都會有簽名驗證,二次打包後不必定能用。好了就到這兒了,以爲還能夠的點個贊哦。