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