用C

时间:2015-12-27 01:59:32

标签: c string replace binary segmentation-fault

我一直在研究一个相当大的程序并遇到了一个问题。我试图用我在这个网站上找到的another method替换二进制文件中的某个字符串。但是,我得到了一个"分段错误:11"当试图执行它。我只需要一种方法来将二进制文件中的字符串替换为另一个字符串。我已经尝试过其他方法,但有些方法只是破坏了整个二进制文件,当它们旧的并且新的二进制文件被并排比较时。这是我当前的功能代码不起作用:

int addBootArgs(char* bootArgs,char* iBECorig) {
  char* defaultArgs = "rd=md0 nand-enable-reformat=1 -progress";
  if (strlen(bootArgs) > strlen(defaultArgs)) {
    printf("Too many boot-args for iBEC to handle. It can only take %lu characters.\n",strlen(defaultArgs));
  exit(0);
  }
  if (strlen(bootArgs) < strlen(defaultArgs)) {
    for(int i = 0; i < 39; i++) {
      if (strlen(bootArgs) < strlen(defaultArgs)) {
        bootArgs = addVars(bootArgs," ");
      }
    }
  }
  printf("default-args =[%s]\n",defaultArgs);
  printf("userboot-args=[%s]\n",bootArgs);
  printf("Boot args length is %lu\n",strlen(bootArgs));
  FILE* iBECin = fopen(iBECorig,"rb");
  char* lastiBEC = addVars(tmpdir,"pwnediBEC");
  FILE* iBECout = fopen(lastiBEC,"wb");
  char line[50];
  while (fscanf(iBECin, "%s", line) != EOF) {
    if (strcmp(line, defaultArgs) == 0) {
      strcpy(line, bootArgs);
    }
    fprintf(iBECout, "%s", line);
  }
  fflush(iBECout);
  fclose(iBECin);
  fclose(iBECout);
  return -1;
}

此外,函数addVars();只是我需要快速组合两个字符串的东西,如果问题出现的原因是什么不是一个香草C函数,没有什么真正重要的。谢谢您的帮助!

1 个答案:

答案 0 :(得分:1)

  char line[50];
  while (fscanf(iBECin, "%s", line) != EOF) {
    if (strcmp(line, defaultArgs) == 0) {
      strcpy(line, bootArgs);
    }
    fprintf(iBECout, "%s", line);
  }

由于以下几个原因,您无法将scanf二进制数据转换为字符串:

  • 您的二进制数据非空终止,因此fscanf将继续扫描。
  • 您的缓冲区固定为50个字节,因此溢出

您需要的是fread()fwrite()

假设文件中的所有records都是39个字节,您可以在循环中执行以下操作:

  • fread()缓冲区中有39个字节。
  • memcmp()defaultArgs
  • 取决于结果,fwrite() ----ArgsiBECout