Android通過簽名驗證防止二次打包

最近android版的遊戲要上線,想到打包黨輕鬆將自己的產品破解,然後二次打包就惱火,所以就研究了下怎麼防止打包黨從中得益的方法。

Android的app必須要有簽名才能安裝到用戶的手機上,開發者在開發期間調試,eclipse會自動爲程序創建一個debug.keystore的證書文件,這樣就能正常的安裝調試。可是在正式版的時候,我們一定要申請自己的證書文件,這樣在導出apk包得時候會通過這個文件進行簽名。
具體操作如下:
右鍵項目->Export->Android->Export Android Application->Next->選擇導出的項目(默認當前項目)->Next:
此時會看到如下圖:
因爲我之前創建過文件,所以默認會是用之前使用過的簽名文件,如果你還沒沒有這個文件,請選擇create new keystore。
然後按照說明,選擇一個本地文件路徑,填寫上密碼。
選擇一個簽名文件
Next->
填寫一些必要的描述:
填寫必要的描述
依次Next,就可以導出項目了。

到此,你已經導出了自己的項目,並且已經擁有了自己的簽名文件,這個文件可以應用到自己的所有項目中。

接下來我們要在程序中通過這個簽名來驗證項目是否是自己的了,因爲打包黨在將項目反編譯重新打包之後,一定要用自己的簽名重新打包,據我所知打包黨是不太可能繞過簽名就可以直接進行打包的,所以簽名文件肯定會有變化,如果發現不一樣,我們就可以認爲當前程序是非法的。

下面是通過android的api獲取程序的簽名的代碼:

static public String getSignature(){
        Activity activity = currentActivity;
        PackageManager manager = activity.getPackageManager();
        String md5 = "";
        try {
            PackageInfo packageInfo = manager.getPackageInfo(activity.getPackageName(), PackageManager.GET_SIGNATURES);
            Signature[] signs = packageInfo.signatures;
            Signature sign = signs[0];

            md5 = md5(sign.toCharsString());

        } catch (NameNotFoundException e) {
            // TODO Auto-generated catch block
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        return  md5;
    }

    public static String md5(String string) {
        byte[] hash;
        try {
            hash = MessageDigest.getInstance("MD5").digest(string.getBytes("UTF-8"));
        } catch (NoSuchAlgorithmException e) {
            throw new RuntimeException("Huh, MD5 should be supported?", e);
        } catch (UnsupportedEncodingException e) {
            throw new RuntimeException("Huh, UTF-8 should be supported?", e);
        }

        StringBuilder hex = new StringBuilder(hash.length * 2);
        for (byte b : hash) {
            if ((b & 0xFF) < 0x10) hex.append("0");
            hex.append(Integer.toHexString(b & 0xFF));
        }
        return hex.toString();
    }

這個方法是獲取簽名的md5,由於我的遊戲是cocos2d-x開發的,所以這些代碼會通過cocos2d-x的.so庫調用,如果是使用相同的簽名的話,返回的字符串一定是唯一的,如果和自己的不匹配,就可以認爲是非法應用,這時候可以強制將程序退出,或者做一些其他的操作,提醒用戶去正版渠道下載。

我是通過在正式版簽名的時候創建一個cocos2d-x標籤來展示出md5值,然後記錄下來,進行簡單加密存儲成一個標量保存在.so中,在調用獲取md5的時候,通過解密這個變量並比對md5是否相同來識別程序是否合法。

這是烏雲講解關於怎麼破解android包得文章
http://drops.wooyun.org/mobile/4296

發佈了32 篇原創文章 · 獲贊 1 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章