標籤:破解 網盤 115 so apk
在使用115網盤的時候,發現裡面的離線下載功能的線上視頻觀看功能竟然有10分鐘的廣告時間,於是開始萌生嘗試破解的它的想法,首先聲明,本帖只作為技術研究,請讀者遵守相關法律法規,不要侵犯以他人的商業利益為目的進行相關破解行為。
由於之前破解過多個apk 修改裡面的smali代碼研究相關的技術,所以剛開始我解開115網盤apk的時候,雖然看到裡面的代碼混淆了,經過一番研究之後,還是找到了廣告的兩個關鍵位置,一個開始播放前的10分鐘內廣告,一個是滑動進度條的時候的5到11秒隨機長度廣告,兩個都是在VideoVitamioPlayActivity這個類裡面,如:
找到VideoVitamioPlayActivity.smali檔案,並找到上面圖中兩個位置的smali代碼並刪掉,重新編譯成classes.dex檔案,替換原來apk 包裡面的相應檔案,重新簽名,放到手機安裝成功。可總是打不開,我立刻把手機串連上電腦,看logcat輸出,發現裡面輸入一個error,大大的“Illigal APP...”幾個字出現在我眼前,我頓時興奮了,決定繼續玩它下去。
在logcat中,我看到這是native層裡面報出的錯誤,心想這肯定是在第一個activity或application裡面調用native代碼,果然在DiskApplication這個類的onCreate方法裡面找到了一行代碼EncryptNative.init(getApplicationContext());,於是跟蹤進去 ,發現其調用了yyw_encrypt.so庫,並有兩個對外方法:
public static native String getLoginSign(String paramString1, String paramString2, String paramString3);public static native void init(Object paramObject);
我開始嘗試性的把DiskApplication裡面的EncryptNative.init(getApplicationContext());刪除掉再重新編譯、運行。果然不出所料,APP可以運行起來了,可是在登陸的時候還是被強制關閉了,logcat依然輸出大大的“Illigal APP...”。
這會我開始把yyw_encrypt.so扔進IDA pro,研究這兩個方法的實現邏輯,如
從的方法可以看出來,init方法裡面擷取apk當前的簽名經過sha1轉換後與設定的兩個sha1值進行相等比較,並把比較結果放到IS_CORRECT全域變數裡面,只要一個相等,就會正常結束方法,否則跳轉到loc_1720地址處彈出提示並關閉APP。而第二個方法:
從getLoginSign 方法的執行流程中可以看出這方法首先會判斷IS_CORRECT是否等於1,如果不等於的話就跳轉到loc_1458處執行,執行提示“Illigal APP...”和關閉app動作。而等於的話就直接進行登陸sign字串的轉換,而這個地方恰恰是沒有和當前簽名的sha1值進行相關運算,只是把參數裡面的幾個字串進行相關運算返回一個結果 ,所以破解它的方法就輕鬆看出來了,只到把init的CMP處理的R9改成1就可以了,而為了達到這個目的,可以在很多地方入手,經過一番研究,最後我選擇了equals函數入手,因為這是最簡單方便的,只有init方法裡面的兩處調用,不會影響其它地方:
,在equals方法執行的最後面,R0作為返回資料存入的寄存器,裡面存入的是判斷結果,只要把R0存入立即數1,就可以返回相等的判斷結果,於是開始查閱ARM的指令機器碼(ARMv7-M Architecture Application Level Reference Manual),查詢16位的Thumb指令的MOV立即數,在A6.7.75章節找到了這指令的相關說明:
根據文檔說明 可以得到MOV R0,#1的機器碼為:20 01,接著找到equals方法MOV R0,R5指令的所在位置為000015FB,開啟Ultraedit,把000015FB的28 46改成01 20,改了之後再從IDA開啟libyyw_encrypt, 裡面的指令已經變成MOVS R0,#1,如所示:
由於修改的是armeabi-v7a裡面的so,還需要修改armeabi裡面的so, 雖然會有點區別,但是這個MOVS R0,#1指令在兩個版本的ARM指令中是一樣的,以同樣的方法替換原來的機器碼,過後替換掉原來apk中的so檔案,重新簽名,運行,登陸,離線播放,一切正常,成功幹掉長廣告,至此,破解終於完成。
Android逆向之115網盤5.2.2apk簽名校正so破解並幹掉長廣告