android JNI 验证签名

转载 2017年07月14日 10:38:54

参考文章:

http://blog.csdn.net/venusic/article/details/52347316/

http://blog.csdn.net/lzj_lzj2014/article/details/73872670


把关键数据使用C来保存增加破译难度

代码如下:

Java_com_adrotation_utils_JNIUtils_getPublicKey(JNIEnv *env, jobject, jobject contextObject,
                                                jint signHashCode) {
    jclass native_class = env->GetObjectClass(contextObject);
    jmethodID pm_id = env->GetMethodID(native_class, "getPackageManager",
                                       "()Landroid/content/pm/PackageManager;");
    jobject pm_obj = env->CallObjectMethod(contextObject, pm_id);
    jclass pm_clazz = env->GetObjectClass(pm_obj);
    //  getPackageInfo ID
    jmethodID package_info_id = env->GetMethodID(pm_clazz, "getPackageInfo",
                                                 "(Ljava/lang/String;I)Landroid/content/pm/PackageInfo;");
    jclass native_classs = env->GetObjectClass(contextObject);
    jmethodID mId = env->GetMethodID(native_classs, "getPackageName", "()Ljava/lang/String;");
    jstring pkg_str = static_cast<jstring>(env->CallObjectMethod(contextObject, mId));
    // package info
    jobject pi_obj = env->CallObjectMethod(pm_obj, package_info_id, pkg_str, 64);
    //  PackageInfo calss
    jclass pi_clazz = env->GetObjectClass(pi_obj);
    // signature  ID
    jfieldID signatures_fieldId = env->GetFieldID(pi_clazz, "signatures",
                                                  "[Landroid/content/pm/Signature;");
    jobject signatures_obj = env->GetObjectField(pi_obj, signatures_fieldId);
    jobjectArray signaturesArray = (jobjectArray) signatures_obj;
    //jsize size = env->GetArrayLength(signaturesArray);
    jobject signature_obj = env->GetObjectArrayElement(signaturesArray, 0);
    jclass signature_clazz = env->GetObjectClass(signature_obj);


    //check out hashCode

    jmethodID string_id = env->GetMethodID(signature_clazz, "toCharsString",
                                           "()Ljava/lang/String;");
    jstring str = static_cast<jstring>(env->CallObjectMethod(signature_obj, string_id));
    char *c_msg = (char *) env->GetStringUTFChars(str, 0);

    if (strcmp(c_msg, RELEASE_SIGN) == 0)//
    {
        char *str = "key";
        jstring PUBLIC_KEY = env->NewStringUTF(str);

        return PUBLIC_KEY;
    } else {
        return NULL;
    }

别忘了加载

    static {
        System.loadLibrary("native-lib");
    }

Java_com_adrotation_utils_JNIUtils_getPublicKey方法名 记得和java中的 包名类名方法名对应ok的会有标记点击可切换
package com.adrotation.utils;

/**
 * Created by SeanZ on 2016/12/16.
 */

public class JNIUtils {

    public static native String getPublicKey(Object obj);

}

                    

相关文章推荐

【腾讯Bugly干货分享】Android Linker 与 SO 加壳技术

本文来自于腾讯bugly开发者社区,非经作者同意,请勿转载,原文地址:http://dev.qq.com/topic/57e3a3bc42eb88da6d4be143 1. 前言 An...

对新手在使用jni不怎么明白的一些指导;我看看来几处这方面的教程写的,相当于用自己的语言转述一下

JNI是使用java调用C++/C 的java接口;通过他,java能调用位java制作的dll文件; 第一步: 确保在控制台能使用javac,javah命令;如果不行就要配置好环境变量了,特别是...

android jni签名验证(一)

jni获取签名一般要传入一个context到jni中,然后通过jni进行签名的相关操作,

android jni签名验证(二)

此方法主要是应对hook框架,目前比较流行的API hook框架有xposed,cydia substrate,这两个都可以对系统的api进行hook, 由于上述框架都是系统层次上进行Hook,...

Android Studio NDK 入门教程(6)--JNI签名验证防止恶意调用

JNI签名验证
  • venusic
  • venusic
  • 2016年08月28日 19:34
  • 3732

使用JNI获取Android apk签名hashcode

最近在研究Android应用中的安全问题,貌似只有将核心代码写到JNI底层才是最安全的。通过底层来判断签名是否正确,如果正确则继续执行核心代码,否则退出程序,这样就可以防止别人恶意反编译,并进行二次打...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:android JNI 验证签名
举报原因:
原因补充:

(最多只允许输入30个字)