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

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

Исправить код процедуры в runtime


o_serg ©   (2007-01-09 13:57:00) 

Попытался править код процедуры:
asm
mov al, byte ptr cs:[@edit] //-прекрасно работает-
mov al, 32
mov byte ptr cs:[@edit], al //-при выполнении этой строки вылетает ошибка "access violetion at address..."-
jmp @link
@edit:
db 45
@link:
end
Возможно ли вообще исправить код процедуры, если да то каким образом?


Джо   (2007-01-09 14:48:00) [1]

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

Сегмент данных также не имет прав доступа для выполнения, см. [1].


o_serg   (2007-01-09 14:32:00) [2]

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


Сергей М.   (2007-01-09 14:14:00) [3]


> o_serg   (09.01.07 13:57)


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


Сергей М.   (2007-01-09 14:05:00) [4]


> Возможно ли вообще исправить код процедуры


Возможно.

mov byte ptr [@edit], 32

А чтобы AV не схлопотать, нужно перед этим изменить права доступа к соотв.странице вирт.памяти процесса, в которой находится байт с адресом @edit.

см. VirtualProtect[Ex] с флагом PAGE_EXECUTE_READWRITE


Наверх

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