Jub*_*ian 7 c exe elf portable-executable
有几个问题涉及这个问题的某些方面,但似乎都没有完全回答它.整个问题可归纳如下:
我的特定用例是一个解释器,我想让用户能够用解释器二进制文件和他提供的代码生成一个单独的文件可执行文件(解释器二进制文件是必须用它修补的可执行文件).用户提供的代码作为二进制数据).
类似的情况是自解压存档,其中程序(存档实用程序,如zip)能够构造这样的可执行文件,其中包含预构建的解压缩程序(已编译的可执行文件)和用户提供的数据(内容)存档).显然,此过程中不涉及编译器或链接器(感谢,Mathias为注释并指出7-zip).
使用现有问题,解决方案的特定路径如下所示:
将数据附加到exe - 这涉及向任意exes添加任意数据的方面,而不涉及如何实际访问它(基本上简单的追加通常有效,对于Unix的ELF格式也是如此).
在没有/ proc/self/exe的情况下查找当前可执行文件的路径 - 与上述相同,这将允许获取用于打开exe的文件名,以访问添加的数据.还有更多这类问题,但是它们都没有特别关注获得适合于实际将二进制文件作为文件打开的目的的路径问题(单独的目标可能(?)更容易实现 - 真的你不要甚至不需要路径,只是打开阅读的二进制文件.
除了填充二进制文件并打开文件以进行读取之外,还可能存在其他可能更优雅的方法.例如,可执行文件可以使得以后使用任意大小的数据对其进行修补变得相当简单,因此它它出现在某个正确的数据段"内"?(我真的找不到任何东西,对于固定大小的数据,它应该是微不足道的,尽管除非可执行文件有一些哈希值)
这可以做得相当好,与标准C的偏差尽可能小吗?甚至或多或少的跨平台?(至少从维护的角度来看)请注意,如果执行二进制数据添加的程序不依赖于编译器工具(用户可能没有),那么首选,但是需要这些工具的解决方案也可能有用. .
请注意已经编译的可执行标准(上面列表中的第一点),这需要一种完全不同于C/C++与GCC之类的问题中描述的解决方案:静态地将资源文件添加到可执行文件库或SDL嵌入图像内部的程序可执行文件中,要求嵌入数据编译时.
补充说明:
上面列出并在一些注释中提出的明显方法的问题,即只是附加到二进制文件并使用它,如下所示:
这取决于您希望其他系统如何查看您的二进制文件。
exe 格式允许验证文件自发布以来未被修改。这将使您能够:-
遵循该系统的优点是“每个人”都同意您的文件自签名以来没有被修改。
实现此方案的最简单方法是使用资源。Windows 资源可以在链接后添加。它们受到authenticode数字签名的保护,您的程序可以从自身提取资源数据。
过去可以增加签名以包含二进制数据。不幸的是,这已被禁止。有些二进制文件使用签名部分中的数据。不幸的是,这被恶意使用了。一些详细信息请参见msdn 博客
如果不能重新签名,那么结果将被视为不安全。这里值得注意的是,附加数据是不安全的,并且可以在人们无法察觉的情况下进行修改,但二进制文件中的代码也是如此。
将数据附加到二进制文件确实会破坏数字签名,并且还意味着最终用户无法判断代码是否已被修改。
这意味着您为确保数据 blob 仍然安全而添加到代码中的任何自我保护都不会阻止您的代码被修改以删除检查。
WindowsGetModuleFileName允许找到运行路径。
Linux 提供/proc/self或/proc/pid.
Unix 似乎没有可靠的方法。
zip 格式的方法是将目录写入文件末尾。这意味着可以在该位置的末尾找到数据,然后向后查找数据的开头。这里的优点是数据块是从数据的末尾而不是自然的开始开始的。
| 归档时间: |
|
| 查看次数: |
1435 次 |
| 最近记录: |