下载时修改可执行文件(如Ninite)

时间:2014-12-03 12:04:26

标签: c++ windows qt

我目前正在开发一个需要在下载时进行内部修改的应用程序(Windows)。 此外,我使用Linux主机提供它,因此,无法按照建议按需编译。
Ninite如何处理它? 在Ninite.com中,每次选择不同的选项时,都会获得相同的.exe,但内部稍作修改。

选项1
使用预定义数据编译程序(在Windows中) 使用PHP来查找文件并替换我的自定义字符串。

选项2
使用不同的资源文件附加原始.EXE

其他吗

是否有人开发过这样的东西?什么是最好的方法?
谢谢。

2 个答案:

答案 0 :(得分:1)

最便携的方式可能是在应用程序内部有一个插件(其路径在主程序中连线)。该插件将被修改(例如在Linux上通过生成C ++代码gencod.cc,分支g++ -Wall -shared -fPIC -O gencod.cc -o gencod.so编译,然后dlopen - ./gencod.so - 并且您的应用程序可以有所改进生成该插件的C ++源代码并进行编译。

我想在Windows上也可以这样做(我不知道)。可能问题是编译它(在Windows和Linux上编译命令会有所不同)。请注意Windows上的AFAIK进程无法修改自己的可执行文件(但您应该检查)。

Qt有一个便携式插件层。见QPluginLoader& Qt Plugins HowTo

或者,不要修改应用程序,而是使用一些persistent文件或数据(在一个定义明确的地方, - 在可执行文件中连接的位置或文件路径 - 最好采用文本格式,如{{3}保持不断变化的信息,或者使用JSON或真正的数据库。另请阅读sqlite

如果您需要实施特定的应用程序检查点,那么您可以在这个问题上尽早设计应用程序。研究application checkpointing算法(检查点过程类似于精确复制GC)并阅读有关garbage collection的更多信息。另请参阅continuations一个非常相似的问题。

答案 1 :(得分:1)

您只需将数据附加到原始可执行文件的背面即可。 Windows PE文件格式足够强大,这不会使可执行文件本身无效。 (但它会使任何现有的数字签名无效。)

如果预先知道其大小,那么找到这些数据的开头可能是一个挑战。在这种情况下,可能需要附加可变长度数据,然后附加数据长度(本身是固定长度字段 - 应该做4个字节)。要读取额外数据,请读取最后4个字节以获取数据长度。获取文件长度,为长度字段减去4,然后减去变量长度以获得数据的开始。