利用签名机制进行程序自检——Android防破解
自检程序写在so里
主要代码
在文件头中导入
#if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID) #include <jni.h> #include<android/log.h> #include <string.h> #include <unistd.h> #endif
然后在cpp中写入Java调用c的接口
#if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID) extern "C" { JNIEXPORT jint JNICALL Java_org_cocos2dx_cpp_AppActivity_checkAPK(JNIEnv *env, jclass jcl, jobject context_object) { jclass context_class = env->GetObjectClass(context_object); //context.getPackageManager() jmethodID methodId = env->GetMethodID(context_class, "getPackageManager", "()Landroid/content/pm/PackageManager;"); jobject package_manager_object = env->CallObjectMethod(context_object, methodId); if (package_manager_object == NULL) { __android_log_print(ANDROID_LOG_INFO, "JNITag","getPackageManager() Failed!"); return NULL; } //context.getPackageName() methodId = env->GetMethodID(context_class, "getPackageName", "()Ljava/lang/String;"); jstring package_name_string = (jstring)env->CallObjectMethod(context_object, methodId); if (package_name_string == NULL) { __android_log_print(ANDROID_LOG_INFO, "JNITag","getPackageName() Failed!"); return NULL; } env->DeleteLocalRef(context_class); //PackageManager.getPackageInfo(Sting, int) jclass pack_manager_class = env->GetObjectClass(package_manager_object); methodId = env->GetMethodID(pack_manager_class, "getPackageInfo", "(Ljava/lang/String;I)Landroid/content/pm/PackageInfo;"); env->DeleteLocalRef(pack_manager_class); jobject package_info_object = env->CallObjectMethod(package_manager_object, methodId, package_name_string, 64); if (package_info_object == NULL) { __android_log_print(ANDROID_LOG_INFO, "JNITag","getPackageInfo() Failed!"); return NULL; } env->DeleteLocalRef(package_manager_object); //PackageInfo.signatures[0] jclass package_info_class = env->GetObjectClass(package_info_object); jfieldID fieldId = env->GetFieldID(package_info_class, "signatures", "[Landroid/content/pm/Signature;"); env->DeleteLocalRef(package_info_class); jobjectArray signature_object_array = (jobjectArray)env->GetObjectField(package_info_object, fieldId); if (signature_object_array == NULL) { __android_log_print(ANDROID_LOG_INFO, "JNITag","PackageInfo.signatures[] is null"); return NULL; } jobject signature_object = env->GetObjectArrayElement(signature_object_array, 0); env->DeleteLocalRef(package_info_object); //Signature.toCharsString() jclass signature_class = env->GetObjectClass(signature_object); methodId = env->GetMethodID(signature_class, "hashCode", "()I"); env->DeleteLocalRef(signature_class); int signature_string = env->CallIntMethod(signature_object, methodId); HelloWorld::hashCode = signature_string; return signature_string; } } #endif
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。