访问附加到ELF二进制文件的数据

我有一个静态ELF二进制从zipfile中读取数据。 为了简化分发,我想将zip文件附加到二进制文件中,如下所示:

$ cat mydata.zip >> mybinary 

我知道这样做不会破坏mybinary,但是我不知道如何访问mydata.zip的内容。 可能吗? 如果是这样,怎么样?

在过去,我使用附加数据的附加技巧来追加数据的长度,所以我所要做的就是打开二进制文件,读取stream的最后一个int,然后重新开始解压缩,但是由于各种原因,在这里不起作用(例如,当需要zip文件时,我不能保证文件仍然在光盘上)。

如果解决scheme跨OS X和MinGW工作,则可以全面超级双分。

Solutions Collecting From Web of "访问附加到ELF二进制文件的数据"

在开始执行应用程序的前提下,您可以访问该文件,然后打开该文件的句柄应该防止操作系统在文件的最后一个引用关闭之前删除磁盘上的文件。 这将允许你通过文件寻找你的心的内容,使用该文件句柄,而不用担心。

创建一个全局变量:

 int app_fd; 

其中大部分的过程是相同的,在主要的例程,简单的问题:

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

在执行的开始。 当涉及到需要访问压缩文件的执行点时,只需使用文件描述符而不是文件名即可。

在运行时,如果您对应用程序的原始内容没有某种形式的处理,则可能无法访问zip文件的内容。 这是由于在预期的文件的部分只加载器映射。 二进制结尾处的内容将被视为垃圾并且未被映射。

要完成zip文件到内存的映射,您需要遵循不同的方法。 您需要将.zip嵌入到二进制文件的ELF(linux)/ COFF(Windows)/ Mach-O(Mac OS X)部分,该部分的属性被设置为保证映射到应用程序中在应用程序中进行大量的前期工作,并在处理中进行更多的后期工作)。 这不是微不足道的,而且可能需要相当多的编码才能使每个平台都适合。

另外,在应用程序正在运行的时候,从Windows系统中删除一个应用程序并不是一件容易的事情(我认为如果它驻留在NTFS上,也可以将其移动)。

如果连接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