sea-boat / ByteCodeEncrypt

a bytecode encryptor that can protect java source code.
128 stars 84 forks source link

使用方案加密之后 在idea下依然可以看见反编译的代码 #3

Open NotHys opened 5 years ago

NotHys commented 5 years ago

使用方案加密之后 在idea下依然可以看见反编译的代码 基于这个原因我将加密设置为在16个字节后将字节码交换 for(; index < class_data_len-1 ; ){

        if (index <= 16){
            _data[index]=class_data[index];
            _data[index+1]=class_data[index+1];
        }else{
                _data[index] = class_data[index+1];
            _data[index+1] = class_data[index];
        }

            index += 2; 
        }

因为前8个字节是魔数 加密之后无法识别 无法运行 这样加密之后 spring boot 项目无法运行 加密如果是简单的 str[i] = str[i] -4; 能正常运行 无法解释原因了

voidfrank commented 5 years ago

源码里用了 “strlen(dst)” 来获取要加密的class类的字节码长度,strlen 遇到'\0'就不往后数了,所以加密函数 “encode” 当你的类字节码里出现了'\0' 就不会进行加密。不知道是不是这个原因导致出现你说的问题的

Jaraxuss commented 4 years ago

源码里用了 “strlen(dst)” 来获取要加密的class类的字节码长度,strlen 遇到'\0'就不往后数了,所以加密函数 “encode” 当你的类字节码里出现了'\0' 就不会进行加密。不知道是不是这个原因导致出现你说的问题的

应该是这个问题,我这边对 Java_com_seaboat_bytecode_ByteCodeEncryptor_encrypt 作了一些修改,通过 jbyteArray 获取长度:

extern "C" JNIEXPORT jbyteArray JNICALL
Java_com_seaboat_bytecode_ByteCodeEncryptor_encrypt(JNIEnv *env, jclass cla, jbyteArray text)
{
    jsize len = (*env).GetArrayLength(text);

    char *dst = (char *)env->GetByteArrayElements(text, 0);
    encode(dst, len);
    env->SetByteArrayRegion(text, 0, strlen(dst), (jbyte *)dst);
    return text;
}