Android中使用JNI获得APK签名的哈希值
2014-02-10 14:36
211 查看
最近在研究android应用中的安全问题,貌似只有将核心代码写到JNI底层才是最安全的。通过底层来判断签名是否正确,如果正确则继续执行核心代码,否则退出程序,这样就可以防止别人恶意反编译,并进行二次打包。所以这里的关键就是如何在JNI中获得签名。
我上网查了好多资料,都没有现成的答案,但是我慢慢的找到了一些思路,于是潜心研究,终于有了结果。不敢独享,所以过来分享给大家。
大家都知道,在android中的java代码里获得签名的哈希值,很简单,过程如下(此代码与下面下载地址的代码有所不同,已经修改了,多谢五楼 shysnower 提出的修改意见):
在JNI中提供了许多方法,可以反向调用java中的方法,比如下面一句代码:
PackageInfo packageInfo = getPackageManager().getPackageInfo("com.klxx.as", PackageManager.GET_SIGNATURES);
我们可以用JNI写成这样(此代码与下面下载地址的代码有所不同,已经修改了,多谢五楼 shysnower 提出的修改意见):
// 获得 Context 类
jclass native_clazz = (*env)->GetObjectClass(env, context);
// 得到 getPackageManager 方法的 ID
jmethodID methodID_func = (*env)->GetMethodID(env, native_clazz,
"getPackageManager", "()Landroid/content/pm/PackageManager;");
// 获得应用包的管理器
jobject package_manager = (*env)->CallObjectMethod(env, thiz, methodID_func);
// 获得 PackageManager 类
jclass pm_clazz = (*env)->GetObjectClass(env, package_manager);
// 得到 getPackageInfo 方法的 ID
jmethodID methodID_pm = (*env)->GetMethodID(env, pm_clazz,
"getPackageInfo", "(Ljava/lang/String;I)Landroid/content/pm/PackageInfo;");
// 得到 getPackageName 方法的 ID
jmethodID methodID_pack = (*env)->GetMethodID(env, native_clazz,
"getPackageName", "()Ljava/lang/String;");
// 获得当前应用的包名
jstring application_package = (*env)->CallObjectMethod(env, context, methodID_pack);
// 获得应用包的信息
jobject package_info = (*env)->CallObjectMethod(env, package_manager,
methodID_pm, application_package, 64);
这种方法在java中叫做反射,更多的JNI反射方法可以参考博客《android开发之绝对安全(三) JNI方法集合》。
通过类似于这种反射机制,我进行一步一步调试和解析,终于获得了应用的签名信息,并从签名信息中获得了签名的哈希值。
我将这段代码传到了CSDN上,欢迎大家下载,如果有什么漏洞,也欢迎大家指点一下。
下载地址:http://download.csdn.net/detail/iloveyoueveryday/6909583 。
源码使用注意事项:一定要传过来正确的context参数;项目中的包名("com.example.hellojni")别忘了修改;JNI的代码使用不是很容易,请耐心修改调试,我也是调了好久才测试通过的。
我上网查了好多资料,都没有现成的答案,但是我慢慢的找到了一些思路,于是潜心研究,终于有了结果。不敢独享,所以过来分享给大家。
大家都知道,在android中的java代码里获得签名的哈希值,很简单,过程如下(此代码与下面下载地址的代码有所不同,已经修改了,多谢五楼 shysnower 提出的修改意见):
try { PackageInfo info = getPackageManager().getPackageInfo(getPackageName(), 64); Signature sign = info.signatures[0]; Log.i("test", "hashCode : " + sign.hashCode()); } catch (NameNotFoundException e) { e.printStackTrace(); }
在JNI中提供了许多方法,可以反向调用java中的方法,比如下面一句代码:
PackageInfo packageInfo = getPackageManager().getPackageInfo("com.klxx.as", PackageManager.GET_SIGNATURES);
我们可以用JNI写成这样(此代码与下面下载地址的代码有所不同,已经修改了,多谢五楼 shysnower 提出的修改意见):
// 获得 Context 类
jclass native_clazz = (*env)->GetObjectClass(env, context);
// 得到 getPackageManager 方法的 ID
jmethodID methodID_func = (*env)->GetMethodID(env, native_clazz,
"getPackageManager", "()Landroid/content/pm/PackageManager;");
// 获得应用包的管理器
jobject package_manager = (*env)->CallObjectMethod(env, thiz, methodID_func);
// 获得 PackageManager 类
jclass pm_clazz = (*env)->GetObjectClass(env, package_manager);
// 得到 getPackageInfo 方法的 ID
jmethodID methodID_pm = (*env)->GetMethodID(env, pm_clazz,
"getPackageInfo", "(Ljava/lang/String;I)Landroid/content/pm/PackageInfo;");
// 得到 getPackageName 方法的 ID
jmethodID methodID_pack = (*env)->GetMethodID(env, native_clazz,
"getPackageName", "()Ljava/lang/String;");
// 获得当前应用的包名
jstring application_package = (*env)->CallObjectMethod(env, context, methodID_pack);
// 获得应用包的信息
jobject package_info = (*env)->CallObjectMethod(env, package_manager,
methodID_pm, application_package, 64);
这种方法在java中叫做反射,更多的JNI反射方法可以参考博客《android开发之绝对安全(三) JNI方法集合》。
通过类似于这种反射机制,我进行一步一步调试和解析,终于获得了应用的签名信息,并从签名信息中获得了签名的哈希值。
我将这段代码传到了CSDN上,欢迎大家下载,如果有什么漏洞,也欢迎大家指点一下。
下载地址:http://download.csdn.net/detail/iloveyoueveryday/6909583 。
源码使用注意事项:一定要传过来正确的context参数;项目中的包名("com.example.hellojni")别忘了修改;JNI的代码使用不是很容易,请耐心修改调试,我也是调了好久才测试通过的。
相关文章推荐
- Android中使用JNI获得APK签名的哈希值
- Android中使用JNI获得APK签名的哈希值
- Android中使用JNI获得APK签名的哈希值
- Android平台上如何让应用程序获得系统权限以及如何使用platform密钥给apk签名
- 使用JNI获取Android apk签名hashcode
- Android平台上如何让应用程序获得系统权限以及如何使用platform密钥给apk签名
- Android平台上如何让应用程序获得系统权限以及如何使用platform密钥给apk签名
- 【Android】使用 Eclipse 给 APK 签名时遇到的两个问题及解决办法
- Android 应用程序(APK) 如何获得系统签名权限 强制关闭程序(后台进程)
- 使用Ant自动签名、打包Android apk并且自动安装到手机
- Android开发:使用JNI读取应用签名
- Android apk获得系统签名
- MAC上反编译android apk---apktool, dex2jar, jd-jui安装使用(含手动签名)
- 解决使用 JDK 1.7 对 Android apk 签名后程序无法安装的问题
- android 使用keystore 签名apk
- 使用ant让Android自动打包的build.xml,自动生成签名的apk文件(支持android4.0以上的版本)
- Android APK系列3-------使用platform密钥来给apk文件签名
- Android 使用Android Studio + Gradle 或 命令行 进行apk签名打包
- MAC上反编译android apk---apktool, dex2jar, jd-jui安装使用(含手动签名)
- android 安全讲座第一层 Android APK 签名比对,防止软件被破解使用