首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

一个小疑点,不管你懂没懂,反正小弟我是没懂…

2012-08-03 
一个小问题,不管你懂没懂,反正我是没懂……C/C++ codevoid JNICALL cbClassFileLoadHook(jvmtiEnv *jvmti_en

一个小问题,不管你懂没懂,反正我是没懂……

C/C++ code
void JNICALL cbClassFileLoadHook(jvmtiEnv *jvmti_env, JNIEnv* env,                jclass 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){    char *r="com/yy/hunter";    char *p;    p=strstr(name,r);    if(p){        printf("需要解密的class name=%s\n", name);        //此处解密;        enter_critical_section(jvmti_env);         {            printf("开始解密a%s\n",name);            printf("%s\n",class_data);            unsigned char key[] = "hsylgwk-20120101";            AES aes(key);            //int o_len = aes.getUCharLen(class_data);            //printf("class_data len=%s\n",o_len);            printf("class_data len=%s\n","aaaaaaaaaaaaaaaaaaaaaaaaaaa");            char* old_data;            old_data = (char *)allocate(jvmti_env, class_data_len);            (void)memcpy((void*)old_data, (void*)(class_data), (int)class_data_len);            //memcpy(old_data,class_data,class_data_len);            printf("%s\n",old_data);                        printf("%s\n","bbbbbbbbbbbbbbbbbbbbbbbbb");                        char hex_data[1024];            //memset(hex_data, 0, 20);            aes.Bm53InvCipher(old_data, hex_data);            printf("%s\n",hex_data);            printf("%s\n","cccccccccccccccccccccccccccccc");            unsigned char *de_hex_data = (unsigned char *)malloc(strlen(hex_data));            //strcpy(de_hex_data,hex_data);            memcpy(de_hex_data,hex_data,strlen(hex_data));            aes.InvCipher(de_hex_data);            printf("%s\n",de_hex_data);            printf("%s\n","ddddddddddddddddddddddddddddddd");            //int nLen = strlen(old_data);            unsigned int len = strlen((char*)old_data);            m_pJvmTI->Allocate(len, (unsigned char **)&old_data);            free(old_data);                        printf("%s\n","eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee");                    }        exit_critical_section(jvmti_env);    }   }


为什么每执行一次打印出来的class_data都自动在后面加上了一些乱的字符呢?看一下运行结果。。。。

开始解密acom/yy/hunter/servlet/UploaderServlet
27781ec819a6cca1c56f47da4faedf2c27781ec819a6cca1c56f47d
a4faedf2c27781ec819a6cca1c56f47da4faedf2c?R
class_data len=aaaaaaaaaaaaaaaaaaaaaaaaaaa
27781ec819a6cca1c56f47da4faedf2c27781ec819a6cca1c56f47d
a4faedf2c27781ec819a6cca1c56f47da4faedf2c?R!
bbbbbbbbbbbbbbbbbbbbbbbbb
360TOP1奢侈品360TOP1奢侈品360TOP1奢侈品hD?娌舞8?騿矓#
cccccccccccccccccccccccccccccc
@
BzC&T斘抴?360TOP1奢侈品360TOP1奢侈品hD?娌舞8?騿矓#葺葺葺葺葺葺n钢

ddddddddddddddddddddddddddddddd


开始解密acom/yy/hunter/servlet/UploaderServlet
27781ec819a6cca1c56f47da4faedf2c27781ec819a6cca1c56f47d
a4faedf2c27781ec819a6cca1c56f47da4faedf2cZt)l
class_data len=aaaaaaaaaaaaaaaaaaaaaaaaaaa
27781ec819a6cca1c56f47da4faedf2c27781ec819a6cca1c56f47d
a4faedf2c27781ec819a6cca1c56f47da4faedf2c't)l
bbbbbbbbbbbbbbbbbbbbbbbbb
360TOP1奢侈品360TOP1奢侈品360TOP1奢侈品燩'?
cccccccccccccccccccccccccccccc
@
BzC&T斘抴?360TOP1奢侈品360TOP1奢侈品燩'慅葺葺葺?集?
ddddddddddddddddddddddddddddddd



开始解密acom/yy/hunter/servlet/UploaderServlet
27781ec819a6cca1c56f47da4faedf2c27781ec819a6cca1c56f47da4faed
f2c27781ec819a6cca1c56f47da4faedf2c S vl
class_data len=aaaaaaaaaaaaaaaaaaaaaaaaaaa
27781ec819a6cca1c56f47da4faedf2c27781ec819a6cca1c56f47da4faed
f2c27781ec819a6cca1c56f47da4faedf2c>S At
bbbbbbbbbbbbbbbbbbbbbbbbb
360TOP1奢侈品360TOP1奢侈品360TOP1奢侈品hD?娌舞8?騿矓#


cccccccccccccccccccccccccccccc
@
BzC&T斘抴?360TOP1奢侈品360TOP1奢侈品hD?娌舞8?騿矓#葺葺葺葺葺葺?]闧b

ddddddddddddddddddddddddddddddd



正确的字串是27781ec819a6cca1c56f47da4faedf2c27781ec819a6cca1c56f
47da4faedf2c27781ec819a6cca1c56f47da4faedf2c
,但是每次都自动加了一些内容到这个字串后面。。。,不知道为什么,求解……



[解决办法]
楼主是学java出身的?没听说过\0结束符?
[解决办法]
楼主搞java里面是不是没有字符串结束符这个概念啊?你需要注意下是不是有些地方使用memcpy等函数或者定义字符串的时候,最好有个'\0'。如果我说的不清楚,麻烦你自己去谷歌下C语言的字符串结束符
[解决办法]
类似

C/C++ code
char hex_data[1024];//memset(hex_data, 0, 20); 为啥要注释这行呢?加上吧,同时把最后的20改为1024memset(hex_data, 0, 1024);
[解决办法]
C语言里没有字符串这种数据类型。

于是规定用字符串的时候就是,一堆以'\0'结尾的字符。


[解决办法]
C语言里没有字符串这种数据类型。

于是规定用字符串的时候就是,一堆以'\0'结尾的字符。

 

[解决办法]
字符串结束符

热点排行