C代码提取另一个文件

时间:2011-04-07 13:19:11

标签: c

我想制作 C程序,以便将另一个二进制文件提取到磁盘。

的形式
FILE *fp;
fp=fopen("libcurl.dll", "w");
fprintf(fp,"*OKJBJK09lkjhjG(**(G*I*()(KLJ(FG");
fprintf(fp,"fsd3r03rf-0)(-+_)H0F09E00FDS4asa");
......

是的,“w”模式和引号中的ASCII文字让我变得笨拙,但请尽量明白。

char c[129];
fp1=fopen("source.dll", "r");
fp2=fopen("dest.c", "w");
while(!eof(fp1))
{
for(i=0;i<128;c[i]=fgetc(fp1));
fprintf(fp2,   "fprintf(fp,\"%s\");",   c);
} 

此代码也是垃圾......

我想用它来提取 DLL和EXE ,而不是文本文件。问题是,如何从数据中生成相应的字符串,以及如何忠实地将它们写入磁盘?

我想在C中这样做。所以没有自动安装程序。

3 个答案:

答案 0 :(得分:1)

如果我理解正确,您希望创建一个C文件,您可以编译该文件以在执行时将二进制数据写入文件。以下是一些代码:

#include <stdio.h>

int main(void)
{
  FILE *fp1=fopen("source.dll", "rb");
  FILE *fp2=fopen("dest.c", "w");

  if ((fp1 == NULL) || (fp2 == NULL))
  {
    printf("Unable to open file\n");
    return 1;
  }

  fputs("#include <stdio.h>\n", fp2);
  fputs("int main(void)\n", fp2);
  fputs("{\n", fp2);
  fputs("  unsigned char file_data[] = {\n    ", fp2);

  while(!feof(fp1))
  {
    int len;
    int i;
    unsigned char buf[4096];
    len = fread(buf, 1, 4096, fp1);
    if (len <= 0)
    {
      break;
    }

    for (i = 0; i < len; i++)
    {
      fprintf(fp2,   "0x%02x, ", buf[i]);
    }
    fprintf(fp2, "\n    ");
  }
  fclose(fp1);
  fputs("  };\n", fp2);
  fputs("  FILE *fh = fopen(\"file.bin\", \"wb\");\n", fp2);
  fputs("  if (fh == NULL) { perror(\"fopen\"); return 1; }\n", fp2);
  fputs("  if (fwrite(file_data, 1, sizeof(file_data), fh) < 1)\n", fp2);
  fputs("    { perror(\"fwrite\"); return 1; }\n", fp2);
  fputs("  if (fclose(fh) != 0) { perror(\"fclose\"); return 1; }\n", fp2);
  fputs("  return 0;\n", fp2);
  fputs("}\n", fp2);
  fclose(fp2);
  return 0;
}

答案 1 :(得分:0)

这样的事情应该有效:

FILE *fin=fopen("source.dll", "r");
FILE *fout=fopen("source_dll.h", "w");

int size=0;
fprintf(fout,"char *source_dll_bytes={");

while(!feof(fin))
  fprintf(fout, "%s%d", size++==0?"":",", fgetc(fin));

fprintf(fout, "};\nint source_dll_size=%d;", size);

fclose(fout);
fclose(fin);

然后你只需#include "source_dll.h"并使用source_dll_bytessource_dll_size在运行时将其打印出来。

编辑:如果不清楚,fprintf 将无法正常工作将二进制数据写入磁盘上的文件。请改用fwrite

答案 2 :(得分:-1)

二进制文件以特定的格式存储。只有加载二进制文件的目标程序才知道格式,相应地解释文件内容。

例如,假设您要在二进制文件中写入两个整数。每个整数将占用4个字节,因此二进制文件的大小为8个字节。比方说,数字是16和32,并假设一切都是小端。

文件内容如下所示:十六进制:

1000000020000000

现在,如果以ASCII模式读取文件(如在记事本中打开它们),文件将如何显示?这些数据看起来很乱。

应该读取二进制文件的目标程序知道那里有两个整数,每个整数有4个字节长。因此程序将从文件中读取前4个字节并将其解释为整数。该程序将对接下来的4个字节执行相同的操作。

DLL和EXE也以特定格式编写,您需要先了解格式是什么。然后,您可以从中提取数据。