我有一个命令行可执行文件,它改变了我想从我的程序中使用的文件中的一些位。是否可以创建我自己的使用此工具的可执行文件并仅分发一个可执行文件?
[编辑] 澄清:
命令行工具获取偏移量和一些位,并更改给定文件中此偏移量的位。所以我想为一个将特定位更改为特定值的应用程序创建一个修补程序,所以我能做的就是写一个批处理文件之类的东西来完成它,但我想创建一个可执行文件,即将工具嵌入到一个使用特定值调用它的包装程序。
我可以在(windows)c\c++、asm 中编写包装器,但请不要使用 .net。
我有一个命令行可执行文件,它改变了我想从我的程序中使用的文件中的一些位。是否可以创建我自己的使用此工具的可执行文件并仅分发一个可执行文件?
[编辑] 澄清:
命令行工具获取偏移量和一些位,并更改给定文件中此偏移量的位。所以我想为一个将特定位更改为特定值的应用程序创建一个修补程序,所以我能做的就是写一个批处理文件之类的东西来完成它,但我想创建一个可执行文件,即将工具嵌入到一个使用特定值调用它的包装程序。
我可以在(windows)c\c++、asm 中编写包装器,但请不要使用 .net。
滚动你自己的这个程序的实现比编写包装器更容易;这听起来很简单——只需打开文件,寻找正确的位置,写入你的位,关闭文件,你就完成了。
最简单的方法是将这个 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 的 FileInstall 功能来实现。为此,您必须设置 AutoIt,使用 FileInstall 函数创建一个脚本以包含 who exe,然后使用函数 RunWait执行它们。编译成一个exe,你应该完成了。