Сейчас на форуме: Magister Yoda (+9 невидимых)

 eXeL@B —› Основной форум —› Нахождение кода обработки событий!
. 1 . 2 . >>
Посл.ответ Сообщение


Ранг: 756.3 (! !), 113thx
Активность: 0.610.05
Статус: Участник
Student

Создано: 01 февраля 2008 15:52 · Поправил: Isaev
· Личное сообщение · #1

Интересует обобщённый принцып нахождения в отладчике участка кода, отвечающего за обработку того или иного события определённого компонента (как это делает DeDe например), в частности для VC, т.к. для него декомпилеров не обнаружил (да и смысл пользоваться декомпилятором, который может пол часа анализировать код, когда нужно обычно узнать лишь адрес процедуры обработки onClick) Поэтому интересует ручной метод!!!

Судя по расспросам каждый извращается как может, но не нормальным методом, который наверняка существует...
Поэтому думаю тема будет интересна многим...

Делимся опытом!

ЗЫ: Просьба высказываться только по теме

-----
z+Dw7uLu5+jqLCDq7vLu8PvpIPHs7uMh




Ранг: 10.9 (новичок)
Активность: 0=0
Статус: Участник

Создано: 01 февраля 2008 16:25
· Личное сообщение · #2

а разве в случае с VC все в итоге не сводиться к банальной оконой процедуре?



Ранг: 14.0 (новичок)
Активность: 0=0
Статус: Участник

Создано: 01 февраля 2008 19:34 · Поправил: Great
· Личное сообщение · #3

сводится.
автору: компилируешь простую программу которая выводит MessageBox при нужном событии и смотриьш в IDA Pro как и что там. сам догадаешься




Ранг: 387.4 (мудрец)
Активность: 0.170
Статус: Участник
системщик

Создано: 01 февраля 2008 20:39
· Личное сообщение · #4

Isaev, в VC++/API будет цепочка обработчиков сообщений. В случае с MFC всё сложнее из-за иерархии классов и макросов которые цепляют метод к номеру сообщения. Сравнение с DeDe невозможно, т.к. он, думаю, разбирает внутренние таблицы дельфы в которых хранятся указатели на стандартные OnClick, Onchange...



Ранг: 24.1 (новичок), 1thx
Активность: 0.010
Статус: Участник

Создано: 01 февраля 2008 20:41
· Личное сообщение · #5

Great: а как узнаешь, что именно это событие - нужное?



Ранг: 10.9 (новичок)
Активность: 0=0
Статус: Участник

Создано: 01 февраля 2008 20:50
· Личное сообщение · #6

вроде в fubar(плагин к иде) есть mfc message map parser. самому пока не приходилось пользоватся этой фичей так что ничего нескать




Ранг: 240.5 (наставник)
Активность: 0.190
Статус: Участник
Author of ACKiller

Создано: 01 февраля 2008 22:11 · Поправил: HoBleen
· Личное сообщение · #7

В Delphi'йских формах данные формы хранятся в объекте класса, в т.ч. указатель на функцию-обработчик, поэтому чтобы узнать функции-обработчики нужно разбирать поля конкретного объекта класса TForm (если не ошибаюсь в названии). Указатель на объект передается аргументом в функцию CreateForm, которая обычно вызывается в основной процедуре.



Ранг: 218.5 (наставник), 2thx
Активность: 0.090
Статус: Участник

Создано: 01 февраля 2008 22:49
· Личное сообщение · #8

Стандартный изврат вроде такой: месаг-бряк на WinProc контрола, который бум кликать (аля на кнопочку "Register" ). Клик дает цепочку месаг: 21, 201, 202, 215. А дальше: если повезет--бряк на секцию кода проги (или dll), или трэйс--в общем случае.




Ранг: 756.3 (! !), 113thx
Активность: 0.610.05
Статус: Участник
Student

Создано: 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




Ранг: 441.3 (мудрец), 297thx
Активность: 0.410.04
Статус: Участник

Создано: 02 февраля 2008 20:53
· Личное сообщение · #10

Isaev пишет:
значит, по идее не возможно сделать прогу (в случае с VC и VB), которая покажет, например при наведении на конкретный объект мыши, все события, которые им обрабатываются? В случае с Delphi, получается тоже, в зависимости от реализации... Или я не всё правильно понял???


