我目前正在开发一个需要在下载时进行内部修改的应用程序(Windows)。
此外,我使用Linux主机提供它,因此,无法按照建议按需编译。
Ninite如何处理它?
在Ninite.com中,每次选择不同的选项时,都会获得相同的.exe,但内部稍作修改。
选项1
使用预定义数据编译程序(在Windows中)
使用PHP来查找文件并替换我的自定义字符串。
选项2
使用不同的资源文件附加原始.EXE
其他吗
是否有人开发过这样的东西?什么是最好的方法?
谢谢。
答案 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,然后减去变量长度以获得数据的开始。