|
int main(argc, argv)
int argc;
char *argv[];
{
FILE *fp;
FILE *fo;
char buf[256];
char src[]=/*"8BgMHdmA3Qg9IbJmntlZoZQoHwcwg5nnm7+fMr2ywFxakaamb40d1Q==";*/ /*prvtlob.plb的编码内容*/
"";
char tra[]="**CE"; /*sys.idltranslate表内容存到字符数组"*/
char *b64;
char *dec;
int i=0;
int j=0;
int flag=0;
int len_src;
int len_wrap;
int pos=0;
int size=0;
Byte *compr, *uncompr;
uLong comprLen = 250000*sizeof(int); /* don't overflow on MSDOS */
uLong uncomprLen = comprLen;
b64=(char *) malloc(2560000);
dec=(char *) malloc(2560000);
/*
printf("src:\t%s\n",src);
printf("b64:\t%s\n",encode(src,&b64));
printf("dec:\t%s\n",decode(b64,&dec));
*/
for (i=0;i<256;i++) /*将16进制恢复成字符*/
{
tra[i]=((tra[i*2]-'A'>=0?tra[i*2]-'A'+10:tra[i*2]-'0')&0xF)<<4|
((tra[i*2+1]-'A'>=0?tra[i*2+1]-'A'+10:tra[i*2+1]-'0')&0xF);
/* strncpy(dec,tra+i*2,2);dec[2]='\0';
tra[i]=strtol(dec,NULL,16);*/
/*printf("%02X\t",tra[i]&0xFF);*/
}
/*printf("%x,%x",tra[0x30],tra[0x83]);*/
if(NULL==(fp=fopen("prvtrctf.plb","rt")))
exit(1);
if(NULL==(fo=fopen("testout.sql","wt")))
exit(1);
while(1) /* read many blocks */
{
if(feof(fp))
break;
/*fseek(fp,pos)*/
while(!feof(fp))
{
fgets(buf,255,fp);
if(strcmp(buf,"abcd\n")==0)
{
flag=1;
}
else
{
if(flag==1)
{
flag=2;
/*fscanf(fp,"%s",);*/
printf("type code:\t%s",buf); /*type code:9 package,d body*/
}
else if(flag==2)
{
sscanf(buf,"%x %x\n",&len_src,&len_wrap);
printf("len_src:\t%d\tlen_wrap:\t%d\n",len_src,len_wrap); /*store base64 code to dec*/
printf("freadsize:%d\t",size=fread(dec,1,len_wrap,fp));
if(size==len_wrap)
{
dec[len_wrap]='\0';
}
else
{
printf("fread err\n");
exit(1);
}
/*printf("BASE64:\t %s",dec);*/
pos=ftell(fp);
flag=0;
break;
}
}
}
for(i=0,j=0;i<len_wrap;i++) /*trim \n*/
{
if(dec[i]!='\n')
b64[j++]=dec[i];
}
b64[j]='\0';
decode(b64,&dec);
printf("read ok\n");
compr = (Byte*)calloc((uInt)comprLen, 1);
uncompr = (Byte*)calloc((uInt)uncomprLen, 1);
printf("-->%lx,%lx,%lx,%lx\n",b64,dec,compr,uncompr);
printf("b64 size:\t%d,%d\n",j,strlen(b64));
for (i=20;i<j/4*3;i++) /*translaate*/
{
compr[i-20]=tra[dec[i]&0xFF]&0xFF;
}
/* compr and uncompr are cleared to avoid reading uninitialized
* data and to ensure that uncompr compresses well.
*/
if (compr == Z_NULL || uncompr == Z_NULL) {
printf("out of memory\n");
exit(1);
}
test_inflate(compr, comprLen, uncompr, uncomprLen); /*从第21字节开始解压*/
/*uncompr[21]='\0';*/
uncompr[1000000-1]='\0';
printf("unzip size:%d\n",strlen(uncompr));
/* printf("inflate:\t%s",uncompr);*/
fprintf(fo,"%s",uncompr);
/*free(compr);*/
free(uncompr);
printf("-->%lx,%lx,%lx,%lx\n",b64,dec,compr,uncompr);
}
free(b64);
free(dec);
fclose(fp);
fclose(fo);
return 1;
}
原解码函数动态申请空间,改成下面的
char *decode(const char *cptr,char **rptr)
{
char *res;
int clen,len;
static int init=0;
if(cptr==NULL)
return NULL;
len=strlen(cptr);
if(len%4) /*编了码的字符绝对是4的倍数*/
return NULL;
if(!init)
{
init=1;
base64_tableinit();
}
clen=len/4;
/* if((res=malloc(len-clen))==NULL)
return NULL;*/
res=*rptr;
for(*rptr=res;clen--;)
{
*res=base64_table[*cptr++]<<2&0xfc; /*cptr后六位移动到最高位*/
*res++|=base64_table[*cptr]>>4; /*跟着下个字符低两位给res低两位*/
*res=base64_table[*cptr++]<<4&0xf0; /*填充res高四位其它清0*/
*res++|=base64_table[*cptr]>>2&0x0f; /*字符前六位移到低六位取低四位*/
*res=base64_table[*cptr++]<<6;
if(*cptr!='=') /*=号忽略*/
*res++|=base64_table[*cptr++];
}
return *rptr;
}
[[i] 本帖最后由 〇〇 于 2009-6-23 13:37 编辑 [/i]] |
|