当前位置: 代码迷 >> Android >> 利用签字机制进行程序自检——Android防破解
  详细解决方案

利用签字机制进行程序自检——Android防破解

热度:35   发布时间:2016-04-28 02:18:52.0
利用签名机制进行程序自检——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


HelloWorld中的hashCode就是我们自检的结果,程序运行时检测hashCode是否与签名时的一致即可

2楼unfind08293天前 21:54
不是很明白,能详细的说说么?[email protected]
1楼cheyiliu3天前 16:26
同问
  相关解决方案