Вопрос

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

[править] Разъяснение:

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

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

Это было полезно?

Решение

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

Другие советы

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

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

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

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

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

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

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

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

При запуске вашего приложения найдите конец файла за вычетом размера структуры, извлеките смещение файла и скопируйте 2-й 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

Теперь перейдем к процедуре извлечения.Это происходит в вашем основном исполняемом файле:

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 который упакует exe-файл (и любые другие файлы, которые вы хотите) и может быть настроен на вызов exe-файла, пакетного файла или чего-либо еще, что вы хотите, когда пользователь распаковывает самораспаковывающийся исполняемый файл.

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

Итак...Нет.

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top