Сейчас на форуме: ut2004, vsv1 (+7 невидимых)

 eXeL@B —› Вопросы новичков —› Как узнать функцию-обработчик таймера по HWND окна?
Посл.ответ Сообщение

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

Создано: 09 ноября 2006 10:52
· Личное сообщение · #1

Помогите советом: иследую программу CollMate, которая по истечении некоторого одинакого времени самозакрывается.
Значит виноваты таймеры

Ставлю бряки на SetTimer и получаю такое

0012FD4C 001701F8 |hWnd = 001701F8 (class='TPUtilWindow')
0012FD50 00000001 |TimerID = 1
0012FD54 00027100 |Timeout = 160000. ms
0012FD58 00000000 Timerproc = NULL

Как найти процедуру обработки таймера?



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

Создано: 09 ноября 2006 11:05
· Личное сообщение · #2

На чём прога написана?



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

Создано: 09 ноября 2006 11:06
· Личное сообщение · #3

Ожидание таймера осуществляется с помощью Wait функций (WaitForSingle(/Multiple)object). Если вызываются Wait функций попробуй у них поставить параметр dwMilliseconds в -1.



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

Создано: 09 ноября 2006 12:47
· Личное сообщение · #4

hell пишет:
На чём прога написана?

на Delphi

При схеме, когда Timerproc = NULL и есть hWnd, класс окна должен наследовать функцию OnTimer(TimerID). Я так понимаю, что система каждые Timeout миллисекунд
1. Посилает меседж окну с определенными параметрами - я думаю это и есть наш случай
2. Вызывает callback функцию, это когда Timerproc != NULL

Возможно ли в олли поставить фильтр на SendMessage/PostMessage окну c указаным hWnd и узнать их обработчика?


asd пишет:
Ожидание таймера осуществляется с помощью Wait функций (WaitForSingle(/Multiple)object)

Спасибо за идею. Но как я узнаю функция ожидает таймер, а не скажем семафор? И как узнать по HANDLE узнать TimerID?



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

Создано: 09 ноября 2006 13:21
· Личное сообщение · #5

amely
Сори я что-то вообще не отех таймерах подумал. А на счёт твоего случая я никогда не пользовался сам и не сталкивался. Но если верить MSDN то:
"If lpTimerFunc is NULL, the system posts a WM_TIMER message to the application queue. The hwnd member of the message's MSG structure contains the value of the hWnd parameter. "
из чего следует(если мне мой жуткий английский не изменяет ), что тебе надо искать обработку сообщения WM_TIMER в оконной процедуре.
P.S.
А ты пробовал в Timeout при SetTimer загнать -1, или вместо Timerproc = NULL поставить адрес своего обработчика таймера.



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

Создано: 09 ноября 2006 13:41
· Личное сообщение · #6

asd пишет:
что тебе надо искать обработку сообщения WM_TIMER в оконной процедуре.

клас у меня есть - class='TPUtilWindow', теперь попробую RegisterClassEx чтобы выяснить адрес оконной процедуры и там уже буду искать обработку сообщения WM_TIMER


asd пишет:
А ты пробовал в Timeout при SetTimer загнать -1, или вместо Timerproc = NULL поставить адрес своего обработчика таймера.

Нет не пробовал. Хотя попробовать надо НО, возможно эти таймера еще чего полезного делают, кроме очередной проверки на подлинность копии



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

Создано: 09 ноября 2006 22:27 · Поправил: hell
· Личное сообщение · #7

amely
Возьми DeDe или SourceResourcer и посмотри адрес функции таймера потом в Olly ставь бряк на этот адрес.

Кинь ссылку на прогу.



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

Создано: 10 ноября 2006 06:21
· Личное сообщение · #8

hell пишет:
Возьми DeDe или SourceResourcer и посмотри адрес функции таймера

пока что не знаю как

hell пишет:
Кинь ссылку на прогу.


Collmate 1.34.2.73 unpacked and partly cracked - вылетает через приблизительно 3 минути, даже ничего не надо делать, запустить, подождать и бац - проги нет

