Форум: "WinAPI";
Текущий архив: 2004.08.15;
Скачать: [xml.tar.bz2];
ВнизПерехват обработчиков событий, методов и т.д. Найти похожие ветки
← →
juiceman (2004-07-03 00:16) [0]С перехватом апи-функций все вы наверное давно знакомы. А как к быть например с перехватом обработчика событие в компоненте ? Это функция и адрес ее где-то хранится. Вопрос только в том как его узнать?
← →
Игорь Шевченко © (2004-07-03 00:32) [1]Я вот удивляюсь, что же за задача такая перед тобой стоит - перехватить все и вся ?
> ? Это функция и адрес ее где-то хранится. Вопрос только
> в том как его узнать?
Например, дизассемблером
← →
juiceman (2004-07-03 10:24) [2]Да. Чтобы много раз не лазить можно даже байт-код функции запомнить а потом его в памяти находить :) Только будет зависимость от версии компилятора.
← →
Digitman © (2004-07-03 12:19) [3]
> 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 13:47) [4]Смещение поля разницы не играет. Ловить надо саму функцию компонента обрабатывающую приходящие события, а там уже и содержимое заветного поля можно узнать - адрес по которому обработчик попытается сделать переход.
← →
Digitman © (2004-07-03 14:20) [5]
> juiceman (03.07.04 13:47) [4]
> Смещение поля разницы не играет
еще как играет ! спрашивается, откуда ты возьмешь адрес метода, который, если он не nil, будет использован объектом, возбуждающим событие, для вызова этого метода ? Этот адрес же в классическом случае хранится в одном из приватных или защищенных полей объекта, возбуждающего событие ! Чтобы получть этот адрес (с целью поставить по нему некую "ловушку"), нужно знать где этот адрес объект хранит, в каком из своих полей ... т.е. мало знать адрес объекта, нужно знать еще и смещение поля
← →
juiceman (2004-07-04 00:34) [6][1]
Я возьму адрес метода оттуда, откуда на него будет сделан переход а не заниматься поиском адреса в памяти где хранится поле. Точнее не возьму а взял бы. Это все так, сдоровый интерес. заниматься этим на практике не планирую, хотя если понадобится...
← →
Digitman © (2004-07-05 09:19) [7]
> возьму адрес метода оттуда, откуда на него будет сделан
> переход а не заниматься поиском адреса в памяти где хранится
> поле
откуда "оттуда" ?!
"оттуда" - это, как правило, и есть то самое поле
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) может измениться !
← →
Polevi © (2004-07-05 09:38) [8]из стека он хочет
← →
Digitman © (2004-07-05 09:56) [9]
> Polevi © (05.07.04 09:38) [8]
> из стека он хочет
не знаю, что он там расчитывает в стеке увидеть в момент когда CALL еще не выполнен
← →
Polevi © (2004-07-05 10:37) [10]точно, ступил, ему надо команды перехода процесосра перехватывать :)
← →
Игорь Шевченко © (2004-07-05 18:38) [11]Polevi © (05.07.04 10:37)
> ему надо команды перехода процесосра перехватывать
SetProcessorInstructionHookEx
← →
Polevi © (2004-07-05 18:49) [12]> [11] Игорь Шевченко © (05.07.04 18:38)
?
← →
Cobalt © (2004-07-06 00:04) [13]>Игорь Шевченко © (05.07.04 18:38) [11]
>SetProcessorInstructionHookEx
:lol:
← →
_?!_ (2004-07-06 10:15) [14]Ну допустим, published мемберов еще можно найти. А события очень часто делают published. Так что если есть указатель на объект (ха), то есть все шансы на успех.
Страницы: 1 вся ветка
Форум: "WinAPI";
Текущий архив: 2004.08.15;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.034 c