Слегка запарился, видел plugin под IDA-4.15, но такой версии нету качать нехочится. Ловлю событие(галочка в checkbox), нахожу окконую процедуру ставлю там условный breakpoint, а потом след теряется в дебрях MFC42.DLL Еще есть вариант найти функцию AfxDisptachCmdMsg, но она не экспортируется, а компилируется в код, вообщем тоже ненашел Насколькоя понял самый простой вариант отлювить событие, это найти в карте сообщений, нужний ID элемента управления и тамже будет лежать указатель на функцию обратного вызова(обработчик события). Вообщем как с наименьшими затратами найти функции обработчиков?
Вообщем уже нашел, надо поймать функцию CCmdTarget::OnCmdMsg которая экспортируется как #4424 там единственная функция с 7 параметрами AfxDispatchCmdMsg, на ней поставить условный бряк [ESP+8] == ID (который идентификатор элемента) дальше внутри функции AfxDispatchCmdMsg в switch-конструкции идет вызов обработчика Но если кто подскажет как декодировать карты сообщений буду рад
Ищешь вызовы конструктора CDialog mov esi, ecx ... call CDialog::CDialog ... mov dword ptr [esi], offset CDialogVMT Переходишь по offset CDialogVMT и со смещением 28h (зависит от версии MFC) находишь указатель на таблицу обработки сообщений Формат ее примерно таков dword ??? dword offset msg_table msg_table: dword msg_id ;MSG_XXXXXX dword ??? dword ??? dword ??? dword ??? dword offset procedure ;обработка MSG_XXXXXX Например, msg_id = 0xF соответствует обработке сообщения WM_PAINT
Маленькое исправление: по смещению 28h находится процедура, возвращающая указатель на таблицу обработки сообщений (типа GetMessageMap)