Как развернуть файловый ресурс, встроенный в программу C - PullRequest
4 голосов
/ 07 июля 2011

В GCC Linux, есть ли способ добавить файловый ресурс для статического встраивания в программу на C, а затем, как мне расширить его до / tmp из main ()?

Ответы [ 3 ]

3 голосов
/ 07 июля 2011

Вы можете использовать objcopy для встраивания ресурса, а затем обычные файловые операции для создания файла в /tmp.

.

Если вы скомпилируете эту программу:

#include <stdio.h>

extern char _binary_resource_bin_start, _binary_resource_bin_end;

int main() {
  FILE*out = fopen("/tmp/rsrc.bin","wb");
  fwrite(&_binary_resource_bin_start,
    &_binary_resource_bin_end - &_binary_resource_bin_start, 1, out);
  fclose(out);
}

с этим make-файлом:

program: program.o resource.o
    $(CC) -o program program.o resource.o

resource.o: resource.bin
    objcopy -I binary -O elf32-i386 -B i386 resource.bin resource.o

resource.bin:
    echo resource-file-contents > resource.bin

Я верю, что вы получите то, что хотите.

2 голосов
/ 07 июля 2011

Просто сохраните его как строку (char *).Если в него встроены значения NULL или вы не хотите использовать экранирование для кавычек, обратной косой черты и т. Д., Кодируйте его с помощью uuencode-, hex- или base64-кода и либо добавьте подпрограмму декодирования в вашу C-программу, либо вызовите ее извне.Просто используйте обычные файловые операции для записи данных в файл / tmp.

0 голосов
/ 08 июля 2011

Возможно, вы пытаетесь скрыть свой код PHP. Если это так, помните, что тривиально получить код PHP из сгенерированного исполняемого файла, даже не запуская последний. Если целью является сокрытие / запутывание, вы можете рассмотреть возможность использования кодировщика PHP.

...