资源简介
通用JAVA加密或者是混淆更贴切技术是将class、方法及包,以随机命名方式进行混淆,虽然这种方式增加了阅读难度,但还不足以将字节码文件进行完整保护。本文介绍一种以JVMTI和JNI方式对字节码进行加密的办法,并提供测试源码下载
代码片段和文件信息
#include “Common.h“
#include “WjcDes.h“
# define NELEM(x) ((int) (sizeof(x) / sizeof((x)[0])))
std::string& replace_all(std::string& strconst std::string& old_valueconst std::string& new_value)
{
while(true) {
std::string::size_type pos(0);
if( (pos=str.find(old_value))!=std::string::npos )
str.replace(posold_value.length()new_value);
else break;
}
return str;
}
JNIEXPORT void JNICALL classloadHook (jvmtiEnv *jvmti_env JNIEnv* jni_envjclass class_being_redefined
jobject loader const char* name
jobject protection_domain
jint class_data_len
const unsigned char* class_data
jint* new_class_data_len
unsigned char** new_class_data);
JNIEXPORT void JNICALL cbVminit(jvmtiEnv *jvmti_env JNIEnv* jni_env jthread thread);
char * jstringTostring(JNIEnv* env jstring jstr)
{
char* rtn = NULL;
jclass clsstring = env->FindClass(“java/lang/String“);
jstring strencode = env->NewStringUTF(“utf-8“);
jmethodID mid = env->GetMethodID(clsstring “getBytes“ “(Ljava/lang/String;)[B“);
jbyteArray barr= (jbyteArray)env->CallobjectMethod(jstr mid strencode);
jsize alen = env->GetArrayLength(barr);
jbyte* ba = env->GetByteArrayElements(barr JNI_FALSE);
if (alen > 0)
{
rtn = (char*)malloc(alen + 1);
memcpy(rtn ba alen);
rtn[alen] = 0;
}
env->ReleaseByteArrayElements(barr ba 0);
return rtn;
}
JNIEXPORT jint JNICALL Agent_onload(JavaVM *vm char *options void *reserved)
{
std::cout<<“Agent_onload Start“< jvmtiEnv * jvmti;
//环境
jint ret = vm->GetEnv((void **)&jvmti JVMTI_VERSION_1_0);
if(ret != JNI_OK)
{
std::cout<<“GetEnvError“< return ret;
}
//回调
jvmtiEventCallbacks callbacks;
callbacks.ClassFileLoadHook = classloadHook;
callbacks.VMInit = cbVminit;
jvmti->SetEventCallbacks(&callbacks sizeof(callbacks));
jvmti->SetEventNotificationMode(JVMTI_ENABLE JVMTI_EVENT_CLASS_FILE_LOAD_HOOKNULL);
jvmti->SetEventNotificationMode(JVMTI_ENABLEJVMTI_EVENT_VM_INITNULL);
return JNI_OK;
}
jclass MyDefine1Class(JNIEnv * env jobject obj jstring name jbyteArray b jint off jint len jobject protection_doaminjstring source)
{
jbyte * buff = env->GetByteArrayElements(b NULL);
Header header;
jclass descClazz;
memcpy(&headerbuffsizeof(header));
char * className = jstringTostring(env name);
std::string realName(className);
replace_all(realName “.“ “/“);
if(header.nSeqNum == DEFAULT_SEQ)
{
Des_Go((char *)(buff) (char *)(buff + sizeof(header)) header.nHash header.strPasssizeof(header.strPass)DES_DECRYPT);
descClazz = env->DefineClass(realName.c_str() obj buff (jsize)header.nHash);
#ifdef DEBUG
std::cout<<“find A“< std::cout<<“name===============>“< #endif
}
else
{
#ifdef DEBUG
std::cout<<“name=11111111111111>“< #endif
descClazz = env->DefineClass(realName.c_str()objbuff len);
属性 大小 日期 时间 名称
----------- --------- ---------- ----- ----
文件 700 2014-06-20 16:00 Common.h
文件 8109 2014-06-21 14:51 JvmitPrj.vcxproj
文件 1242 2014-06-19 17:53 JvmitPrj.vcxproj.filters
文件 143 2014-06-18 00:16 JvmitPrj.vcxproj.user
文件 5367 2014-06-20 21:04 JvmMain.cpp
文件 486 2014-06-20 14:25 makefile
文件 9082 2014-06-19 17:28 WjcDes.cpp
文件 1061 2014-06-19 17:53 WjcDes.h
- 上一篇:粒子群算法
- 下一篇:java 程序输出九九乘法表
评论
共有 条评论