Консультация № 53805
30.08.2006, 19:33
0.00 руб.
0 3 2
Здравствуйте уважаемые эксперты.

Насколько реально в си сделать так:

1. Скомпилировать кусок кода из своей программы в машинный код (это можно)
2. Записать этот код в память
3. Заменить в нём некоторые обращения к оперативной памяти константами. (если переменная используется в коде только на чтение)
4. Выполнить и вернуться в основную программу

Выполнять это всё планируется под Windows

Обсуждение

Неизвестный
30.08.2006, 20:08
общий
это ответ
Здравствуйте, C4tnt!
Ну, есть 3 способа:
1. Рзаобраться в формате машинных команд, особенно учитывая положение в памяти (т.е. при загрузке скомпилированного кода в память - преобразовывать его относительно начального адреса, по которому загружается). - это довольно лсожный способ, но, возможно, наиболее эффективный.
2. Включить в свою программу исходники какого-то компилятора и пользоваться им для создания запускаемого файла либо библиотеки (dll) и далее работать с ней (забота о преобразовании адресов ложится на ОС).
3. Написать интерпретатор, где команды не будут преобразовываться в машинные коды, а будут интерпретироваться.

Третий способ хорош всем кроме производительности, но язык Java это не остановило ;)
Неизвестный
31.08.2006, 17:56
общий
Очевидно, хочется получить самомодифицируемый код. В этом смысле, по-моему, больше подходит Perl или даже что-дь из серии lisp/prolog... хотя не уверен, что "овчинка стоит выделки", т.е. изучать другой язык ради одной этой идеи.2Mihasic: Java вообще-то компилируется (и даже Perl !), хотя впоследствии и интерпретируется.Вообще, для простых моделей действительно подходят интерпретируемые языки. А поначалу сильно сложные вы и не сделаете, если уже не занимаетесь ИИ уже несколько лет =)А, еще Visual Basic подходит - он как раз интерпретируемый.Заменить обращения к памяти константами, по-моему, проще до компиляции. И еще - не надо встраивать код - лучше объявить внешнюю процедуру.
Неизвестный
01.09.2006, 06:22
общий
это ответ
Здравствуйте, C4tnt!

1. Скомпилируйте в объектный код, а затем вытащите оттуда машинный код, например с помощью редактора hiew, pview или подобного им, который умеет дизассемблировать код.

2. Загрузите этот кусок в память.

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

4. Выполнить этот кусок под Windows просто так не получится, Windows (как и все операционные системы, работающие в защищённом режиме) запрещает выполнение кода в блоке памяти, выделенной для хранения данных. Необходимо изменить атрибуты выделенного куска оперативной памяти средствами операционной системы (сделать системный вызов), добавив возможность его исполнения.

Не совсем понятно зачем всё это нужно. Вполне возможно, что вам подойдёт и dll-библиотеки. Или вы пишете вирус? =D
Форма ответа