Из глубины программы посылается user-defined message в какое-то окно. Вопрос- как с наименьшими усилиями наити message handler в IDA и как поймать этот обработчик в SoftIce? Как например, в ниже-следующем примере, ковыряясь в коде в SoftIce, я вижу PostMessage посылающий 8005 в главное окно. Как ловить в функцию, получающюю управление Айсе (MyMsgHandler) и находить MyMsgHandler в Иде (без softice)? //In Main.h #define WM_MyMsg (WM_APP+5) //somewhere in Main.cpp AfxGetMainWnd()->PostMessage(WM_MyMsg, 0, 0); //In MainFrm.cpp: BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd) ON_WM_CREATE() ON_MESSAGE(WM_MyMsg,CMainFrame::MyMsgHandler) END_MESSAGE_MAP() afx_msg LRESULT CMainFrame::MyMsgHandler(WPARAM x,LPARAM y) { AfxMessageBox("In the message handler"); return 1; }
Может я как-то не так ищy, но ничего не прорезается. Я уже скомпилировал тестовую программу, посмотреть как все выглядит с дебаговой информацией. Я в АДЕ делаю search на immediate value = 8005, находит только в одном месте, где я посылаю 8005 в PostMessage: .text:00413FF1 push 0 .text:00413FF3 push 0 .text:00413FF5 push 8005h .text:00413FFA call j_?AfxGetMainWnd@@YGPAVCWnd@@XZ ; AfxGetMainWnd(void) .text:00413FFF mov ecx, eax .text:00414001 call j_?PostMessageA@CWnd@@QAEHIIJ@Z ; CWnd::PostMessageA(uint,uint,long) А вот как найти какое место программы получает управление? Search больше не находит 8005. Функция, которая вызывается виднеется только с одной кросс-ссылкой, которая указывает на один из jump'ов в сегменте, который находится в самом начале листинга, где находится х.ва туча jump'ов (смотри начало этого сегмента ниже). Это хорошо, что я знаю кто должен вызываться, а как же найти этот jmp в нашей суровой повседневной реальности? .text:00411000 ; Segment type: Pure code .text:00411000 ; Segment permissions: Read/Execute .text:00411000 _text segment para public 'CODE' use32 .text:00411000 assume cs:_text .text:00411000 ;org 411000h .text:00411000 assume es:nothing, ss:nothing, ds:_data, fs:nothing, gs:nothing .text:00411000 __enc$textbss$end dd 0CCCCCCCCh .text:00411004 db 0CCh .text:00411005 ; [00000005 BYTES: COLLAPSED FUNCTION j___snprintf. PRESS KEYPAD "+" TO EXPAND] .text:0041100A ; [00000005 BYTES: COLLAPSED FUNCTION j_CAtlAllocator__AddModule. PRESS KEYPAD "+" TO EXPAND] .text:0041100F ; [00000005 BYTES: COLLAPSED FUNCTION CWinApp::LoadAppLangResourceDLL(void). PRESS KEYPAD "+" TO EXPAND] .text:00411014 ; [00000005 BYTES: COLLAPSED FUNCTION j_ATL__CSimpleArray_unsigned_long_ATL__CSimpleArrayEqualHelper_unsigne d_long______CSimpleArray_unsigned_long_ATL__CSimpleArrayEqualHelper_un signed_long___. PRESS KEYPAD "+" TO EXPAND] .text:00411019 ; ---------------------------------------------------------------------- ----- .text:00411019 jmp CRect__operator__ .text:0041101E ; [00000005 BYTES: COLLAPSED FUNCTION j__setdefaultprecision. PRESS KEYPAD "+" TO EXPAND] .text:00411023 ; [00000005 BYTES: COLLAPSED FUNCTION CDialog::OnInitDialog(void). PRESS KEYPAD "+" TO EXPAND] .text:00411028 ; [00000005 BYTES: COLLAPSED FUNCTION CWnd::get_accDescription(tagVARIANT,wchar_t * *). PRESS KEYPAD "+" TO EXPAND] .text:0041102D ; ---------------------------------------------------------------------- ----- .text:0041102D jmp CtestDoc__GetThisMessageMap .text:00411032 ; [00000005 BYTES: COLLAPSED FUNCTION j_CAtlAllocator___CAtlAllocator. PRESS K
Попробуй найти функцию которая обрабатывает все сообщения и посмотри куда она перенаправляет 8005 (прямого сравнения в этой функции с 8005 скорее всего не будет).
Ищи в иде AFX_MSGMAP Для окон будет что-то вроде: ?messageMap@CWinApp@@1UAFX_MSGMAP@@B ; AFX_MSGMAP const CWinApp::messageMap Для окон диалога будет: ?messageMap@CDialog@@1UAFX_MSGMAP@@B ; AFX_MSGMAP const CDialog::messageMap Напротив процедуры, где найдешь эти строки будет типа "; DATA XREF: .rdata:off_403310" Клацай туда попадешь на структуру: Код (Text): .rdata:00403310 off_403310 dd offset sub_4012D4 ; DATA XREF: sub_4012DE+7o ([b]AFX_MSGMAP[/b]) .rdata:00403314 dd offset unk_403318 .rdata:00403318 unk_403318 db [b]05h[/b] ; ø ; DATA XREF: .rdata:00403314o .rdata:00403319 db [b]80h[/b] ; Ã .rdata:0040331A db 0 .rdata:0040331B db 0 .rdata:0040331C dd 0 .rdata:00403320 dd 0 .rdata:00403324 dd 0 .rdata:00403328 dd 0Ah .rdata:0040332C dd 4015F3h ; [b]Message Handler[/b] Ида не всегда показывает двордами, по этому 8005h не находил
мда... я наверное о бабах думал вместо messages. Все, конечно, найдено. Помнится, как-то очень давно был какой-то plugin от redplat'a для автоматизации этого процесса. Случаем ни у кого не завалялся?