В поставке Delphi ведь есть утилитка WinSight - которая показывает все окна в системе и обрабатываемые ими события (и от клавы и от мыши и много других).
Или и я не всё правильно понял?




Ранг: 756.3 (! !), 113thx
Активность: 0.610.05
Статус: Участник
Student

Создано: 02 февраля 2008 21:15
· Личное сообщение · #11

tihiy_grom хрен знает... Вот простой пример, Delphi 7 cocoshare.cc/892411112/Project1.rar
В WinSight это окно вообще не нашёл...

-----
z+Dw7uLu5+jqLCDq7vLu8PvpIPHs7uMh




Ранг: 441.3 (мудрец), 297thx
Активность: 0.410.04
Статус: Участник

Создано: 02 февраля 2008 21:43
· Личное сообщение · #12

Смотри аттач
WinSight иногда тупит - она практически ничего не может определить когда открыто дохрена окон (например когда запущена Delphi или Ida), что очень неудобно
Так что приходится его запускать при минимальном количестве работающих приложений

3546_02.02.2008_CRACKLAB.rU.tgz - winsight.JPG




Ранг: 756.3 (! !), 113thx
Активность: 0.610.05
Статус: Участник
Student

Создано: 02 февраля 2008 23:21
· Личное сообщение · #13

Она всё равно просто хучит события, которые происходят в данный момент, но не показывает какие из них обрабатываются компонентом

-----
z+Dw7uLu5+jqLCDq7vLu8PvpIPHs7uMh





Ранг: 312.0 (мудрец), 349thx
Активность: 0.460.65
Статус: Участник
Advisor

Создано: 03 февраля 2008 09:06
· Личное сообщение · #14

Isaev пишет:
когда нужно обычно узнать лишь адрес процедуры обработки onClick)

в дельфовых, самый простой метод, через поиск названия процедуры ..
К примеру сморишь скрипт формы в редакторе, находишь нужный контрол, ниже будет:
OnDblClick = Label8DblClick
Находишь название в отладчике, ниже строки (или выше) - будет адрес ..

-----
Чтобы юзер в нэте не делал,его всё равно жалко..





Ранг: 756.3 (! !), 113thx
Активность: 0.610.05
Статус: Участник
Student

Создано: 03 февраля 2008 09:37
· Личное сообщение · #15

Bronco +1 работает

-----
z+Dw7uLu5+jqLCDq7vLu8PvpIPHs7uMh




Ранг: 441.3 (мудрец), 297thx
Активность: 0.410.04
Статус: Участник

Создано: 05 февраля 2008 00:44
· Личное сообщение · #16

Bronco
А с этим как бороться - если события контролов меняются во время выполнения? Вот простой пример сделал - у кнопки при каждом нажатии меняется событие, причем разными способами. Как это отлавливать? Ладно в примере понятно что он меняется после каждого нажатия, а если в реальной проге такое учудят?
rapidshare.de/files/38492059/Project1.exe.html



Ранг: 481.4 (мудрец), 109thx
Активность: 0.180
Статус: Участник
Тот самый :)

Создано: 05 февраля 2008 02:06
· Личное сообщение · #17

А не проще написать на VC - посмотреть как оно выглядит в асме, написать другой пример - сравнить.
А то тут мега теории строятся...

-----
Реверсивная инженерия - написание кода идентичного натуральному





Ранг: 312.0 (мудрец), 349thx
Активность: 0.460.65
Статус: Участник
Advisor

Создано: 05 февраля 2008 02:40
· Личное сообщение · #18

tihiy_grom
А с этим как бороться .... ????
Решай задачи по мере их поступления
//череп - не только для того чтобы кушать...

-----
Чтобы юзер в нэте не делал,его всё равно жалко..





Ранг: 756.3 (! !), 113thx
Активность: 0.610.05
Статус: Участник
Student

Создано: 24 августа 2008 11:15 · Поправил: Isaev
· Личное сообщение · #19

