1. 程式人生 > 其它 >重打包APK繞過簽名校驗

重打包APK繞過簽名校驗

這裡先提一種針對性校強但簡單好理解的辦法,純Java實現,程式碼大概也就50行不到吧。

還有更強的並且能過各種保護(反除錯反HOOK反記憶體修改等等)的萬能方法,不過較複雜,長篇大論的,等有空整理出來再提

本文適用場景:

1.需要重打包APK給普通使用者,沒有root許可權也沒有HOOK框架

2.so很難脫殼修復分析修改,或者逆向時間會很長很長。

3.so中呼叫了this.getPackageManager().getPackageInfo來獲取簽名進行校驗

故事開始,某天,你暗戀的女神需要某個app的VIP,怎奈你兜兜空空如也,根本買不起VIP,然後你發現這個app的VIP是本地判斷的,於是……
經過一番折騰,很快就改好了APK,重打包安裝執行。提示非法操作?
又一番折騰,發現程式主要邏輯在so中,so被混淆的面目全非還進行了加固,最後發現在so中進行了APK簽名校驗,於是用hook過了簽名校驗,正常執行,VIP到手。
可是這樣怎麼發給女神呢?女神的手機沒有root也沒有hook框架。分析so?實在太複雜了,一時半會根本來不及,要讓女神等你三五十天?恐怕到時候是備胎都當不成了吧。
怎麼辦?

總體思路:

既然修改so不成,也無法使用hook框架,那麼就從別處入手。

本文用本人曾經懸賞過的加固APK(懸賞期內沒人破解成功,加固強度還可以)進行分析:

由於so非常複雜,時間關係直接放棄分析。通過HOOK發現so的中籤名校驗是通過this.getPackageManager().getPackageInfo來獲取的,於是想法就來了——
這個this是MainActivity的例項,所以這個this是一個很大的突破口:
思路活躍的同學可能已經發現了,只要覆蓋MainActivity的getPackageManager就行了。

具體過程如下:

1.寫一個HookPackageManager,專門用來HOOK各種PM相關方法:

public class HookPackageManager extends PackageManager {
 
    private PackageManager mBase; //用來做適配,返回其他資訊
 
    public HookPackageManager(PackageManager base) {
        mBase = base;
    }
 
    @Override
    public PackageInfo getPackageInfo(String packageName, int flags)
            throws NameNotFoundException {
        if (!"ywt.android.test6".equals(packageName)) {
            //如果不是目標APK,則返回原始資料
            return mBase.getPackageInfo(packageName, flags);
        }
        PackageInfo pkgInfo = new PackageInfo();
        pkgInfo.signatures = new Signature[] {
            new Signature(new byte[] {
                //這是填寫原始APK中讀到的簽名,用來欺騙so,很長就不貼了,後面會給出APK,反編譯看即可。
            })
        };
        return pkgInfo;
    }
 
    //下面還有很多需要implements的方法,太多了,就不寫了,後面會給出APK,反編譯看即可,只要用mBase一一呼叫返回即可。
}

2.寫一個HookMainActivity,程式碼如下:

public class HookMainActivity extends Activity {
 
    @Override
    public PackageManager getPackageManager() {
        //由於呼叫的是this.getPackageManager(),所以只要重寫getPackageManager,返回一個偽造的例項,就可以實現欺騙
        PackageManager pm = new HookPackageManager(super.getPackageManager());
        return pm;
    }
}

3.將寫好的Java程式碼反編譯為smali,將crackme.apk也反編譯為smali,然後將crackme中的MainActivity.smali中的父類修改為繼承HookMainActivity

4.重新打包APK,就可以繞過APK的簽名校驗啦。