Как найти Message Handler?

Тема в разделе "WASM.RESEARCH", создана пользователем mygak, 20 ноя 2004.

  1. mygak

    mygak New Member

    Публикаций:
    0
    Регистрация:
    20 ноя 2004
    Сообщения:
    8
    Из глубины программы посылается 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;

    }
     
  2. bogrus

    bogrus Active Member

    Публикаций:
    0
    Регистрация:
    24 окт 2003
    Сообщения:
    1.338
    Адрес:
    ukraine
    Может поискать в иде по 8005, т.е. что-то типа "cmp eax,8005", за которым jxx в обработчик
     
  3. mygak

    mygak New Member

    Публикаций:
    0
    Регистрация:
    20 ноя 2004
    Сообщения:
    8
    Может я как-то не так ищ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
     
  4. rmn

    rmn Well-Known Member

    Публикаций:
    0
    Регистрация:
    23 ноя 2004
    Сообщения:
    2.348
    Попробуй найти функцию которая обрабатывает все сообщения

    и посмотри куда она перенаправляет 8005 (прямого сравнения в этой функции с 8005 скорее всего не будет).
     
  5. bogrus

    bogrus Active Member

    Публикаций:
    0
    Регистрация:
    24 окт 2003
    Сообщения:
    1.338
    Адрес:
    ukraine
    Ищи в иде 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):
    1. .rdata:00403310 off_403310      dd offset sub_4012D4    ; DATA XREF: sub_4012DE+7o ([b]AFX_MSGMAP[/b])
    2. .rdata:00403314                 dd offset unk_403318
    3. .rdata:00403318 unk_403318      db [b]05h[/b] ; ø             ; DATA XREF: .rdata:00403314o
    4. .rdata:00403319                 db [b]80h[/b] ; Ã
    5. .rdata:0040331A                 db    0
    6. .rdata:0040331B                 db    0
    7. .rdata:0040331C                 dd 0
    8. .rdata:00403320                 dd 0
    9. .rdata:00403324                 dd 0
    10. .rdata:00403328                 dd 0Ah
    11. .rdata:0040332C                 dd 4015F3h  ; [b]Message Handler[/b]
    Ида не всегда показывает двордами, по этому 8005h не находил
     
  6. mygak

    mygak New Member

    Публикаций:
    0
    Регистрация:
    20 ноя 2004
    Сообщения:
    8
    мда... я наверное о бабах думал вместо messages.

    Все, конечно, найдено. Помнится, как-то очень давно был какой-то plugin от redplat'a для автоматизации этого процесса. Случаем ни у кого не завалялся?