|
#1
|
||||
|
||||
Странный вопрос
Мне необходимо чуток подправить машинный код функции A "на ходу", из другой функции. Но вот беда: если я делаю
byte((@A)^):=123; мне пишут Access Violation: Write of address блаблабла. Как обойти эту ошибку? можно ли ее отключить? или как иначе поменять код? Копировать функцию в новое место и там извращаться не вариант, делфа использует относительные адреса, и для нового положения функции не будут работать никакие переменные. jmp $ ; Happy End! The Cake Is A Lie. Последний раз редактировалось Bargest, 02.11.2010 в 21:12. |
#2
|
|||
|
|||
Если я правильно понял, то вы пытаетесь внести изменения в файл, который в данный момент исполнаяется, что невозможно. Хотя, возможно, я что-то не так понял
|
#3
|
||||
|
||||
нет, EXE грузится в оперативку, и в ней я уже работаю. На ассемблере такой код сделать можно вроде бы (под ДОС пробовал, под винду нет, но должно быть все нормально). Мне кажется, что это делфа отлавливает ошибки Access Violation. Если так - то надо как-то выключить это.
хотя, в принципе, с устройством винды, может это действительно нереально... jmp $ ; Happy End! The Cake Is A Lie. |
#4
|
|||
|
|||
Как вариант, можно еще запустить проект без отладки, тогда среда не будет перехватывать ничего
|
#5
|
||||
|
||||
так я и не из среды вообще запускал - там же ошибки вделаны в прогу. Например, I/O Error 3 возникает при открытии несуществующего файла даже при запуске вне среды, но отключить можно через {$I-}. Может тут так же?
jmp $ ; Happy End! The Cake Is A Lie. |
#6
|
|||
|
|||
Не совсем так.
Ты не можешь править exe в тот момент, когда он уже запущен. Область кода блокированна для изменений. Однако, можно хитрым способом записать в память некоторые данные, объявить этот блок как код и передать туда указатель на выполнение. Другое дело, что обычно такие фокусы редко когда нужны. Данная проблема имеет другое, более простое решение. точнее два. Первое - использовать dll. Правда тут ты ограничен тем набором, котрый у тебя реализован в dll. второй - использовать встраиваемый интерпретатор (да того же паскаля или JSript). в этом случае тебе просто надо где-то хранить код соотв функций в вызывать его через этот интерпретатор. |
#7
|
||||
|
||||
не, мне необходимо именно менять код функции на ходу. Впринципе, если есть некие директивы, которые заставят делфу писать не относительные вызовы, а нормальные, то я могу копировать код функции в отдельное место, полученное через GetMem, туда копировать функцию, и работать уже с ней.
jmp $ ; Happy End! The Cake Is A Lie. |
#8
|
||||
|
||||
Кхе-кхе написал эту заветную процедуру на встроенном ассемблере - заработало. Я копирую её в новое место, там изменяю и запускаю оттуда.
Эх.. ну что ж, ручками - так ручками... Мне не привыкать jmp $ ; Happy End! The Cake Is A Lie. |