C-код для извлечения другого файла - PullRequest
0 голосов
/ 07 апреля 2011

Я хочу создать 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 ]

1 голос
/ 07 апреля 2011

Если я правильно понимаю, вы хотите создать файл 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;
}
0 голосов
/ 07 апреля 2011

Что-то вроде этого должно работать:

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_bytes и source_dll_size, чтобы распечатать его во время выполнения.

Редактировать: Просто вЕсли это неясно, fprintf не будет работать для записи двоичных данных в файл на диске.Вместо этого используйте fwrite.

0 голосов
/ 07 апреля 2011

Двоичные файлы хранятся в определенном формате .Только предполагаемая программа, которая загружает двоичные файлы, знает формат и интерпретирует содержимое файла соответственно.

Например, предположим, что вы хотите записать два целых числа в двоичном файле.Каждое целое число займет 4 байта, поэтому двоичный файл будет иметь размер 8 байтов.Допустим, числа равны 16 и 32, а также предполагается, что все имеет порядок байтов.

Содержимое файла будет выглядеть следующим образом в шестнадцатеричном виде:

1000000020000000

Теперь, как файл будетПохоже, если они читаются в режиме ASCII (например, открывая их в блокноте)?Данные будут выглядеть бессмысленно.

Предполагаемая программа, которая должна читать двоичные файлы, знает, что там есть два целых числа, каждое из которых имеет длину 4 байта.Таким образом, программа будет считывать первые 4 байта из файла и интерпретировать их как целое число.Программа будет делать то же самое для следующих 4 байтов.

DLL-файлы и EXE-файлы также записаны в определенном формате, и вам необходимо сначала узнать, что это за формат.Затем вы можете извлечь данные из них.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...