Android通过签名验证防止二次打包

来源:互联网 发布:tp5.0 项目源码 编辑:程序博客网 时间:2024/05/23 12:15

最近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

0 0
原创粉丝点击