Подтвердить что ты не робот

Есть ли стандартный способ встраивания ресурсов в исполняемый образ Linux?

Встраивать двоичные ресурсы в PE-изображения (EXE, DLL) с помощью Windows API довольно просто: (см. http://msdn.microsoft.com/en-us/library/ms648008(v=VS.85).aspx).

Есть ли аналогичный стандартный API в Linux?

или, возможно, какой-то де-факто подход к встраиванию ресурсов?

Цель состоит в том, чтобы внедрить некоторые статические двоичные и/или текстовые данные в исполняемый файл, например. фотографии, HTML и т.д., так что бинарный дистрибутив программы так же просто, как сделать одну копию файла? (предполагая, что все зависимости библиотек в порядке)

Обновление:

Следующее предложение bdk, я пробовал решение, описанное в Вложение двоичных blobs с использованием gcc mingw, и это сработало для меня, Хотя, есть некоторые проблемы, о которых стоит упомянуть: мой проект (в Code:: Blocks) состоит из нескольких файлов С++ и добавления двоичных данных в любой из соответствующих объектных файлов, которые они бесполезны для взлома. objdump -x будет показывать, что большинство символов прошло после внедрения (и я не нашел, как это исправить). Чтобы преодолеть эту проблему, я добавил пустой проект .cpp файл в проект с единственной целью предоставить объектный файл для воспроизведения и написал следующий шаг пользовательской сборки для этого файла, который сделал работу красиво (например, использует макросы Code:: Blocks ):

$compiler $options $includes -c $file -o $object
ld -Ur -b binary -o $object <binary payload path>
4b9b3361

Ответ 1

Сделайте себе файл ассемблера, blob.S:

    .global blob
    .global blob_size
    .section .rodata
blob:
    .incbin "blob.bin"
1:
blob_size:
    .int 1b - blob

Скомпилировать с gcc -c blob.S -o blob.o Теперь к блоку можно получить доступ из вашей программы на C:

extern uint8_t blob[];
extern int blob_size;

Использование конвертера bin2c обычно работает нормально, но если blob большой, решение incbin намного быстрее и использует гораздо меньше памяти (время компиляции)

Ответ 2

objcopy --add-section позволяет вам добавить произвольный файл в виде раздела в исполняемый файл ELF. (справочная страница пользователя). Однако это лишь половина решения, поскольку я еще не нашел способ получить доступ к этим данным изнутри программы C, кроме как путем загрузки и анализа двоичного файла ELF с использованием библиотеки ELF.

Изменить Дополнительная информация:

Если у вас есть скомпилированная программа MyProgram и файл ресурсов MyResource.dat, который вы хотите встроить в MyProgram, вы можете использовать команду objcopy следующим образом:

objcopy MyProgram --add-section MyResource=MyResource.dat

Теперь, если вы посмотрите на свою программу, используя команду   objdump -x MyProgram

Вы увидите раздел MyResource, который содержит содержимое MyResource.dat. Файл теперь встроен в исполняемый файл.

Трюк теперь, как вы получаете доступ к данным из вашей программы. Мой инстинкт подсказывает мне, что загрузчик должен куда-то помещать файл в память, и вы можете получить указатель на него, но я не уверен, как это сделать просто. В идеале я бы хотел, чтобы у меня была возможность развернуть мой exeutable и dlsym раздел, но это не работает, потому что его раздел, а не символ.

Единственная альтернатива, которую я знаю для доступа к разделу изнутри программы, - это использовать библиотеку libelf или что-то подобное, что немного напоминает использование кувалды, чтобы постучать в гвоздь. Вы можете использовать его в своем приложении для загрузки себя в качестве ресурса ELF и получения разделов. Документация разрежена, но вот пример

http://em386.blogspot.com/2007/03/quick-libelf-guide.html

Мне бы очень понравилось, если бы кто-то мог прослушивать более простой способ доступа к данным из -add-раздела.

Изменить 2 В моих исследованиях я включил этот вопрос: Встраивание бинарных капель с использованием gcc mingw

Что должно работать как для gcc, так и для mingw и показывает способ использования ld вместо objcopy для добавления данных и доступа к нему в качестве символа. Выглядит многообещающе

Ответ 3

Конечно. Попробуйте что-то вроде конвертер Bin2Hex. Преобразуйте двоичные данные в массив С++ char, а затем вставьте его в свой код как константную переменную.

Ответ 4

как насчет makeself

он сделает архив tar из каталога, в котором вся ваша программа, файлы ресурсов в исполняемый файл оболочки. И когда пользователь запускает исполняемый файл, он будет извлекать файлы и запускать произвольную команду (может быть основной исполняемый файл программы). Там недостаток, который каждый раз, когда пользователь запускает исполняемый файл, потребуется сначала загрузить/извлечь файлы, прежде чем запускать настоящую программу.