结合两个可执行文件

时间:2020-03-06 14:41:48  来源:igfitidea点击:

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

[编辑]澄清:

命令行工具获取一个偏移量和一些位,并在给定文件中更改此偏移量的位。因此,我想为将特定位更改为特定值的应用程序创建一个修补程序,因此我可以写一些类似批处理文件的文件来执行此操作,但我想创建一个可执行文件的可执行文件,即将工具嵌入到其中。一个使用特定值调用它的包装程序。

我可以在(Windows)c \ c ++,asm而不是.net中对包装器进行编码。

解决方案

最简单的方法是将该exe嵌入我们自己的exe并将其写入磁盘以运行它。

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

我们需要执行的确切代码取决于我们是编写.Net还是C ++代码。

简短答案:不可以。

简短回答:除非它是安装程序或者可执行文件的自解压缩文件,否则不要这样做。

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

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

我之前做过类似的事情,但是在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

滚动自己的程序实现比编写包装器要容易得多。听起来很简单-只需打开文件,找到正确的位置,写一些位,然后关闭文件,就完成了。

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

如果该exe是可重定位的(基本链接器标志/ fixed:no),则实际上可以对其执行LoadLibrary,获取基地址,设置调用链并对其进行调用(跳转)。这样做是不值得的,并且以这种方式构建的exe很少,因此我们将不得不具有重新构建它的代码,此时,我们将不在此练习中。

所以不行。

我更对开发人员感兴趣,他们不介意用C / C ++ / asm编写代码,但"不是.net",但显然受到fopen / fseek / fwrite的阻碍,因为这就是我们描述的所有程序的声音。

我认为这也可以通过使用AutoIt的Fi​​leInstall函数来实现。为此,我们必须设置AutoIt,使用FileInstall函数创建一个脚本以包含who exe文件,然后使用f.i。函数RunWait来执行它们。编译为exe文件,我们应该已经完成​​。