破解某普通話測試app會員 獲取某車源平臺所有賣家聯絡方式
裝置要求
已root的Android手機
軟體要求
反編譯工具
jeb、APK改之理(APK IDE)
hook工具
frida、xposed。
佈局分析工具
Android Device Monitor
操作過程
脫殼
該app使用了360加固,脫殼過程和前一篇【獲取某車源平臺所有賣家聯絡方式】相同。
反編譯
因為獲取的dex檔案不完整,使用jadx反編譯會卡死,但是這不影響分析功能,所以也不去做過多的修復,可以用其他的反編譯工具,只要能看到大概的程式碼就行了。
這裡我使用了jeb和改之理,jeb用來檢視java程式碼,改之理用來全域性搜尋。
首先將得到的4個dex打包成zip檔案,如果直接替換apk中dex,用jeb反編譯會雖然不會卡死,但是得不到程式碼,
然後用jeb反編譯,
因為如果直接反編譯dex檔案,jeb每次只能反編譯一個dex,而且jeb只能開一個,要想在多個dex中查詢程式碼就要不斷的關閉當前的dex再反編譯其他的dex,
將他們打包成一個zip檔案後,就能一次將所有dex反編譯了。
改之理可以直接反編譯替換dex後的apk,但是反編譯出來的是smali,而自帶的jd-gui反編譯出來的java程式碼也不大友好,因此就只用來搜搜變數。
查詢關鍵程式碼
首先開啟app到主頁,能夠看到現在是沒有會員的。
先隨便找一個需要會員的地方,
在第一欄的機考頁面,點選馬上測試,然後右下角有一個全真測試,這個功能是需要會員的。
這裡我們知道,點選全真測試按鈕後,就會先驗證是否是會員,不是會員則彈出開通會員的對話方塊,所以定位到該按鈕的響應程式碼即可。
首先通過分析Android Device Monitor分析該介面的佈局,找到該按鈕的id,過程如下:
1.先用mprop修改手機的屬性,執行以下兩條命令
./mprop ro.secure 0 ./mprop ro.debuggable 1
這兩條命令可能一次不能成功,就需要多執行幾次,知道出現類似如下內容,
2.開啟View Server,執行以下命令
service call window 1 i32 4939
得到對應的輸出
3.啟動App,進入需要分析的介面
4.開啟Android Device Monitor,在Hierarchy Viewer視窗對佈局進行檢視,找到對應的控制元件
由上圖可知,該按鈕的id為start_complex_test,所以在改之理對該字串進行全域性搜尋。
由搜尋結果可知,除了xml和R檔案,中start_complex_test就只在NewPreviewTestActivity中出現過,該類是在第二個dex檔案中(如果這裡不能在程式碼中直接找到,就需要將xml中該id對應的十六進位制數字轉換成十進位制數字,然後進行全域性搜尋),
在jeb中開啟classes2.dex,找到NewPreviewTestActivity類中設定響應程式碼的地方,
可以看到,響應點選的類是NewPreviewTestActivity$$Lambda$5,但是直接雙擊它沒有跳轉,所以該類應該在其他dex中,直接在改之理中去搜索NewPreviewTestActivity$$Lambda$5
根據搜尋結果,可知NewPreviewTestActivity$$Lambda$5在classes.dex中,在jeb中開啟classes.dex,找到NewPreviewTestActivity$$Lambda$5
由onClick方法可知,處理方法為NewPreviewTestActivity的lambda$initEvent$5$NewPreviewTestActivity,所以又需要回到classes2.dex中查詢lambda$initEvent$5$NewPreviewTestActivity
由程式碼可知,當PointManager.isProUser返回true則表示該使用者是會員,返回false則彈出購買會員的對話方塊。
所以只需hook該方法,使其永遠返回true即可。
編寫hook外掛
hook程式碼如下:
public class Main implements IXposedHookLoadPackage { @Override public void handleLoadPackage(final XC_LoadPackage.LoadPackageParam loadPackageParam) { if (loadPackageParam.packageName.equals("com.huahua.testing")) { XposedHelpers.findAndHookMethod(Application.class, "attach", Context.class, new XC_MethodHook() { @Override protected void afterHookedMethod(MethodHookParam param) throws Throwable { //com.huahua.utils.PointManager.isProUser XposedHelpers.findAndHookMethod("com.huahua.utils.PointManager", loadPackageParam.classLoader, "isProUser", new XC_MethodHook() { @Override protected void beforeHookedMethod(MethodHookParam param) throws Throwable { param.setResult(true); } }); } }); } } }
安裝重啟後,開啟該app,發現主頁購買會員的提示已經變成會員專享資料下載了,
點選之前的全真測試,也不會彈出購買對話方塊了,而是直接進入測試