Android防破解技术研究

人生如果错了方向,停止就是进步。

客户端和服务器通讯,key的存储方式一般有两种

一:动态从服务器获有时效性的key,失效的时候再去请求,这种额外增加了请求次数还要处理key失效的情况,如果用抓包软件还是可以破解key,相对来说不是太理想。

二:将私有的key通过native方法获取,打包后在so文件里面。但别人可以反编译代码,将你的so文件加载到自己代码里面,然后通过你的native方法去获取key,所以这边要解决下自己的so防止别人使用。
解决这个就是在native那边验证签名,不是自己签名不返回key,还可以让程序崩溃。这样基本上可以确保key的安全。

c代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
static bool checkSignature = false;
// 检查签名是否被更改过
JNIEXPORT jboolean JNICALL Java_com_innotechx_jni_NativeUtils_checkSignature
(JNIEnv *env, jclass clazz, jobject context_object) {

jstring signature = Java_com_innotechx_jni_NativeUtils_getSignature(env, clazz, context_object);
const char *orginalSignature = "244699197";
const char *currentSignature = jstringTostring(env, signature);
int result = strcmp(orginalSignature, currentSignature);
return result == 0 ? true : false;
}
// 获取私有的key(用与加解密或者和服务器约定好的key)
JNIEXPORT jstring JNICALL Java_com_innotechx_jni_NativeUtils_getPrivateKey
(JNIEnv *env, jclass clazz, jobject context_object) {

if (false == checkSignature) {
checkSignature = Java_com_innotechx_jni_NativeUtils_checkSignature(env, clazz, context_object);
}
if (checkSignature) {
return env->NewStringUTF("这边返回你自己的key");
}
return env->NewStringUTF("获取失败");
}
1
2
3
4
5
6
7
// 获取签名信息
JNIEXPORT jstring JNICALL Java_com_innotechx_jni_NativeUtils_getSignature
(JNIEnv *env, jclass clazz, jobject context_object) {

jclass context_class = env->GetObjectClass(context_object);
return "返回自己签名的hash值(代码见demo)";
}

反编译apk

工具介绍

  • apktool 资源文件获取,可以提取出图片文件和布局文件进行使用查看
  • dex2jar 将apk反编译成java源码(classes.dex转化成jar文件)
  • jd-gui 查看APK中classes.dex转化成出的jar文件,即源码文件

常用命令

  • apktool d -f app-release.apk -o app-release1
  • apktool b app-release1 重新打包apk(打包好的apk放在app-release1/dist目录里面)
  • 直接安装app-release1/dist里的apk会出现[INSTALL_PARSE_FAILED_UNEXPECTED_EXCEPTION]错误,所有需要重新签名
  • jarsigner -verbose -sigalg SHA1withRSA -digestalg SHA1 -keystore my-release-key.keystore my_application.apk alias_name 重新签名

  • 查看apk代码,将要反编译的APK后缀名改为.rar或则 .zip并解压,得到其中的额classes.dex文件,将获取到的classes.dex放到之前解压出来的工具dex2jar-0.0.9.15 文件夹内。./dex2jar.sh classes.dex
    Demo

发发牢骚:

最近刚换了份工作,上一家创业公司融资一直没拿到,创业这年头也不好创,老板也挺不容易的。
虽然工作了六年,android和ios虽然都会做,但是找个满意的工作也相当不容易啊,app坑少萝卜多,加上学历不高,以后的以后该怎么发展呢!

参考代码

http://www.androidchina.net/4187.html
http://m.blog.csdn.net/article/details?id=51927631
http://blog.csdn.net/hui12581/article/details/44832651 JNI详解—从不懂到理解
http://kiya.space/2015/11/12/check-signature-for-avoiding-fake-app-java-level-check/