• 大小: 9KB
    文件类型: .zip
    金币: 1
    下载: 0 次
    发布日期: 2021-05-28
  • 语言: Java
  • 标签: JVMTI  JAVA加密  

资源简介

通用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

评论

共有 条评论