这个问题是我之前问题的答案之一的延伸:如何在exe中保存用户注册... (C#) https://stackoverflow.com/questions/5792793/how-to-save-user-registration-in-the-exe-c/5792913#5792913.
这个想法本身对我来说仍然很新,但似乎很有道理。我第一次尝试简单地将字符串附加到不同应用程序内部的 exe 中,但没有成功。然后变得聪明一点并尝试附加字节。还是没有运气。
我找到了有关 Windows 可移植可执行文件的各种文档:
http://en.wikipedia.org/wiki/Portable_Executable http://en.wikipedia.org/wiki/Portable_Executable
http://msdn.microsoft.com/en-us/magazine/bb985997.aspx http://msdn.microsoft.com/en-us/magazine/bb985997.aspx
http://msdn.microsoft.com/en-us/windows/hardware/gg463125 http://msdn.microsoft.com/en-us/windows/hardware/gg463125
坦白说,我了解的太少,它们对我来说没有多大用处。更有用的是,我找到了一个delphi教程,它描述了向可执行文件添加“有效负载”的想法。它接着说,要做到这一点,你需要让 exe 知道,并且能够跟踪你把它放在哪里......或者类似的东西。除了我可以从代码本身猜测之外,我对delphi一无所知。
最有用的只是如何在可执行文件中添加和检索一小段信息的示例或链接。我想要在作为 php 脚本运行的 Linux 服务器上的 C# 表单应用程序上执行此操作。我认为接受信息作为参数的独立 C++ 应用程序应该能够实现这一目的。
我也对其他想法持开放态度。
谢谢。
是的,您将数据附加到定义的 PE 映像的末尾/末尾。如果您不想处理 PE 标头,您可以进行简单的串联。
例如,“echo abcd >> myprogram.exe”将起作用,导致“abcd”附加到“myprogram.exe”的末尾。 Myprogram.exe 可以正常运行。然后,您只需要编写一种方法来查找附加数据(例如,遍历标头以通过查找最后一部分的末尾来查找定义图像的末尾,或者在 EXE 中的某个位置存储静态偏移量,以便稍后读取)。例如,您可以将保存数据的偏移量存储在文件的最后 4 个字节中。那么你总是知道静态偏移位于 EOF-4。
或者,如果您希望在进程加载时将附加数据加载到虚拟内存中,您实际上可以扩展 PE 映像的最后一部分并将数据放在那里。
注意最后一部分的文件对齐,您需要扩展到下一个文件对齐(通常为 0x200 或 0x1000),然后添加您的内容。
作为见过一些奇怪的 PE 的可执行压缩器的作者,我要说的是,没有固定的规则表明节表中定义的最后一个节是映像中的最后一个节(它们可能是无序的)。也就是说,它们可能会出现故障。然而,它们在 99% 的情况下都是有序的,除非由某些奇怪的链接器创建或使用某些外部实用程序进行修改。
我的打包机(PE紧凑型 https://bitsum.com/pecompact/)对“覆盖/额外数据模拟”BTW 提供测试版支持 - 这意味着它实际上可以与 EXE 一起压缩末尾的数据,然后在对 EXE 文件执行 I/O 时在内存中模拟其未压缩的形式。或者,它可以将额外数据/覆盖保留在文件外部并压缩其余部分,但调整读取和写入,以便物理偏移量不会改变。这是必要的,因为很多安装程序和 SFX 存档实际上通过静态偏移引用附加数据,而不是通过遍历 PE 标头在运行时正确计算其位置。
David Hall 的链接的作用比您需要做的多一点,除非您想保留签名。该方法确实允许保存/使用数字签名,将数据插入文件末尾的扩展证书区域。
如果您不想,则根本不需要处理标头,并且不关心保留代码签名!
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)