2012-04-05 385 views
0

我正在编写一个程序来破解CRC16。我一直在输出文件时遇到一些问题,并保留计算出来的CRC16(当我将它写入文件时,不知道为什么它会改变)。所以我在这里做的是读取输入文件,将其写入输出文件并使用一些乱码,然后再次读取输出文件并计算出它的CRC16。如果它与期望的CRC16匹配,那么就完成了。然而,在一堆执行之后,fgets()方法会因Seg错误而崩溃。fgets()在执行多次后崩溃

任何人都可以帮助我吗?请忽略性能问题,这是一个测试。

int main(int argc, char* argv[]){ 

     char outfile[strlen(argv[1])]; 
     strcpy(outfile,argv[1]); 

     strcat(outfile,".crack"); 

     char crc16[5]; 
     strcpy(crc16,argv[2]); 
     char newcrc16[5]; 
     char gebrish[80]; 
     char cat[2]; 
     int full = 1; 
     int p = 0; 
     int i,j,k; 


     for(i=32; i< 128;i++) 
       for(j=32; j< 128; j++) 
         for(k=32; k < 128; k++){ 
           gebrish[0] =i; 
           gebrish[1] =j; 
           gebrish[2] =k; 
           gebrish[3] = '\n'; 
           gebrish[4] ='\0'; 

           boost::crc_16_type result; 

           FILE* file; 
           FILE* out; 
           char line[100]; 

           printf("read out\n"); 
           out = fopen(outfile,"w"); 

           printf("read file\n"); 
           file = fopen(argv[1],"r"); 
       printf("wrt\n"); 
           while(fgets(line,80,file) != NULL){ 
             fputs(line,out); 
           } 
           fputs(gebrish,out); 

           fclose(file); 
           fclose(out); 

           printf("read gain\n"); 
           out = fopen(outfile,"r"); 

           while(fgets(line,80,out) != NULL){ 
             result.process_bytes(line,strlen(line)); 
             printf("%s",line); 
           } 

           int crc = result.checksum(); 

           sprintf(newcrc16,"%x",crc); 
           printf("%s",newcrc16); 

           if(strcmp(crc16,newcrc16) == 0){ 

             printf("%s",gebrish); 
             return 0; 

           } 
         } 



     return 0; 
} 
+0

哪个fgets崩溃?第一回路,第二回路还是其中一个? – stark 2012-04-05 21:49:55

回答

1

这导致缓冲区溢出:

char outfile[strlen(argv[1])]; 
strcpy(outfile,argv[1]); 

strcat(outfile,".crack"); 

,因为没有在outfile足够的空间用于终止空字符和".crack"。它将覆盖它不应该存在的内存,并且可能是是引起分段错误的原因。

更改为:

char outfile[strlen(argv[1]) + 1 + 6]; 
    strcpy(outfile,argv[1]); 

    strcat(outfile,".crack"); 

之前访问argv元素确保他们已通过检查argc提供:

if (argc > 2) 
{ 
    /* Safe to use argv[1] and argv[2]. */ 
} 

检查返回值从fopen()也。

+0

感谢有关缓冲区大小的说明。然而,错误并不存在,我修复了代码(我猜编译器在之前修复了它),但是它在同一时间给出了相同的错误和崩溃。 – 2012-04-05 20:57:56

0

该错误很可能是由于未检查打开的返回值,然后在坏文件上调用fgets。如果后续操作依赖于系统调用,则应始终检查系统调用的返回值。即使关闭也可能失败。

+0

我明白你的意思了,但我正在一个真正受控的环境中进行测试。文件将永远在那里。无论如何,它在一堆执行循环后崩溃,而不是在第一时间。另外,我需要知道它为什么崩溃,而不是如何避免崩溃。谢谢! – 2012-04-05 21:02:00

0

问题是,我试图在不同时刻读取和写入相同的文件,而无需在使用后调用fclose()。这种方式在循环执行一段时间后会以STATUS_VIOLATION崩溃。我不知道它为什么没有立即崩溃,但我所做的只是在读取CRC16计算文件后添加一个flcose()。