Доступ к данным, добавленным в двоичный файл ELF - PullRequest
5 голосов
/ 14 апреля 2011

У меня есть статический двоичный файл ELF, который читает данные из zip-файла.Чтобы упростить распространение, я хочу добавить zip-файл в двоичный файл следующим образом:

$ cat mydata.zip >> mybinary

Я знаю, что это не повредит mybinary, но я не знаю, как получить доступ к содержимомуиз mydata.zip сделав это.Является ли это возможным?Если да, то как?

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

Супер-экстра-двойные плюсы повсюду, если решение работает на OS X и MinGW.

Ответы [ 2 ]

2 голосов
/ 14 апреля 2011

Исходя из предположения, что в начале выполнения приложения у вас есть доступ к файлу, открытие дескриптора к нему должно препятствовать стиранию файла операционной системой на диске до тех пор, пока не будет закрыта последняя ссылка на файл.,Это позволит вам без труда искать файл, используя этот дескриптор файла.

Создать глобальную переменную:

int app_fd;

Процесс для большинства из них одинаковв основной процедуре просто введите:

app_fd = open(argv[0], O_RDONLY);

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

Во время выполнения, если у вас нет какой-либо формыОбращайтесь к исходному содержимому приложения, тогда вы, вероятно, не сможете получить доступ к содержимому zip-файла.Это связано с тем, что загрузчик отображает только те разделы файла, которые ожидаются.Содержимое в конце двоичного файла будет считаться мусором, а не отображаться в нем.

Чтобы выполнить сопоставление zip-файла с памятью, вам нужно будет придерживаться другой тактики.Вам нужно будет вставить .zip в раздел ELF (linux) / COFF (Windows) / Mach-O (Mac OS X) бинарного файла, свойства которого установлены так, чтобы он гарантированно отображался в приложении (для этого требуетсямного предварительной работы в приложении и много дополнительной обработки в процессе обработки).Это не тривиально, и, вероятно, включает в себя довольно много кода, чтобы сделать его правильным для каждой из платформ.

Кроме того, нетрудно удалить приложение из системы Windows во время его работы (Я думаю, что вы можете переместить его, если он находится на NTFS, хотя).

0 голосов
/ 02 июня 2016

Если вы объединяете файл ELF и файл zip, результирующий файл будет и (AFAIU) действительным файлом ELF и действительным файлом zip.

Демонстрация:

$ gcc hello.c -o hello
$ ./hello
Hello
$ (cat hello ; test.zip) > hello2
$ chmod u+x hello2
$ ./hello2
Hello
$ unzip ./hello2
Archive:  ./hello2
warning [./hello2]:  6704 extra bytes at beginning or within zipfile
(attempting to process anyway)
  Length      Date    Time    Name
---------  ---------- -----   ----
   119458  1999-11-24 13:08   hello.txt

Многие библиотеки (zlib, zzip) (ошибочно?) Не распознают такой файл как допустимый zip-файл, но libminizip может это сделать:

#include <stdio.h>
#include <errno.h>
#include <minizip/unzip.h>

int main(int argc, char** argv)
{
  unzFile uf = unzOpen(argv[0]);
  unzGoToFirstFile(uf);
  char filename_inzip[256] = {0};
  unz_file_info64 file_info = {0};
  const char *string_method = NULL; 
  unzGetCurrentFileInfo64(uf, &file_info, filename_inzip, sizeof(filename_inzip), NULL, 0, NULL, 0);
  printf("%s\n", filename_inzip);    
  return 0;
}

Дает:

$ ./unzipme2
foo.txt
...