rapidshare.com/files/1831815/collmate.rar.html - только exe

инсталл здесь _http://www.sidency.com/download/collmate-en.exe (1,1 Mb)



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

Создано: 11 ноября 2006 03:34
· Личное сообщение · #9

amely
Ставишь бряк на адрес 5cd818 и ждешь. при закрытии прога прервется по этому адресу.



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

Создано: 11 ноября 2006 13:29
· Личное сообщение · #10

hell пишет:
Ставишь бряк на адрес 5cd818 и ждешь. при закрытии прога прервется по этому адресу.

Спасибо, но так и не вышел с этого адреса на оконную процедуру потому что уже выполнялась процедура закрытия приложения. Поскольку приложение закрывалось корректно (через ExitProcess), то поставил бряки на PostQuitMessages - и сработало . Далее по Call Stack'у добрался до нужного je .

На оконной процедуре вытянутой с RegisterClassEx - бряк не срабатывал - возможно дочерние окна переопределяли свою процедуру. Но все-таки вопрос открыт: Возможно ли в общем случае зная hWnd окна, класс окна, и TimerID определить обработчик события WM_TIMER в данном окне и как?



Ранг: 203.3 (наставник)
Активность: 0.220
Статус: Участник
UPX Killer -d

Создано: 14 ноября 2006 08:10
· Личное сообщение · #11

amely пишет:
0012FD4C 001701F8 |hWnd = 001701F8 (class='TPUtilWindow')
0012FD50 00000001 |TimerID = 1
0012FD54 00027100 |Timeout = 160000. ms
0012FD58 00000000 Timerproc = NULL

Как уже было сказано, событие таймера обрабатывает оконная проца. Судя по нестандартному классу окна ловить надо на RegisterClassEx/RegisterClass

ATOM RegisterClassEx(
CONST WNDCLASSEX *lpwcx // address of structure with class data
);

typedef struct _WNDCLASSEX { // wc
UINT cbSize;
UINT style;
WNDPROC lpfnWndProc;
int cbClsExtra;
int cbWndExtra;
HANDLE hInstance;
HICON hIcon;
HCURSOR hCursor;
HBRUSH hbrBackground;
LPCTSTR lpszMenuName;
LPCTSTR lpszClassName;
HICON hIconSm;
} WNDCLASSEX;



ATOM RegisterClass(
CONST WNDCLASS *lpWndClass // address of structure with class data
);

typedef struct _WNDCLASS { // wc
UINT style;
WNDPROC lpfnWndProc;
int cbClsExtra;
int cbWndExtra;
HANDLE hInstance;
HICON hIcon;
HCURSOR hCursor;
HBRUSH hbrBackground;
LPCTSTR lpszMenuName;
LPCTSTR lpszClassName;
} WNDCLASS;




-----
Я медленно снимаю с неё UPX... *FF_User*




Ранг: 203.3 (наставник)
Активность: 0.220
Статус: Участник
UPX Killer -d

Создано: 14 ноября 2006 08:12
· Личное сообщение · #12

amely пишет:
Возможно ли в общем случае зная hWnd окна, класс окна, и TimerID определить обработчик события WM_TIMER в данном окне и как?

Если не ошибаюсь, то в оконную процу придет сообщение WM_TIMER (или что-то типа того), значение константы ищи в делфи или С (или асме). Только не завидую если оконная проца скомпилена как case.

-----
Я медленно снимаю с неё UPX... *FF_User*




Ранг: 203.3 (наставник)
Активность: 0.220
Статус: Участник
UPX Killer -d

Создано: 14 ноября 2006 08:53
· Личное сообщение · #13

Т.к. эти методы не работают (или плохо искали или что-то ещё ), то можно спросить оконную процу с помощью след. АПИ (придется написать небольшую программку):
LONG GetWindowLong(
HWND hWnd, // handle of window
int nIndex // offset of value to retrieve
);
За подробностями - в SDK или любой доступный хэлп по WinAPI. Ещё можно поюзать готовую прогу "inqsoft window scanner". Главное найти именно нужное окно, а там найдётся и Timer, если это действительно он, а не Thread

