![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Исправить код процедуры в 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