Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > Asm для Windows/Dos > Точка входа в процедуру... |
Автор: kdaemonv 4.2.2006, 16:24 |
Вопрос в следующем: имеется какая либо программа (к примеру виндовый сапер), и необходимо найти точку входа в процедуру обработки какого-либо события (к примеру, нажатие на кнопку начала игры, или выбор пункта меню, или срабатывание таймера, или ...). С помощью каких утилит можно выцепить эту инфу? И, насколько я понимаю, возможны варианты когда эту инфу можно выцепить напрямую из экзешника, а возможно придется и запускать экзешник (может некоторые объекты будут созданы динамически). Здесь http://forum.vingrad.ru/index.php?showtopic=82319 я начал этот вопрос, но вразумительного ответа не получил. Я прошу не говорить, что мне нужно дизассемблировать программку. Я смотрел такие утилиты как WinSight32 из Дельфи и Spy++ из С++, но то ли я не догнал, где там можно найти инфу такого рода, то ли ее там нет. Насколько я понимаю в винде все является окнами: form, button, label - это все графические объекты (а значит - окно, со своими событиями и свойствами; я конечно же могу быть ой как не прав - ну извините, можете по-ходу объяснить и этот вопрос). А значит когда приложение создает какой-то графический объект (окно, кнопку, надпись), оно должно где-то в системе регистрировать этот объект (наверное номер регистрации - хэндл ![]() И еще: таймер в приложении ведь не графический объект (да и он не один такой). Как узнать адрес процедуры обработки срабатывания таймера или других событий неграфических объектов??? |
Автор: rsm 4.2.2006, 23:53 |
Угадал. Пожалуйста, сколько угодно - перехватывай отладчиком вызов функций CreateWindowEx, DialogBox (и т.д.), а потом перехватывай вызовы оконных функций (см. MSDN). И будешь ты ловить все сообщения от всех контролов всех окон (включая диалоговые). Будет ли от этого польза - тебе виднее (раз уж ты так увлекся именно вызовами). Про таймеры - см. MSDN по SetTimer, SetWaitableTimer, ну и пожалуй плюс еще Sleep. Для программ на Дельфи, которые по сути представляют собой интепретатор + скрипт формы, хорошо помогают проги типа Source Rescuer и DeDe - обычно, там можно сразу подсмотреть адрес функции, отвечающей за обработку какого-либо события. |
Автор: kdaemonv 11.2.2006, 05:46 |
Спасибо rsm! Ты меня направил на путь истинный ;) Хоть я и не матерый хакер, но пожалуй имею право тебя немного поправить (тем более, может кому-то понадобится такая же информация - не стоит заставлять его повторять мои поиски). Я тут почитал установленные с Delphi файлы помощи MS SDK (я бы их не читал, не зная какую функцию мне искать) и выяснил что сначала в приложении заполняется структура WNDCLASS*. Затем она регистрируется в системе функцией RegisterClass*. И лишь затем создается окно функцией CreateWindow*. Так вот нужные мне данные это lpfnWndProc в классах WNDCLASS (если искать в стеке - второе двойное слово, начиная с адреса переданного процедуре RegisterClass* - то есть точки останова более результативно и логично ставить на процедуру RegisterClass) и WNDCLASSEX (третье двойное слово). И пару ласковых относительно Delphi - ну они и намудровали ![]() Немного потанцевав с бубном вокруг простейшего приложения на Delphi (сильно не вникая - ну их), сделал следующее заключение: при создании любого окна/контрола параметру lpfnWndProc присваивается ссылка на одну и ту же функцию InitWndProc (из модуля VCL/Controls), которая получая управление меняет этот параметр у уже созданного окна при помощи функции SetWindowLong* с параметром nIndex = GWL_WNDPROC. Так что, при отладке приложений, написанных на Delphi, стоит ставить точки останова и на процедуру SetWindowLong*. Если кто-то хочет что-то уточнить - пишите, с удовольствием почитаю. А относительно таймеров еще не разбирался - скоро разберусь. Еще возникли вопросы вокруг DialogBox и MessageBox - но попробую сам разобраться - теперь хоть знаю в какую сторону рыть. * - значит что я имею ввиду и родственные структуры и процедуры (WNDCLASSEX, CreateWindowsEx etc.) |
Автор: rsm 12.2.2006, 00:00 |
Не всегда ![]() Ставить можно, но только с умом, т.е. с фильтрацией нужных окон и посылаемых им сообщений. В противном случае отладчик просто утонет в вызовах - окон много и каждому посылается куча сообщений. |
Автор: Maha 8.3.2006, 12:59 | ||
pohojay problema nahoju proceduri kotorie otve4ayt sa kakoeto deistvie w 4yjom processe i ho4y ih udaleno wisiwaty tak wot injecty etot process dopisiway tyda swoi code no wot wiswaty mne te proceduri ne udaetza proishodit ckrashe proceduri wot code:
4ital 4to mojno eshe DLL , no kakto prosto tupo wresaty w virtualku swoi code mne bolshe nrawitza problema w tom kak prawelno wisiwaty eti proceduri ![]() |