Сейчас на форуме: Magister Yoda (+9 невидимых) |
![]() |
eXeL@B —› Основной форум —› Нахождение кода обработки событий! |
. 1 . 2 . >> |
Посл.ответ | Сообщение |
|
Создано: 01 февраля 2008 15:52 · Поправил: Isaev · Личное сообщение · #1 Интересует обобщённый принцып нахождения в отладчике участка кода, отвечающего за обработку того или иного события определённого компонента (как это делает DeDe например), в частности для VC, т.к. для него декомпилеров не обнаружил (да и смысл пользоваться декомпилятором, который может пол часа анализировать код, когда нужно обычно узнать лишь адрес процедуры обработки onClick) Поэтому интересует ручной метод!!! Судя по расспросам каждый извращается как может, но не нормальным методом, который наверняка существует... Поэтому думаю тема будет интересна многим... Делимся опытом! ЗЫ: Просьба высказываться только по теме ----- z+Dw7uLu5+jqLCDq7vLu8PvpIPHs7uMh ![]() |
|
Создано: 01 февраля 2008 16:25 · Личное сообщение · #2 |
|
Создано: 01 февраля 2008 19:34 · Поправил: Great · Личное сообщение · #3 |
|
Создано: 01 февраля 2008 20:39 · Личное сообщение · #4 Isaev, в VC++/API будет цепочка обработчиков сообщений. В случае с MFC всё сложнее из-за иерархии классов и макросов которые цепляют метод к номеру сообщения. Сравнение с DeDe невозможно, т.к. он, думаю, разбирает внутренние таблицы дельфы в которых хранятся указатели на стандартные OnClick, Onchange... ![]() |
|
Создано: 01 февраля 2008 20:41 · Личное сообщение · #5 |
|
Создано: 01 февраля 2008 20:50 · Личное сообщение · #6 |
|
Создано: 01 февраля 2008 22:11 · Поправил: HoBleen · Личное сообщение · #7 В Delphi'йских формах данные формы хранятся в объекте класса, в т.ч. указатель на функцию-обработчик, поэтому чтобы узнать функции-обработчики нужно разбирать поля конкретного объекта класса TForm (если не ошибаюсь в названии). Указатель на объект передается аргументом в функцию CreateForm, которая обычно вызывается в основной процедуре. ![]() |
|
Создано: 01 февраля 2008 22:49 · Личное сообщение · #8 |
|
Создано: 02 февраля 2008 20:48 · Личное сообщение · #9 1. s0larian, HoBleen, 0xy спасибо значит, по идее не возможно сделать прогу (в случае с VC и VB), которая покажет, например при наведении на конкретный объект мыши, все события, которые им обрабатываются? В случае с Delphi, получается тоже, в зависимости от реализации... Или я не всё правильно понял??? 2. простой пример: как например программа выходит из этого цикла: (InstallShild при вводе пароля для инсталяции... при вводе правильного, делает EnableButton:=True... Но все ссылки внутри цикла, последний IsWindow всегда вернёт не 0... как он проверяет, когда активировать кнопку?) 00405A09 |. 8B35 E8224100 MOV ESI,DWORD PTR DS:[<&USER32.PeekMessageA>] ; USER32.PeekMessageA 00405A0F |> 6A 01 /PUSH 1 00405A11 |. 33FF |XOR EDI,EDI 00405A13 |> 57 |/PUSH EDI 00405A14 |. 57 ||PUSH EDI 00405A15 |. 8D45 E4 ||LEA EAX,DWORD PTR SS:[EBP-1C] 00405A18 |. 57 ||PUSH EDI 00405A19 |. 50 ||PUSH EAX 00405A1A |. FFD6 ||CALL ESI 00405A1C |. 85C0 ||TEST EAX,EAX 00405A1E |. 74 28 ||JE SHORT gdsvu.00405A48 00405A20 |. 8D45 E4 ||LEA EAX,DWORD PTR SS:[EBP-1C] 00405A23 |. 50 ||PUSH EAX ; /pMsg 00405A24 |. FF33 ||PUSH DWORD PTR DS:[EBX] ; |hWnd 00405A26 |. FF15 CC224100 ||CALL DWORD PTR DS:[<&USER32.IsDialogMessageA>] ; \IsDialogMessageA 00405A2C |. 85C0 ||TEST EAX,EAX 00405A2E |. 75 14 ||JNZ SHORT gdsvu.00405A44 00405A30 |. 8D45 E4 ||LEA EAX,DWORD PTR SS:[EBP-1C] 00405A33 |. 50 ||PUSH EAX ; /pMsg 00405A34 |. FF15 7C224100 ||CALL DWORD PTR DS:[<&USER32.TranslateMessage>] ; \TranslateMessage 00405A3A |. 8D45 E4 ||LEA EAX,DWORD PTR SS:[EBP-1C] 00405A3D |. 50 ||PUSH EAX ; /pMsg 00405A3E |. FF15 78224100 ||CALL DWORD PTR DS:[<&USER32.DispatchMessageA>] ; \DispatchMessageA 00405A44 |> 6A 01 ||PUSH 1 00405A46 |.^ EB CB |\JMP SHORT gdsvu.00405A13 00405A48 |> FF33 |PUSH DWORD PTR DS:[EBX] ; /hWnd 00405A4A |. FF15 B8224100 |CALL DWORD PTR DS:[<&USER32.IsWindow>] ; \IsWindow 00405A50 |. 85C0 |TEST EAX,EAX 00405A52 |.^ 75 BB \JNZ SHORT gdsvu.00405A0F ----- z+Dw7uLu5+jqLCDq7vLu8PvpIPHs7uMh ![]() |
|
Создано: 02 февраля 2008 20:53 · Личное сообщение · #10 Isaev пишет: значит, по идее не возможно сделать прогу (в случае с VC и VB), которая покажет, например при наведении на конкретный объект мыши, все события, которые им обрабатываются? В случае с Delphi, получается тоже, в зависимости от реализации... Или я не всё правильно понял??? В поставке Delphi ведь есть утилитка WinSight - которая показывает все окна в системе и обрабатываемые ими события (и от клавы и от мыши и много других). Или и я не всё правильно понял? ![]() |
|
Создано: 02 февраля 2008 21:15 · Личное сообщение · #11 |
|
Создано: 02 февраля 2008 21:43 · Личное сообщение · #12 Смотри аттач WinSight иногда тупит - она практически ничего не может определить когда открыто дохрена окон (например когда запущена Delphi или Ida), что очень неудобно Так что приходится его запускать при минимальном количестве работающих приложений ![]() ![]() |
|
Создано: 02 февраля 2008 23:21 · Личное сообщение · #13 |
|
Создано: 03 февраля 2008 09:06 · Личное сообщение · #14 Isaev пишет: когда нужно обычно узнать лишь адрес процедуры обработки onClick) в дельфовых, самый простой метод, через поиск названия процедуры .. ![]() К примеру сморишь скрипт формы в редакторе, находишь нужный контрол, ниже будет: OnDblClick = Label8DblClick Находишь название в отладчике, ниже строки (или выше) - будет адрес .. ![]() ----- Чтобы юзер в нэте не делал,его всё равно жалко.. ![]() |
|
Создано: 03 февраля 2008 09:37 · Личное сообщение · #15 |
|
Создано: 05 февраля 2008 00:44 · Личное сообщение · #16 Bronco А с этим как бороться - если события контролов меняются во время выполнения? Вот простой пример сделал - у кнопки при каждом нажатии меняется событие, причем разными способами. Как это отлавливать? Ладно в примере понятно что он меняется после каждого нажатия, а если в реальной проге такое учудят? ![]() rapidshare.de/files/38492059/Project1.exe.html ![]() |
|
Создано: 05 февраля 2008 02:06 · Личное сообщение · #17 |
|
Создано: 05 февраля 2008 02:40 · Личное сообщение · #18 |
|
Создано: 24 августа 2008 11:15 · Поправил: Isaev · Личное сообщение · #19 Начал тут изучать цикл статей: --> Исследование кода, генерируемого Delphi <-- Вроде всё доступно и логично, но там в самом начале есть такая фраза: Аргументом метода TApplication::CreateForm() передаётся указатель - на структуру RTTI класса нашей формы. Как найти программно найти этот указатель? ----- z+Dw7uLu5+jqLCDq7vLu8PvpIPHs7uMh ![]() |
|
Создано: 24 августа 2008 11:43 · Поправил: ClockMan · Личное сообщение · #20 Есть плагин для Олли --> PointEvents <-- http://www.tuts4you.com/download.php?view.1880 по нему можно отследить вызов функций для програм написаных на Delphi мануал в нутри. P.S. Единственное иногда он лажаеться когда файл после расспаковки. ----- Чтобы правильно задать вопрос, нужно знать большую часть ответа. Р.Шекли. ![]() |
|
Создано: 24 августа 2008 12:06 · Личное сообщение · #21 |
|
Создано: 24 августа 2008 20:17 · Личное сообщение · #22 |
|
Создано: 26 августа 2008 12:42 · Личное сообщение · #23 |
|
Создано: 26 августа 2008 13:44 · Личное сообщение · #24 |
|
Создано: 26 августа 2008 16:20 · Личное сообщение · #25 |
|
Создано: 26 августа 2008 16:40 · Личное сообщение · #26 Isaev пишет: Вроде всё доступно и логично, но там в самом начале есть такая фраза: Аргументом метода TApplication::CreateForm() передаётся указатель - на структуру RTTI класса нашей формы. Как найти программно найти этот указатель? На самом деле там несколько сложней. Если не ошибаюсь ей передается указатель на массив указателей структур РТТИ классов. Если потрейсить в отладчике программу от борланда, то почти в самом начале можно наткнуться на цикл с одной командой CALL EDX (или EBX, ECX и т.д. - не знаю является ли регистр постоянным для разных прог, как то не обращал внимания). Вот здесь и находится цикл инициализации классов, по сути та команда и есть вызов конструктора текущего класса. Так что, как уже предлагалось, смотрим в отладчике по нескольким программам откуда берется указатель и сравниваем. Могу предположить, что первичные константы находятся в секции idata. Но в общем где-то могу и ошибаться. Isaev пишет: как например программа выходит из этого цикла: Выходит: после закрытия окна/после вызова DestroyWindow/когда hWnd недействителен - это почти одно и тоже. В этом случае IsWindow вернет 0. Но тот код - это не обработчик событий, это "конвеер" получения сообщений из буфера сообщений приложения. В данном случае, имхо, ты перепутал "будку с собакой". ![]() |
|
Создано: 26 августа 2008 20:20 · Личное сообщение · #27 Isaev пишет: Интересует обобщённый принцып нахождения в отладчике участка кода, отвечающего за обработку того или иного события определённого компонента (как это делает DeDe например), в частности для VC Декомпиляция делфей происходит на ура из-за избыточной информации в ехе файле, в VC этого нет, поэтому и аналогий быть не может. В делфях же есть специальная таблица обработчиков событий, и такие проги, как DeDe, ниего особенного не делают, просто показывают эту таблицу и всё, тут нужно просто с форматом файлов дельфовых разбираться ----- Stuck to the plan, always think that we would stand up, never ran. ![]() |
|
Создано: 27 августа 2008 08:36 · Личное сообщение · #28 ARCHANGEL пишет: такие проги, как DeDe, ниего особенного не делают, просто показывают эту таблицу и всё Угу, то то кроме древнего деде больше прог и нету для показа этой таблички. Посмотрел бы хоть сорсы его чтобы так говорить. Чего только стоит брутфорс поинеров в BSS и содержимое баз VMT для каждой версии. ----- Yann Tiersen best and do not fuck ![]() |
|
Создано: 27 августа 2008 08:43 · Поправил: PE_Kill · Личное сообщение · #29 Release пишет: Вот здесь и находится цикл инициализации классов, по сути та команда и есть вызов конструктора текущего класса. Ты не прав. Там не конструкторы. Есть у делфи директива initialization. Пишешь ее в конце юнита и при инициализации юнитов этот код выполнится. Вот тот цикл и вызывает код initialization у каждого юнита, у кого он есть. А конструкторы типа TApplication::CreateForm() уже после этого вызываются там же на еп Code:
----- Yann Tiersen best and do not fuck ![]() |
|
Создано: 27 августа 2008 10:15 · Личное сообщение · #30 |
. 1 . 2 . >> |
![]() |
eXeL@B —› Основной форум —› Нахождение кода обработки событий! |