Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Изменение кода при выполнении программы


programania ©   (2004-10-05 18:34:00) 

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

Или можно ли запустить выполнение кода из массива?
если переменной типа процедура присвоить адрес этого массива,
в массив записать код другой процедуры того же типа
и вызвать ее: опять защита доступа.


Anatoly Podgoretsky   (2004-10-06 13:25:00) [1]

Sha ©   (06.10.04 13:21) [7]
Туда им и дорога.


Sha   (2004-10-06 13:21:00) [2]

> wicked ©   (06.10.04 12:51) [6]

Неужели MS не даст исполнять код на стеке?
Много программ пострадает :(


wicked   (2004-10-06 12:51:00) [3]

> Digitman [4]
так и знал, что кто-то посоветует.... :)
остается сказать - читайте описание 2-го сервис пака для WinXP....


Sha   (2004-10-06 10:18:00) [4]

Digitman ©   (06.10.04 08:59) [4]

Добавлю, что такой вариант работает иногда медленнее.
И добавляет проблем отладчику :)


Digitman   (2004-10-06 08:59:00) [5]


> можно ли запустить выполнение кода из массива?


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


Суслик   (2004-10-05 19:01:00) [6]

Думаю, что можно попробовать взять адрес процедуры, используя VirtualQuery узнать базовый адрес блока, затем через VirtualProtect сменить уровень защиты, изменить код.

Я бы начал с этого...


Sha   (2004-10-05 19:01:00) [7]

> programania ©   (05.10.04 18:34)  

VirtualProtect
PAGE_EXECUTE_READWRITE
FlushInstructionCache


Суслик   (2004-10-05 18:50:00) [8]

Я такое не делал, но думаю можно.

Я бы стал рыть в сторону использования функции VirtualProtect и родественных ей.
Я не помню какие ограничения у этой функции. Думаю, что на данный вопрос может замечательно ответить книга Рихтера, windows для профи - глава про управление памятью. Или msdn можно посмотреть.


Наверх

Титульная страница Поиск, карта сайта Написать письмо