-----
Я медленно снимаю с неё UPX... *FF_User*




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

Создано: 15 ноября 2006 04:37
· Личное сообщение · #14

AlexZ пишет:
Судя по нестандартному классу окна ловить надо на RegisterClassEx/RegisterClass

Так и делал, вытягивал WNDPROC lpfnWndProc, ставил бряк - но он не срабатывал.

AlexZ пишет:
Если не ошибаюсь, то в оконную процу придет сообщение WM_TIMER

В общем это так, если быть более точным, то функция DispatchMessage вызывает оконную процедуру для конкретного сообщения и для конкретного окна (hWnd). это справедливо и для WM_TIMER, если hWnd != NULL, иначе DispatchMessage вызывает callback функцию зарегестрированную при создании таймера.

AlexZ пишет:
Т.к. эти методы не работают (или плохо искали или что-то ещё ), то можно спросить оконную процу с помощью след. АПИ (придется написать небольшую программку):
LONG GetWindowLong

Вот в этом наверное и соль . Каждое отдельное окно может переопределить оконную процедуру класса на свою с помощью SetWindowLong или SetWindowLongPtr - так называемый сабклассинг. Так что буду курить SetWindowLong или SetWindowLongPtr


AlexZ пишет:
Ещё можно поюзать готовую прогу "inqsoft window scanner"

Спасибо!


AlexZ пишет:
Главное найти именно нужное окно, а там найдётся и Timer, если это действительно он, а не Thread

Можно здесь поподробней об Thread. Или умеется ввиду Thread queue?
Если таймеры отключить (например Timeout = 16000000 ms) - то программа будет работать 16000 секунд, после чего будет вызвана OnTimer, которая и сделает нехорошее дело . Я не совсем понимаю, как это будет проделывать поток, тоесть как Thread через указанный период времени чтото сделает. Я думаю без таймеров здесь не обойтись.



Ранг: 203.3 (наставник)
Активность: 0.220
Статус: Участник
UPX Killer -d

Создано: 15 ноября 2006 09:45 · Поправил: AlexZ
· Личное сообщение · #15

amely пишет:
Я не совсем понимаю, как это будет проделывать поток, тоесть как Thread через указанный период времени чтото сделает. Я думаю без таймеров здесь не обойтись.

Создать поток и заставить его поспать N милисекунд с помощью Sleep(N). Не исключено, что создается трэд, и в нем выполняются действия, которые по каким-то причинам нельзя побрякать.

// Выполняется в потоке:
while True do begin
Sleep(N);
...
end;


-----
Я медленно снимаю с неё UPX... *FF_User*




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

Создано: 20 ноября 2006 13:20
· Личное сообщение · #16

ОК, однозначного метода как узнать функцию-обработчик таймера по HWND окна НЕТ. Можна пробовать следующие варианты:

1. Ставить бряки на RegisterClassEx/RegisterClass и вытягивать WNDPROC lpfnWndProc для класса окна. Потом в этой функции по switch(WM_XXX) искать case WM_TIMER;

2. Возможно что окно переопределит свою оконную функцию методами SetWindowLong или SetWindowLongPtr - тогда надо ставить условные бряки на них

3. Программами "inqsoft window scanner" или Spy++ или подобными искать оконную процедуру конкретного окна, или использовать АПИ GetWindowLong / GetWindowLongPtr

4. Возможно событие WM_TIMER обрабатывается в message loop, тогда надо смотреть для потока в котором работает таймер код иежду GetMessage и DispatchMessage.

5. Возможно таймер только для отвода глаз, а "работу" выполняет некоторый поток по Sleep.

Наверное есть еще варианты, но они пока-что неизвестны мне.

Спасибо за ответы. Тему закрываю.


 eXeL@B —› Вопросы новичков —› Как узнать функцию-обработчик таймера по HWND окна?
Эта тема закрыта. Ответы больше не принимаются.
   Для печати Для печати