Объединение двух исполняемых файлов - PullRequest
1 голос
/ 25 сентября 2008

У меня есть исполняемый файл командной строки, который изменяет некоторые биты в файле, который я хочу использовать в моей программе. Можно ли создать собственный исполняемый файл, использующий этот инструмент, и распространять только один исполняемый файл?

[править] Уточнение:

Инструмент командной строки принимает смещение и некоторые биты и изменяет биты с этим смещением в данном файле. Итак, я хочу создать патчер для приложения, которое изменяет определенные биты на определенное значение, так что я могу написать что-то наподобие командного файла, но я хочу создать исполняемый файл, который это делает, т.е. внедрить инструмент программа-оболочка, которая вызывает ее с конкретными значениями.

Я могу закодировать оболочку в (windows) c \ c ++, asm, но не .net, пожалуйста.

Ответы [ 8 ]

7 голосов
/ 25 сентября 2008

Было бы проще свернуть собственную реализацию этой программы, чем написать обертку; это звучит как тривиально - просто откройте файл, найдите нужное место, напишите свои биты, закройте файл, все готово.

5 голосов
/ 25 сентября 2008

Самый простой способ - встроить этот exe-файл в свой собственный и записать его на диск для запуска.

3 голосов
/ 25 сентября 2008

Вы можете добавить один исполняемый файл в конец другого и написать некоторый код, чтобы распаковать его во временную папку.

Я делал подобное раньше, но с файлом конфигурации и некоторыми растровыми изображениями, добавленными в EXE в Windows. Я сделал так, чтобы сначала добавить свои данные в конец EXE-файла, а затем написать небольшую структуру после того, что содержит смещение файла данных, которое в вашем случае будет смещением 2-го exe.

При запуске приложения ищите в конце файла минус размер структуры, извлеките смещение файла и скопируйте 2-й исполняемый файл во временную папку, а затем запустите его.

Хорошо, вот немного больше деталей по запросу. Это некоторый псевдокод для создания комбинированного 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
3 голосов
/ 25 сентября 2008

Краткий ответ: Нет.

Менее краткий ответ: Нет, если это не инсталлятор или самораспаковывающийся архив.

Более длинный, умозрительный ответ: если файловая система поддерживает альтернативные потоки данных, вы можете добавить поток, содержащий утилиту, в вашу программу, тогда ваша программа может получить доступ к своему собственному альтернативному потоку данных, извлекая утилиту, когда вам это нужно. Ахаха.

3 голосов
/ 25 сентября 2008

Вы можете добавить исполняемый файл в качестве двоичного потокового ресурса в свой исполняемый файл, а при необходимости вы можете извлечь его во временную папку и создать новый процесс с временным файлом.

Точный код, который вам нужно сделать, зависит от того, пишете ли вы код .Net или C ++.

1 голос
/ 25 сентября 2008

Я думаю, что это также возможно при использовании функции FileInstall AutoIt . Для этого вам нужно будет настроить AutoIt, создать скрипт с функцией FileInstall, чтобы включить в него exe, а затем использовать f.i. функция RunWait для их выполнения. Скомпилируйте в exe, и все готово.

1 голос
/ 25 сентября 2008

Если исполняемый файл был создан для возможности перемещения (существенный флаг компоновщика / исправлено: нет), вы можете на самом деле создать для него LoadLibrary, получить базовый адрес, настроить цепочку вызовов и вызвать (перейти) в нее. Это не стоило бы усилий, и очень немногие исполняемые файлы построены таким образом, поэтому вам понадобится код для его перестройки, и в этот момент вы не будете участвовать в этом упражнении.

Итак ... Нет.

Меня больше заинтриговал разработчик, который не возражает писать на C / C ++ / asm, но не .net - но, очевидно, заблокирован fopen / fseek / fwrite - так как это касается всей программы, которую вы описываете Похоже, что он делает.

1 голос
/ 25 сентября 2008

Я думаю, что самый простой способ сделать это для ваших целей - это, вероятно, использовать самораспаковывающийся исполняемый пакет. Например, используйте инструмент, такой как Paquet Builder , который будет упаковывать исполняемый файл (и любые другие файлы, которые вы хотите) и может быть настроен для вызова исполняемого файла или пакетного файла или чего-либо еще, что вы хотите, когда пользователь распаковывает самораспаковывающийся исполняемый файл.

...