[最近在研究android应用中的安全问题,貌似只有将核心代码写到JNI底层才是最安全的。通过底层来判断签名是否正确,如果正确则继续执行核心代码,否则退出程序。所以这里的
使用Android JNI 获取应用签名。
根据获取的签名来生成自己的密码,这样可以防止别人反编译自己的源码后查找密码。
[ 本文转自http://www.cnblogs.com/yc_sunniwell/archive/2010/07/05/1771149.html 1. 什么是 JNI JNI是Java Native Interface的缩写。从Java 1.1开始,JNI标准
jstring Java_com_masonsdk_jni_JNIUtil_getPWD(JNIEnv* env, jobject thizz
,jobject thiz
){
jclass native_clazz = env->GetObjectClass(thiz);
// 得到 getPackageManager 方法的 ID
jmethodID methodID_func =env->GetMethodID(native_clazz,"getPackageManager", "()Landroid/content/pm/PackageManager;");
// 获得应用包的管理器
jobject package_manager = env->CallObjectMethod(thiz, methodID_func);
// 获得 PackageManager 类
jclass pm_clazz = env->GetObjectClass(package_manager);
// 得到 getPackageInfo 方法的 ID
jmethodID methodID_pm = env->GetMethodID( pm_clazz,
"getPackageInfo", "(Ljava/lang/String;I)Landroid/content/pm/PackageInfo;");
//获取包名
jmethodID methodID_packagename =env->GetMethodID(native_clazz,"getPackageName", "()Ljava/lang/String;");
jstring name_str = static_cast(env->CallObjectMethod(thiz, methodID_packagename));
// 获得应用包的信息
jobject package_info = env->CallObjectMethod(package_manager,
methodID_pm, name_str, 64);//env->NewStringUTF("com.example.contasdf")
// 获得 PackageInfo 类
jclass pi_clazz = env->GetObjectClass( package_info);
// 获得签名数组属性的 ID
jfieldID fieldID_signatures = env->GetFieldID( pi_clazz,
"signatures", "[Landroid/content/pm/Signature;");
// 得到签名数组,待修改
jobject signatur = env->GetObjectField(package_info, fieldID_signatures);
jobjectArray signatures = reinterpret_cast(signatur);
// 得到签名
jobject signature = env->GetObjectArrayElement(signatures, 0);
// 获得 Signature 类,待修改
jclass s_clazz = env->GetObjectClass(signature);
// 得到 hashCode 方法的 ID
jmethodID methodID_hc = env->GetMethodID(s_clazz, "hashCode", "()I");
// 获得应用包的管理器,待修改
int hash_code = env->CallIntMethod(signature, methodID_hc);
char str[100];
sprintf(str, "%u", hash_code);
return env->NewStringUTF(str);
}
源码:
【 声明:版权所有,欢迎转载,请勿用于商业用途。 --天盟】[转载的: 一、JNI介绍Java Native Interface(JNI)标准是java平台的一部分,它允许Java代码和其他语言写的代码进行交互。JNI 是本地编程接口,它使得在 Java 虚拟机(VM) 内