Начал тут изучать цикл статей: --> Исследование кода, генерируемого Delphi <--
Вроде всё доступно и логично, но там в самом начале есть такая фраза:
Аргументом метода TApplication::CreateForm() передаётся указатель - на структуру RTTI класса нашей формы.
Как найти программно найти этот указатель?

-----
z+Dw7uLu5+jqLCDq7vLu8PvpIPHs7uMh





Ранг: 568.2 (!), 464thx
Активность: 0.550.57
Статус: Участник
оптимист

Создано: 24 августа 2008 11:43 · Поправил: ClockMan
· Личное сообщение · #20

Есть плагин для Олли --> PointEvents <-- http://www.tuts4you.com/download.php?view.1880 по нему можно отследить вызов функций для програм написаных на Delphi мануал в нутри.
P.S. Единственное иногда он лажаеться когда файл после расспаковки.

-----
Чтобы правильно задать вопрос, нужно знать большую часть ответа. Р.Шекли.





Ранг: 756.3 (! !), 113thx
Активность: 0.610.05
Статус: Участник
Student

Создано: 24 августа 2008 12:06
· Личное сообщение · #21

ClockMan где это визуально видно и в тех статьях описано... Я спрашивал
Isaev пишет:
Как найти программно найти этот указатель?

т.ч. вопрос остался

-----
z+Dw7uLu5+jqLCDq7vLu8PvpIPHs7uMh




Ранг: 135.2 (ветеран)
Активность: 0.070
Статус: Участник

Создано: 24 августа 2008 20:17
· Личное сообщение · #22

tihiy_grom пишет:
Вот простой пример сделал - у кнопки при каждом нажатии меняется событие, причем разными способами. Как это отлавливать

а отладчик вам для чего тогда дан?



Ранг: 481.4 (мудрец), 109thx
Активность: 0.180
Статус: Участник
Тот самый :)

Создано: 26 августа 2008 12:42
· Личное сообщение · #23

Isaev пишет:
Аргументом метода TApplication::CreateForm() передаётся указатель - на структуру RTTI класса нашей формы.
Как найти программно найти этот указатель?

Где ты собрался его программно получать?

-----
Реверсивная инженерия - написание кода идентичного натуральному





Ранг: 673.3 (! !), 400thx
Активность: 0.40.31
Статус: Участник
CyberMonk

Создано: 26 августа 2008 13:44
· Личное сообщение · #24

=) где где ...в чужой программе , при вызове TApplication::CreateForm. Вопрос стоит та , как динамически искать указатель на структуру RTTI класса.

-----
RE In Progress [!] Coding Hazard [!] Stay Clear of this Cube




Ранг: 481.4 (мудрец), 109thx
Активность: 0.180
Статус: Участник
Тот самый :)

Создано: 26 августа 2008 16:20
· Личное сообщение · #25

что значит "в чужой программе"? Ты хук делаешь? Ты RemoteThread там запускаешь? Ты бинарь не запущеный анализируешь? Если да то в чем анализируешь?
Ей богу как дети...

-----
Реверсивная инженерия - написание кода идентичного натуральному




Ранг: 14.6 (новичок)
Активность: 0.010
Статус: Участник

Создано: 26 августа 2008 16:40
· Личное сообщение · #26

Isaev пишет:
Вроде всё доступно и логично, но там в самом начале есть такая фраза:
Аргументом метода TApplication::CreateForm() передаётся указатель - на структуру RTTI класса нашей формы.
Как найти программно найти этот указатель?

На самом деле там несколько сложней. Если не ошибаюсь ей передается указатель на массив указателей структур РТТИ классов. Если потрейсить в отладчике программу от борланда, то почти в самом начале можно наткнуться на цикл с одной командой CALL EDX (или EBX, ECX и т.д. - не знаю является ли регистр постоянным для разных прог, как то не обращал внимания). Вот здесь и находится цикл инициализации классов, по сути та команда и есть вызов конструктора текущего класса. Так что, как уже предлагалось, смотрим в отладчике по нескольким программам откуда берется указатель и сравниваем. Могу предположить, что первичные константы находятся в секции idata. Но в общем где-то могу и ошибаться.

Isaev пишет:
как например программа выходит из этого цикла:

