![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Перехват обработчиков событий, методов и т.д.
juiceman © (2004-07-03 00:16:00)С перехватом апи-функций все вы наверное давно знакомы. А как к быть например с перехватом обработчика событие в компоненте ? Это функция и адрес ее где-то хранится. Вопрос только в том как его узнать?
_?!_ (2004-07-06 10:15:00) [1]Ну допустим, published мемберов еще можно найти. А события очень часто делают published. Так что если есть указатель на объект (ха), то есть все шансы на успех.
Cobalt (2004-07-06 00:04:00) [2]>Игорь Шевченко © (05.07.04 18:38) [11]
>SetProcessorInstructionHookEx
:lol:
Polevi (2004-07-05 18:49:00) [3]> [11] Игорь Шевченко © (05.07.04 18:38)
?
Игорь Шевченко (2004-07-05 18:38:00) [4]Polevi © (05.07.04 10:37)
> ему надо команды перехода процесосра перехватывать
SetProcessorInstructionHookEx
Polevi (2004-07-05 10:37:00) [5]точно, ступил, ему надо команды перехода процесосра перехватывать :)
Digitman (2004-07-05 09:56:00) [6]
> Polevi © (05.07.04 09:38) [8]
> из стека он хочет
не знаю, что он там расчитывает в стеке увидеть в момент когда CALL еще не выполнен
Polevi (2004-07-05 09:38:00) [7]из стека он хочет
Digitman (2004-07-05 09:19:00) [8]
> возьму адрес метода оттуда, откуда на него будет сделан
> переход а не заниматься поиском адреса в памяти где хранится
> поле
откуда "оттуда" ?!
"оттуда" - это, как правило, и есть то самое поле
TMyClass = class(..)
..
FMyEvent: TNotifyEvent;
..
end;
procedure TMyClass.DoEvent;
begin
..
FMyEvent(Self);
end;
вот во что превращает компилятор конструкцию вызова обработчика ( FMyEvent(Self)) :
//в ebx - ссылка на тек.объект, возбуждающий событие
mov edx, ebx //параметр Self
mov eax, [ebx + offset(FMyEvent) + offset(TMethod.Data)]
call dword ptr [ebx + offset(FMyEvent) + offset(TMethod.Code)]
при изменении местоположения поля FMyEvent в декларации класса TMyClass значение offset(FMyEvent) может измениться !
juiceman (2004-07-04 00:34:00) [9][1]
Я возьму адрес метода оттуда, откуда на него будет сделан переход а не заниматься поиском адреса в памяти где хранится поле. Точнее не возьму а взял бы. Это все так, сдоровый интерес. заниматься этим на практике не планирую, хотя если понадобится...
Digitman (2004-07-03 14:20:00) [10]
> juiceman (03.07.04 13:47) [4]
> Смещение поля разницы не играет
еще как играет ! спрашивается, откуда ты возьмешь адрес метода, который, если он не nil, будет использован объектом, возбуждающим событие, для вызова этого метода ? Этот адрес же в классическом случае хранится в одном из приватных или защищенных полей объекта, возбуждающего событие ! Чтобы получть этот адрес (с целью поставить по нему некую "ловушку"), нужно знать где этот адрес объект хранит, в каком из своих полей ... т.е. мало знать адрес объекта, нужно знать еще и смещение поля
juiceman (2004-07-03 13:47:00) [11]Смещение поля разницы не играет. Ловить надо саму функцию компонента обрабатывающую приходящие события, а там уже и содержимоезаветного поля можно узнать - адрес по которому обработчик попытается сделать переход.
Digitman (2004-07-03 12:19:00) [12]
> juiceman (03.07.04 00:16)
обработчик события "компонента" - это некая процедура
как правило, адрес этой процедуры хранится в некоем приватном поле записи, описывающей объект
сегодня я могу написать так
TMyClass = class(чего-то там)
..
FMyEvent: TSomeMyEvent; // где TSomeMyEvent = procedure(..) of object;
FSomeField: Integer;
..
end;
а завтра мне взбрендит написать иначе
TMyClass = class(чего-то там)
..
FSomeField: Integer;
FMyEvent: TSomeMyEvent; // где TSomeMyEvent = procedure(..) of object;
..
end;
а теперь скажи, каким макаром ты будишь ловить все это, если при каждом моем сиюминутном бзике смещение поля FMyEvent "гуляет" по структуре как мне заблагорассудится ?
juiceman (2004-07-03 10:24:00) [13]Да. Чтобы много раз не лазить можно даже байт-код функции запомнить а потом его в памяти находить :) Только будет зависимость от версии компилятора.
Игорь Шевченко (2004-07-03 00:32:00) [14]Я вот удивляюсь, что же за задача такая перед тобой стоит - перехватить все и вся ?
> ? Это функция и адрес ее где-то хранится. Вопрос только
> в том как его узнать?
Например, дизассемблером