结合两个可执行文件

时间:2008-09-24 23:44:21

标签: c++ command-line assembly executable

我有一个命令行可执行文件,它可以改变我想从程序中使用的文件中的某些位。 是否可以创建自己的可执行文件使用此工具并仅分发一个可执行文件?

[编辑]澄清:

命令行工具采用偏移量和一些位,并在给定文件中更改此偏移处的位。所以我想为一个应用程序创建一个修补程序,将特定的位更改为一个特定的值,所以我能做的就是编写类似批处理文件的东西,但是我想创建一个执行它的可执行文件,即将工具嵌入到一个使用特定值调用它的包装器程序。

我可以在(windows)c \ c ++,asm中编写包装器,但是请不要.net。

8 个答案:

答案 0 :(得分:7)

滚动自己的程序实现比编写包装器更容易;这听起来像是微不足道的 - 只需打开文件,寻找合适的位置,写下你的位,关闭文件,你就完成了。

答案 1 :(得分:5)

最简单的方法是将此exe嵌入到您自己的exe中并将其写入磁盘以运行它。

答案 2 :(得分:3)

您可以将可执行文件作为二进制流资源添加到可执行文件中,当您需要它时,可以将其提取到临时文件夹中,并使用临时文件创建新进程。

执行此操作所需的确切代码取决于您是编写.Net还是C ++代码。

答案 3 :(得分:3)

简短回答:不。

简短回答:除非安装程序或自解压存档可执行,否则不会。

更长,更具推测性的答案:如果文件系统支持备用数据流,您可以将包含该实用程序的流添加到您的程序中,然后您的程序可以访问它自己的备用数据流,在您需要时提取该实用程序。 Ahaha。

答案 4 :(得分:3)

您可以将一个可执行文件附加到另一个可执行文件的末尾,并编写一些代码以将其解压缩到临时文件夹。

之前我做过类似的事情,但配置文件和一些位图附加到Windows中的EXE。我这样做的方法是首先将我的东西附加到EXE的末尾,然后在其后写一个小结构,其中包含数据的文件偏移量,在您的情况下,它将是第二个exe的偏移量。

运行你的应用程序时,寻找文件的末尾减去结构的大小,提取文件偏移量并将第二个exe文件复制到临时文件夹,然后启动它。

好的,这里有一些更详细的请求。这是一些用于创建组合EXE的伪代码。这是在编译主EXE后运行的一个小实用程序:

Open destination file
Open main exe as a binary file
Copy main exe to destination file
offset = size of main exe
Open 2nd exe as a binary file
Copy 2nd exe to the output file
Write the offset to the output file

现在进行提取程序。这将在您的主要EXE中进行:

Find the location of our own EXE file (GetModuleFileName() under Windows)
Open the file in binary mode
Seek to the end minus sizeof(offset) (typically 4 bytes)
Read the offset value
Seek to the offset position
Open a temporary file in binary mode
Read bytes from the main EXE and write to the temporary file
Launch the temporary file

答案 5 :(得分:1)

我认为为您的目的执行此操作的最简单方法可能是使用自解压可执行程序包。例如,使用像Paquet Builder这样的工具来打包exe(和你想要的任何其他文件),并且可以配置为在用户解压缩自解压时调用exe或批处理文件或其他任何你想要的东西可执行文件。

答案 6 :(得分:1)

如果exe构建为可重定位的(essentiall linker flag / fixed:no),你可以在它上面实际加载一个LoadLibrary,获取基地址,设置一个调用链并调用(跳转)到它中。这是不值得的,并且很少有exe这样构建,所以你必须有代码来重建它,此时你不会参加这个练习。

所以......不。

我更喜欢开发人员,他不介意用C / C ++ / asm编写,但是'不是.net' - 但显然是被fopen / fseek / fwrite所阻碍 - 因为那是你描述的所有程序听起来像是在做。

答案 7 :(得分:1)

我认为使用AutoIt's FileInstall function也可以做到这一点。为此,您必须设置AutoIt,使用FileInstall函数创建一个脚本以包含who exe,然后使用f.i. function RunWait执行它们。编译为exe,你应该完成。