将数据附加到exe

时间:2011-04-26 19:30:23

标签: exe portable-executable

此问题来自我之前问题的答案之一:how to save user registration in the exe... (C#)

这个想法本身对我来说仍然是一个新鲜事物,但似乎有道理。我第一次尝试从一个不同的应用程序内部向exe附加一个字符串不起作用。然后有点聪明,并尝试附加字节。仍然没有运气。

我在Windows Portable Executable文件中找到了各种文档:

http://en.wikipedia.org/wiki/Portable_Executable

http://msdn.microsoft.com/en-us/magazine/bb985997.aspx

http://msdn.microsoft.com/en-us/windows/hardware/gg463125

坦率地说,我明白这一点对他来说没什么用处。更多的使用我能够找到一个delphi教程,描述了向可执行文件添加“有效负载”的想法。它继续说要做到这一点,你需要让exe知道,并且还能够跟踪你把它放在哪里......或者其他东西。除了我从代码本身可以猜到的东西之外,我对delphi一无所知。 http://www.delphidabbler.com/articles?article=7&part=2

最有用的只是一个示例或如何在可执行文件中添加和检索一小段信息的链接。我想要从Linux服务器上的C#Forms应用程序执行此操作作为php脚本运行..我想一个独立的C ++应用程序接受信息,因为参数应该能够做到这一点。

我也对其他想法持开放态度。

谢谢。

2 个答案:

答案 0 :(得分:15)

是的,您将数据附加到定义的PE映像结束之外/之后。如果您不想处理PE头,可以进行简单的连接。

例如“echo abcd>> myprogram.exe”可以工作,导致'abcd'附加到'myprogram.exe'的末尾。 Myprogram.exe运行正常。然后,您只需要编写一种方法来查找附加数据(例如,通过查找最后一节的末尾来查找已定义图像的末尾的遍历标题,或者在稍后可以读取的EXE中的某处存储静态偏移)。例如,您可以将保存数据的偏移量存储在文件的最后4个字节中。然后你总是知道静态偏移是在EOF-4。

或者,如果您希望在加载过程时将附加数据加载到虚拟内存中,您实际上可以扩展PE图像的最后一部分并将数据放在那里。

在最后一节观察文件对齐,你需要扩展到下一个文件对齐(通常是0x200或0x1000),然后添加你的东西。

作为可见压缩机的作者,看过一些奇怪的PE,让我说没有坚定的规则,节表中定义的最后一节是图像中的最后一节(它们可能是乱序的)。也就是说,它们可能会出现故障。但是,除非由某些奇怪的链接器制作或使用某些外部实用程序进行修改,否则它们在99%的时间内处于有序状态。

我的打包器(PECompact)对'覆盖/额外数据仿真'BTW有beta支持 - 这意味着它可以实际压缩与EXE一起打开的数据,然后在内存中模拟其未压缩的形式你在EXE文件上做I / O.或者,它可以将额外数据/覆盖保留在文件外部并压缩其余部分,但调整读取和写入,以便物理偏移不会发生变化。这是必要的,因为SO MANY安装程序和SFX存档实际上通过静态偏移引用附加数据,而不是通过遍历PE头在运行时正确计算其位置。

除非你想保留签名,否则David Hall的链接比你需要做的多一点。该方法允许保存/使用数字签名,将数据插入文件末尾的扩展证书区域。

如果你不想,你根本不需要处理标题,也不关心保留代码签名!

答案 1 :(得分:10)

这是我用来向exe附加数据的一段代码的链接。这专门用于在不破坏exe签名的情况下附加数据,但原则应该只是附加到无符号可执行文件。

http://blog.barthe.ph/2009/02/22/change-signed-executable/