将数据附加到exe

emr*_*ins 15 exe portable-executable

这个问题扩展到我之前问题的一个答案:如何在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++应用程序接受信息作为参数应该能够做到这一点.

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

谢谢.

dya*_*sta 16

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

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

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

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

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

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

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

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


Dav*_*all 11

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

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

  • 一个很好的答案,但遗憾的是这种技术似乎不再有效:https://learn.microsoft.com/en-us/security-updates/securitybulletins/2013/ms13-098 (3认同)