Выходит: после закрытия окна/после вызова DestroyWindow/когда hWnd недействителен - это почти одно и тоже. В этом случае IsWindow вернет 0.
Но тот код - это не обработчик событий, это "конвеер" получения сообщений из буфера сообщений приложения. В данном случае, имхо, ты перепутал "будку с собакой".




Ранг: 681.5 (! !), 405thx
Активность: 0.420.21
Статус: Участник
ALIEN Hack Team

Создано: 26 августа 2008 20:20
· Личное сообщение · #27

Isaev пишет:
Интересует обобщённый принцып нахождения в отладчике участка кода, отвечающего за обработку того или иного события определённого компонента (как это делает DeDe например), в частности для VC
Декомпиляция делфей происходит на ура из-за избыточной информации в ехе файле, в VC этого нет, поэтому и аналогий быть не может. В делфях же есть специальная таблица обработчиков событий, и такие проги, как DeDe, ниего особенного не делают, просто показывают эту таблицу и всё, тут нужно просто с форматом файлов дельфовых разбираться

-----
Stuck to the plan, always think that we would stand up, never ran.





Ранг: 793.4 (! !), 568thx
Активность: 0.740
Статус: Участник
Шаман

Создано: 27 августа 2008 08:36
· Личное сообщение · #28

ARCHANGEL пишет:
такие проги, как DeDe, ниего особенного не делают, просто показывают эту таблицу и всё

Угу, то то кроме древнего деде больше прог и нету для показа этой таблички. Посмотрел бы хоть сорсы его чтобы так говорить. Чего только стоит брутфорс поинеров в BSS и содержимое баз VMT для каждой версии.

-----
Yann Tiersen best and do not fuck





Ранг: 793.4 (! !), 568thx
Активность: 0.740
Статус: Участник
Шаман

Создано: 27 августа 2008 08:43 · Поправил: PE_Kill
· Личное сообщение · #29

Release пишет:
Вот здесь и находится цикл инициализации классов, по сути та команда и есть вызов конструктора текущего класса.

Ты не прав. Там не конструкторы. Есть у делфи директива initialization. Пишешь ее в конце юнита и при инициализации юнитов этот код выполнится. Вот тот цикл и вызывает код initialization у каждого юнита, у кого он есть. А конструкторы типа TApplication::CreateForm() уже после этого вызываются там же на еп

Code:
  1. ********
  2. 00539AC2    8B0D 10D05300   MOV ECX,DWORD PTR DS:[53D010]            ; Index.0053ECE8
  3. 00539AC8    8B06            MOV EAX,DWORD PTR DS:[ESI]
  4. 00539ACA    8B15 14D14D00   MOV EDX,DWORD PTR DS:[4DD114]            ; Index.004DD160
  5. 00539AD0    E8 1B11F5FF     CALL Index.0048ABF0 
  6. 00539AD5    8B03            MOV EAX,DWORD PTR DS:[EBX]
  7. 00539AD7    8B80 FC020000   MOV EAX,DWORD PTR DS:[EAX+2FC]
  8. 00539ADD    8B90 70010000   MOV EDX,DWORD PTR DS:[EAX+170]
  9. 00539AE3    42              INC EDX
  10. 00539AE4    E8 AF10FBFF     CALL Index.004EAB98 <- Конструктор Form2
  11. ********


-----
Yann Tiersen best and do not fuck




Ранг: 37.1 (посетитель)
Активность: 0.010
Статус: Участник

Создано: 27 августа 2008 10:15
· Личное сообщение · #30

Dede не дизассемблировал (более того не видел даже), но думаю надо копать в сторону метода ReadComponents экземпляра объекта TReader. Кто нибудь открывал DeDe в DeDe ?


. 1 . 2 . >>
 eXeL@B —› Основной форум —› Нахождение кода обработки событий!
:: Ваш ответ
Жирный  Курсив  Подчеркнутый  Перечеркнутый  {mpf5}  Код  Вставить ссылку 
:s1: :s2: :s3: :s4: :s5: :s6: :s7: :s8: :s9: :s10: :s11: :s12: :s13: :s14: :s15: :s16:


Максимальный размер аттача: 500KB.
Ваш логин: german1505 » Выход » ЛС
   Для печати Для печати