Записать встроенный исполняемый файл из программы на C в файл - PullRequest
0 голосов
/ 30 августа 2018

Я пытаюсь встроить исполняемый двоичный файл в другой, а затем записать первый двоичный файл в файл.

Я успешно достиг этого с помощью простого текстового файла, но когда дело доходит до написания исполняемого файла, я не могу заставить его работать.

Например, я хочу скопировать /usr/bin/ls в ls2, вот что я попробовал

  • Первый: objcopy --input binary --output elf64-x86-64 --binary-architecture i386 /usr/bin/ls lss.o

  • код C:

    #include <stdio.h>
    
    FILE *f;
    
    extern char _binary_lss_start;
    extern char _binary_lss_end;
    
    main()
        {
        f = fopen("lss", "w");
        fprintf(f, &_binary_lss_start);
        fclose(f);
        return 0;
    }
    
  • Компиляция: gcc main.c lss.o

Код успешно скомпилирован, но когда я пытаюсь ./a.out ничего не записывается в lss.

(я использую Arch Linux 4.18.5 и gcc 8.2.0.)

Могу ли я достичь этого?

1 Ответ

0 голосов
/ 30 августа 2018

Как уже упоминалось @jww, вы должны использовать fwrite. fprintf ищет строку с нулем в конце _binary_lss_start, с которой он может столкнуться в самом первом байте и ничего не записать.

#include <stdio.h>

FILE *f;

extern char _binary_lss_start;
extern char _binary_lss_end;
int main(int c, char *v[])
{
    size_t size_to_write = &_binary_lss_end - &_binary_lss_start;

    f = fopen("lscpu2", "w");
    if (f != NULL) {
        printf("Writing %ld bytes\n", size_to_write);
        fwrite(&_binary_lss_start, 1, size_to_write, f);
        fclose(f);
    } else {
        printf("File not found [%s]\n", "lss");
    }
    return 0;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...