代码之家  ›  专栏  ›  技术社区  ›  RomanM

组合两个可执行文件

  •  1
  • RomanM  · 技术社区  · 16 年前

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

    [编辑]澄清:

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

    我可以在(Windows)c+c++,ASM,但是.NET中编写包装器。

    8 回复  |  直到 16 年前
        1
  •  7
  •   Captain Segfault    16 年前

    滚动您自己的程序实现要比编写包装器容易得多;这听起来很简单——只需打开文件,寻找正确的位置,写入您的位,关闭文件,就可以了。

        2
  •  5
  •   Serafina Brocious    16 年前

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

        3
  •  3
  •   Franci Penov    16 年前

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

    您需要做的确切代码取决于您是写.NET还是C++代码。

        4
  •  3
  •   Factor Mystic    16 年前

    简短回答:不。

    不那么简短的回答:除非它是安装程序或可执行的自解压存档。

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

        5
  •  3
  •   Adam Pierce    16 年前

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

    我以前也做过类似的事情,但是在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
    
        6
  •  1
  •   Jay    16 年前

    为了您的目的,我认为最简单的方法是使用自解压可执行包。例如,使用类似 Paquet Builder 它将打包exe(以及您想要的任何其他文件),并且可以配置为在用户解包自解压可执行文件时调用exe或批处理文件或其他任何文件。

        7
  •  1
  •   Joe    16 年前

    如果该exe是为可重定位而构建的(essential linker flag/fixed:no),则实际上可以对其执行加载库、获取基地址、设置调用链并调用(跳转)。这样做是不值得的,而且很少有exe是以这种方式构建的,所以您必须有代码来重新构建它,此时您将不在这个练习中。

    所以…不。

    我更感兴趣的是开发人员,他们不介意在C/C++ +ASM中写文章,而不是“.NET”——但是显然是被FOpen/FISTION/FWITH所阻碍的,因为这就是你们描述的所有程序听起来像它正在做的。

        8
  •  1
  •   Mackaaij    16 年前

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