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

  最近在研究android应用中的安全问题,貌似只有将核心代码写到JNI底层才是最安全的。通过底层来判断签名是否正确,如果正确则继续执行核心代码,否则退出程序,这样就可以防止别人恶意反编译,并进行二次打包。所以这里的关键就是如何在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的代码使用不是很容易,请耐心修改调试,我也是调了好久才测试通过的。


  
  • 2
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 14
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 14
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

爱吾所爱

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值