Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "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.033 c
4-1088788023
Алексей
2004-07-02 21:07
2004.08.15
Многооконное приложение


14-1091002996
ИМХО
2004-07-28 12:23
2004.08.15
Куда деть 9 баксов?


1-1091003030
BillyJeans
2004-07-28 12:23
2004.08.15
Фон у TTreeView


6-1087383184
Dennisius
2004-06-16 14:53
2004.08.15
Отправить Письмо (Имея только E-mail)


3-1090472765
Fynjy1984
2004-07-22 09:06
2004.08.15
Подскажите почему не работает АDOQuery.RecNo





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский