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

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

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

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

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

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

  1. // 获得 Context 类
  2. jclass native_clazz = (*env)->GetObjectClass(env, context);
  3. // 得到 getPackageManager 方法的 ID
  4. jmethodID methodID_func = (*env)->GetMethodID(env, native_clazz,
  5. "getPackageManager", "()Landroid/content/pm/PackageManager;");
  6. // 获得应用包的管理器
  7. jobject package_manager = (*env)->CallObjectMethod(env, thiz, methodID_func);
  8. // 获得 PackageManager 类
  9. jclass pm_clazz = (*env)->GetObjectClass(env, package_manager);
  10. // 得到 getPackageInfo 方法的 ID
  11. jmethodID methodID_pm = (*env)->GetMethodID(env, pm_clazz,
  12. "getPackageInfo", "(Ljava/lang/String;I)Landroid/content/pm/PackageInfo;");
  13. // 获得应用包的信息
  14. jobject package_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签名的哈希值的更多相关文章

  1. 深入理解Android(5)——从MediaScanner分析Android中的JNI

    前面几篇介绍了Android中的JNI和基本用法,这一篇我们通过分析Android源代码中的JNI实例,来对JNI部分做一个总结. 一.通向两个不同世界的桥梁 在前面我们说过,JNI就像一个桥梁,将J ...

  2. Android中关于JNI 的学习(零)简单的样例,简单地入门

    Android中JNI的作用,就是让Java可以去调用由C/C++实现的代码,为了实现这个功能.须要用到Anrdoid提供的NDK工具包,在这里不讲怎样配置了,好麻烦,配置了好久. . . 本质上,J ...

  3. android中使用jni对字符串加解密实现分析

    android中使用jni对字符串加解密实现分析 近期项目有个需求.就是要对用户的敏感信息进行加密处理,比方用户的账户password,手机号等私密信息.在java中,就对字符串的加解密我们能够使用A ...

  4. 深入理解Android(2)——理解Android中的JNI(中)

    阳光小强参加了CSDN博客之星评选,如果你觉得阳光小强的博客对你有所帮助,为小强投上一票吧:http://vote.blog.csdn.net/blogstar2014/details?usernam ...

  5. Android中关于JNI 的学习(六)JNI中注冊方法的实现

    在前面的样例中,我们会发现,当在Java类中定义一个方法的时候,例如以下: public class ParamTransferTest { public static int testval = 1 ...

  6. Android中关于JNI 的学习(四)简单的样例,温故而知新

    在第零篇文章简单地介绍了JNI编程的模式之后.后面两三篇文章,我们又针对JNI中的一些概念做了一些简单的介绍,也不知道我究竟说的清楚没有.但相信非常多童鞋跟我一样.在刚開始学习一个东西的时候,入门最好 ...

  7. 深入理解Android(4)——理解Android中的JNI(下)

    在前面文章中简单介绍了JNI,这一篇文章来简单看一下jni.h中定义的一些常用方法,来实现通过C++调用Android中的Java代码. 转载请说明出处:http://blog.csdn.net/da ...

  8. Android中关于JNI 的学习(三)在JNI层訪问Java端对象

    前面两篇文章简介了JNI层跟Java层的一些相应关系,包含方法名,数据类型和方法名称等,相信在理论层面.可以非常好地帮助我们去了解JNI在Native本地开发中的作用,对JNI的一些概念也有了一个初步 ...

  9. Android中关于JNI 的学习(一)对于JNIEnv的一些认识

    一个简单的样例让我们初步地了解JNI的作用.可是关于JNI中的一些概念还是需要了解清楚,才干够更好的去利用它来实现我们想要做的事情. 那么C++和Java之间的是怎样通过JNI来进行互相调用的呢? 我 ...

随机推荐

  1. kali 国内镜像源,以及PD_tools,Vm_tools的安装

    kali 系统apt-get 更新镜像源,往上分享的有,这里整理下 中科大kali源 deb http://mirrors.ustc.edu.cn/kali sana main non-free co ...

  2. 去掉Qt加载png图像文件时候的iccp警告

    用QML加载png文件时显示如下警告(图像正常加载显示) libpng warning: iCCP: known incorrect sRGB profile libpng warning: iCCP ...

  3. poj 3266 Cow School 分数规划

    这个题目难度非常大,首先对于老师的一种方案,应用分数规划的一般做法,求出所有的c=t-rate*p,如果没有选择的c值中的最大值比选择了的c值中的最小值大,那么这个解是可以改进的. 那么问题就转化成了 ...

  4. C++要点

           以下的这些要点是对全部的C++程序猿都适用的.我之所以说它们是最重要的,是由于这些要点中提到的是你通常在C++书中或站点上无法找到的.如:指向成员的指针,这是很多资料中都不愿提到的地方, ...

  5. Axure快捷键大全 Axure RP Pro 6.5快捷键

    习惯用Axure快捷键会让你做原型的时候更得心应手.Axure中文网总结了常用的一些快捷键分享给大家 . Axure RP Pro 6.5快捷键大全,如有疏漏,欢迎补充. 基本快捷键:   打开:Ct ...

  6. Visual Studio 必备神器---转

    会使用工具是人类文明的一大进步,今天敏捷大行其道,好的工具可以大大的提高生产力,这里说的工具都是VS平台上的扩展工具,一些机械的部分可以交给工具去处理,自己多关注其他部分.下面分享下我觉得不错的工具, ...

  7. Android ListView 之 SimpleAdapter 二 (包含 item 中按钮监听)

    1    MainActivity.java package com.myadapter; import java.util.ArrayList; import java.util.HashMap; ...

  8. iOS学习——UI基础UIButton(七)

    前面写了UIWindow.UIViewController,那些都是一些框架,框架需要填充上具体的view才能组成我们的应用,移动应用开发中UI占了很大一部分,最基础的UI实现是使用系统提供的各种控件 ...

  9. Android NDK 简单介绍、工具安装、环境配置

    NDK全称:Native Development Kit. 1.NDK是一系列工具的集合. * NDK提供了一系列的工具,帮助开发人员高速开发C(或C++)的动态库,并能自己主动将so和java应用一 ...

  10. Google App Engine 学习和实践

    这个周末玩了玩Google App Engine,随手写点东西,算是学习笔记吧.不当之处,请多多指正. 作者:liigo,2009/04/26夜,大连 原创链接:http://blog.csdn.ne ...