使⽤xxtea算法对java字节码进⾏加密的尝试
java字节码简介
java为了实现跨平台的特性,编写完代码,需要通过javac命令⽣产JVM所需要的class字节码⽂件。class⽂件是⼆进制的⽂件,⾥⾯存储的内容是16进制。通过javap命令可以查看具体的class信息,如下:
javap -c -s -v -l Crypto.class
在windows下也可以直接使⽤winhex⼯具打开:
前四个字节是魔数的标识:0xCAFEBABE,16进制的固定值。后⾯的相关参数可以参考jvm的相关规范进⾏查。
尝试使⽤xxtea进⾏加密
2、cd到example⽬录下,并将上级⽬录的xxtea.c和xxtea.h拷贝到本⽬录下。
3、修改test.c⽂件
这⾥⾯需要注意的是,读取class字节的时候,需要使⽤unsigned char类型来存储,否则会出现越位问题:⼗六进制的CA会显⽰为ffffffCA。字符输出的时候,以16进制输出:printf("%x\n", xxx);
#ifdef _WIN32
#pragma comment(lib, "xxtea.lib")
#endif
#include <stdio.h>
#include <string.h>
#include <xxtea.h>
#include "base64.h"
int main() {
FILE *fid;
fid = fopen("/root/Crypto.class","rb");
if(fid == NULL){
printf("读取⽂件出错");
return;
}
//获取⽂件⼤⼩
fseek (fid , 0 , SEEK_END);
long size = ftell (fid);
rewind (fid);
//开辟存储空间
int num = size/sizeof(char);
unsigned char *pos = (unsigned char*) malloc (sizeof(unsigned char)*num); if (pos == NULL)
{
printf("开辟空间出错");
return;
}
fread(pos,sizeof(char),num,fid);
int i = 0;
for(i = 0; i < num; i++)
printf("%x\n", pos[i]);
fclose(fid);
const unsigned char *text = pos;
const char *key = "1234567890";
size_t len;
unsigned char *encrypt_data = xxtea_encrypt(text, num, key, &len);
char * base64_data = base64_encode(encrypt_data, len);
printf("%s\n", base64_data);
unsigned char *decrypt_data = xxtea_decrypt(encrypt_data, len, key, &len);    for(i = 0; i < num; i++)
printf("%x\n",decrypt_data[i]);
if (strncmp(text, decrypt_data, len) == 0) {
printf("success!\n");
}else {
printf("fail!\n");
}
free(pos);    //释放内存
free(encrypt_data);
free(decrypt_data);
java源代码加密free(base64_data);
return 0;
}
编译源码
gcc test.c xxtea.c base64.c -o main
执⾏
./main
将输出的内容,拷贝到两个⽂本⽂件,然后使⽤对⽐⼯具进⾏⽐对,可以发现字节码加密后然后再解密与之前的能完全对得上。结论

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。