码迷,mamicode.com
首页 > 移动开发 > 详细

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

时间:2015-02-11 12:46:58      阅读:201      评论:0      收藏: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是否与签名时的一致即可

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

标签:android   破解   

原文地址:http://blog.csdn.net/liucanlong/article/details/43732327

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!