Android中使用JNI获得APK签名的哈希值

摘要:
通过底层来判断签名是否正确,如果正确则继续执行核心代码,否则退出程序,这样就可以防止别人恶意反编译,并进行二次打包。所以这里的关键就是如何在JNI中获得签名。我上网查了好多资料,都没有现成的答案,但是我慢慢的找到了一些思路,于是潜心研究,终于有了结果。通过类似于这种反射机制,我进行一步一步调试和解析,终于获得了应用的签名信息,并从签名信息中获得了签名的哈希值。

原地址:http://blog.csdn.net/i5suoi/article/details/19036975

最近在研究android应用中的安全问题,貌似只有将核心代码写到JNI底层才是最安全的。通过底层来判断签名是否正确,如果正确则继续执行核心代码,否则退出程序,这样就可以防止别人恶意反编译,并进行二次打包。所以这里的关键就是如何在JNI中获得签名。

我上网查了好多资料,都没有现成的答案,但是我慢慢的找到了一些思路,于是潜心研究,终于有了结果。不敢独享,所以过来分享给大家。

大家都知道,在android中的java代码里获得签名的哈希值,很简单,过程如下:

  1. try{
  2. PackageInfopackageInfo=getPackageManager().getPackageInfo(
  3. "com.klxx.as",PackageManager.GET_SIGNATURES);
  4. Signature[]signs=packageInfo.signatures;
  5. Signaturesign=signs[0];
  6. Log.i("test","hashCode:"+sign.hashCode());
  7. }catch(Exceptione){
  8. e.printStackTrace();
  9. }

在JNI中提供了许多方法,可以反向调用java中的方法,比如下面一句代码:
PackageInfo packageInfo = getPackageManager().getPackageInfo("com.klxx.as", PackageManager.GET_SIGNATURES);
我们可以用JNI写成这样:

  1. //获得Context类
  2. jclassnative_clazz=(*env)->GetObjectClass(env,context);
  3. //得到getPackageManager方法的ID
  4. jmethodIDmethodID_func=(*env)->GetMethodID(env,native_clazz,
  5. "getPackageManager","()Landroid/content/pm/PackageManager;");
  6. //获得应用包的管理器
  7. jobjectpackage_manager=(*env)->CallObjectMethod(env,thiz,methodID_func);
  8. //获得PackageManager类
  9. jclasspm_clazz=(*env)->GetObjectClass(env,package_manager);
  10. //得到getPackageInfo方法的ID
  11. jmethodIDmethodID_pm=(*env)->GetMethodID(env,pm_clazz,
  12. "getPackageInfo","(Ljava/lang/String;I)Landroid/content/pm/PackageInfo;");
  13. //获得应用包的信息
  14. jobjectpackage_info=(*env)->CallObjectMethod(env,package_manager,
  15. methodID_pm,(*env)->NewStringUTF(env,"com.example.hellojni"),64);

这种方法在java中叫做反射,更多的JNI反射方法可以参考博客《android开发之绝对安全(三) JNI方法集合》。
通过类似于这种反射机制,我进行一步一步调试和解析,终于获得了应用的签名信息,并从签名信息中获得了签名的哈希值。

我将这段代码传到了CSDN上,欢迎大家下载,如果有什么漏洞,也欢迎大家指点一下。

下载地址:http://download.csdn.net/detail/iloveyoueveryday/6909583

源码使用注意事项:一定要传过来正确的context参数;项目中的包名("com.example.hellojni")别忘了修改;JNI的代码使用不是很容易,请耐心修改调试,我也是调了好久才测试通过的。

免责声明:文章转载自《Android中使用JNI获得APK签名的哈希值》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇生成MD5只有31位如何解决?C# 集合之Dictionary详解下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

uiautomatorviewer详解

一,uiautomatorviewer是什么?     Android 4.1发布的,uiautomator是用来做UI测试的。也就是普通的手工测试,点击每个控件元素 看看输出的结果是否符合预期。比如 登陆界面 分别输入正确和错误的用户名密码然后点击登陆按钮看看是否能否登陆以及是否有错误提示等。 功能性或者黑盒UI测试不需要测试人员了解程序如何实现的,只需...

Android模拟器使用SD卡

在Android手机上,所有的音乐、视频、图像文件都是存储在SD存储卡上的。但是如果想在Android模拟器上也同样能够存储这些内容,就必须先仿真SD存储卡,并让Android手机能够访问仿真出来的SD存储卡。Android SDK 组件的tools目录里,除了emulator这个运行文件外,另外放置mksdcard这个程序,它可以仿真出所需要的SD存储空...

Android应用程序签名详解 简介

转自: http://blog.csdn.net/lyq8479/article/details/6401093   本文主要讲解Android应用程序签名相关的理论知识,包括:什么是签名、为什么要给应用程序签名、如何给应用程序签名等。 1、什么是签名?      如果这个问题不是放在Android开发中来问,如果是放在一个普通的版块,我想大家都知道签名...

Android中突发情况Activity数据的保存和恢复

Android中突发情况Activity数据的保存和恢复 写在前面:在我们的APP使用的过程中,总有可能出现各种手滑、被压在后台、甚至突然被杀死的情况。所以对APP中一些临时数据或关键持久型数据,就需要我们使用正确的方式进行保存或恢复。 突发情况都有哪些? 因为本文讨论的是当一些突发情况的出现时,对数据的保存和恢复。所以现在总结一下突发情况应该都有哪些?...

5个Android开发中比较常见的内存泄漏问题及解决办法

在Android开发中,内存泄漏是比较常见的问题,有过一些Android编程经历的童鞋应该都遇到过,但为什么会出现内存泄漏呢?内存泄漏又有什么影响呢? 在Android程序开发中,当一个对象已经不需要再使用了,本该被回收时,而另外一个正在使用的对象持有它的引用从而导致它不能被回收,这就导致本该被回收的对象不能被回收而停留在堆内存中,内存泄漏就产生了。 内存...

Android 使用android-support-multidex解决Dex超出方法数的限制问题,让你的应用不再爆棚(转)

如有转载,请声明出处: 时之沙:http://blog.csdn.net/t12x3456 (来自时之沙的csdn博客) 随着应用不断迭代,业务线的扩展,应用越来越大(比如集成了各种第三方sdk或者公共支持的jar包,项目耦合性高,重复作用的类越来越多),相信很多人都遇到过如下的错误: [java]view plaincopy UNEXPECTED...