Сделайте исполняемый файл во время выполнения - PullRequest
3 голосов
/ 15 февраля 2010

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

Скажем, у меня есть 2 программы. Каждый из которых содержит класс. Одна программа, которую я бы использовал, чтобы изменить и заполнить класс данными. Второй файл - это программа, которая также имеет класс, но пустой, и его единственная цель - получить доступ к этим данным особым образом. Я не знаю, я думаю, если конкретный класс был сериализован, а затем «введен» во второй файл. Но как можно это сделать? Я находил изменяющие файлы, которые уже были скомпилированы, увлекательными, хотя я никогда не мог вносить изменения, которые не вызывали ошибок.

Это просто мысль. Я не знаю, каким будет решение, это просто пришло мне в голову.

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

также

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

++ также

Я не хочу использовать компилятор.

Джальф действительно прочитал то, что я написал

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

QUOTE "Я нашел модифицирующие файлы, которые уже были скомпилированы, восхитительно"

Пожалуйста, прочитайте и поймите вопрос перед публикацией.

спасибо.

Ответы [ 7 ]

5 голосов
/ 15 февраля 2010

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

Эти утилиты, которые генерируют самораспаковывающийся исполняемый файл, на самом деле не делают исполняемый файл с нуля. У них есть предварительно сгенерированный исполняемый файл, и файл данных просто добавляется в конец. Поскольку исполняемый формат Windows позволяет помещать данные в конец файла, заботясь только о «реальной исполняемой» части (заголовок exe сообщает, насколько он велик - остальное игнорируется).

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

Взгляните на запись в википедии, перейдите в раздел внешних ссылок, чтобы покопаться глубже: http://en.wikipedia.org/wiki/Portable_Executable

Я упоминал только Windows здесь, но те же принципы применимы к Linux. Но не ожидайте кросс-платформенных результатов, вам придется повторно внедрить его для каждой платформы. Я не мог представить что-то более зависимое от платформы, чем исполняемый файл. Даже если вы используете C #, вам придется генерировать собственную заглушку, которая отличается, если вы работаете в Windows (под .net) или Linux (под Mono).

3 голосов
/ 15 февраля 2010

К сожалению, скомпилированные языки, такие как C, C ++, Java или C #, вы не сможете просто «запустить» новый код во время выполнения, как вы можете делать на интерпретируемых языках, таких как PHP, Perl и ECMAscript , Код должен быть сначала скомпилирован, и для этого вам понадобится компилятор. Обойти это невозможно.

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

С другой стороны, если вы действительно сталкиваетесь с подобным сценарием, мой главный вопрос: чего вы пытаетесь достичь с этим? Даже в языках, которые поддерживают такие вещи, как eval(), самоизменяющийся код, как правило, является одним из самых неприятных и загадочных вещей, которые вы найдете. Это даже хуже, чем программа, написанная полностью с GOTO. Подобные способы используются для самоизменения кода, но в 99% случаев это неправильный подход.

Надеюсь, это поможет:)

3 голосов
/ 15 февраля 2010

Вызвать компилятор с данными, сгенерированными вашей программой (записать временные файлы на диск, если необходимо) и сохраненными на диске?

Или это вопрос о деталях написания локального исполняемого формата?

1 голос
/ 16 мая 2016

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

- ADD -

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

0 голосов
/ 16 февраля 2010

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

По сути, вы пишете код где-то в памяти, как если бы это были простые данные, и вы вызываете его. Обычно это плохая идея, но довольно забавная.

0 голосов
/ 15 февраля 2010

Рассматривали ли вы встраивание скриптового языка, такого как Lua или Python, в свое приложение? Это даст вам возможность динамически генерировать и выполнять код во время выполнения.

Из Википедия :

Динамический язык программирования - это термин, широко используемый в компьютерных науках для описания класса языков программирования высокого уровня, которые выполняют во время выполнения многие распространенные поведения, которые другие языки могут выполнять во время компиляции, если они вообще существуют. Эти поведения могут включать расширение программы, добавление нового кода, расширение объектов и определений или изменение системы типов во время выполнения программы. Такое поведение можно эмулировать практически на любом языке достаточной сложности, но динамические языки предоставляют прямые инструменты для их использования.

0 голосов
/ 15 февраля 2010

Хорошо, мне было интересно, как пойти о создании программы, которая создает вторую программу

Вы можете посмотреть на CodeDom . Вот учебник

...