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