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

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

Изменить VMT


Страницы:   1 2 3

DevilDevil ©   (2007-07-23 10:20:00) 

Как бы то ни было странно, пишу такую функцию, типа PatchSomeClass(C : TClass) в теле которой происходит "подмена" адреса одной виртуальной функции.

Как я себе это представляю.

Для каждого класса существует некий массив указателей на функции (VMT). В каждом экземпляре такого класса хранится указатель на массив-VMT. Следовательно, получив указатель на VMT, зная смещение, я могу записать в этот массив произвольный указатель на функцию.

Все мои опыты приводят к AccessViolation. Есть ли какие нибудь предположения или наработки по данному поводу?


DevilDevil   (2007-07-23 13:51:00) [41]

теоретически - да.

Но каждая версия Delphi поддерживает asm-макрос VMTOFFSET. Поэтому должно получиться.


Инс   (2007-07-23 13:07:00) [42]


> Как бы то ни было странно, пишу такую функцию, типа PatchSomeClass(C
> : TClass) в теле которой происходит "подмена" адреса одной
> виртуальной функции.


Только эта ваша функция на других версиях Delphi может не работать.


Сергей М.   (2007-07-23 12:10:00) [43]


> есть ли у кого-нибудь информация хорошая по VirtualProtect,
>  WriteProcessMemory и FlushInstructionCache ?


Что тебе непонятно в их использовании ?


DevilDevil   (2007-07-23 11:56:00) [44]

ну да, да... кроме этого этвета я ещё ожидал "см. хелп". :)

Оно понятно. Но если кто-то уже сталкивался с проблемой и успешно её решил, пусть поделится 5ю строками. Иначе постараюсь найти в Jedi.

За оказанную помощь, спасибо!


umbra   (2007-07-23 11:50:00) [45]

так по ссылке же в каком-то посте написано, что в Jedi это уже есть. Скачайте и посмотрите.


DevilDevil   (2007-07-23 11:38:00) [46]

В таком случае... есть ли у кого-нибудь информация хорошая по VirtualProtect, WriteProcessMemory и FlushInstructionCache ?


Сергей М.   (2007-07-23 11:15:00) [47]


> Все мои опыты приводят к AccessViolation


И правильно приводят, потому что

http://www.delphikingdom.com/asp/answer.asp?IDAnswer=46314
(см. пост 30-10-2006 10:21)


DevilDevil   (2007-07-23 11:06:00) [48]

ну допустим так:

procedure PatchSomeClass(C : TClass; Offset : integer; Proc : pointer);
var
 P : pinteger;
begin
 P := pinteger(@C); // получить указатель на данные класса
 P := Pointer(P^); // получить указатель на VMT

 P := pointer(integer(P) + Offset); // получить указатель на данные в VMT
 P^ := integer(Proc);
end;


<-- это я только что написал, не тестировал. Но, по-моему, так должно быть верно.


umbra   (2007-07-23 10:42:00) [49]

не приведёте на ваш взгляд правильный код? :)


DevilDevil   (2007-07-23 10:36:00) [50]

не приведёте на ваш взгляд правильный код?


umbra   (2007-07-23 10:23:00) [51]


> Есть ли какие нибудь предположения

неправильно, не то или не туда записываете :)


Юрий Зотов   (2007-07-23 10:23:00) [52]

Мысль правильная. Видимо, ошибка в коде.


Страницы:   1 2 3

Наверх

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