IE: все по-старому Крис Касперски ака мыщъх Хакер, номер #090, стр. 090-055-6 Теперь мы знаем, что сбой произошел в функции COleSite::GetInstantClassInfo(void), возвращающей указатель на структуру INSTANTCLASSINFO. К сожалению, описаний структур в pdb-файле нет (коварство Microsoft не знает границ!), но даже неполная символьная информация намного лучше, чем совсем никакой! Немного побурчав для приличия, займемся дизассемблированием функции CElement::GetDocPtr(void), возвратившей в регистре EAX ноль, и посмотрим, кто и почему ей сорвал крышу: Дизассемблерный текст функции CElement::GetDocPtr(void) .text:75A9211D ?GetDocPtr@CElement@@QBEPAVCDoc@@XZ proc near ; CElement::GetDocPtr() .text:75A9211D mov eax, [ecx+10h] .text:75A92120 mov ecx, [ecx+1Ch] .text:75A92123 test cl, 2 .text:75A92126 jz short loc_75A9212B .text:75A92128 mov eax, [eax+0Ch] .text:75A9212B .text:75A9212B loc_75A9212B: .text:75A9212B test cl, 1 .text:75A9212E jz short locret_75A92133 .text:75A92130 mov eax, [eax+2Ch] .text:75A92133 .text:75A92133 locret_75A92133: .text:75A92133 retn .text:75A92133 ?GetDocPtr@CElement@@QBEPAVCDoc@@XZ endp Используя регистр ECX, как указатель на объект, она извлекает из него еще один указатель, грузит его в EAX, а затем, используя полученный EAX как указатель, возвращает в том же самом EAX указатель на объект, который она должна возвратить, но в нашем случае возвращается ноль, что указывает на разрушение сложной иерархии структур данных. Дизассемблер не позволяет сказать, на каком этапе произошло разрушение. Может быть разрушен как базовый блок, на который указывает ECX, так и блок, расположенный по адресу *(ECX+10h). А, быть может, разрушение произошло еще раньше, но программа рухнула только сейчас. Чтобы не гадать на кофейной гуще, воспользуемся just-in-time отладчиком, в роли которого выступит популярный OllyDbg (http://www.ollydbg.de/). [докапываемся до истины] Запускаем OllyDbg, в меню "options" выбираем пункт "just-in-time debugging" и в появившемся диалоговом окне нажимаем кнопки "make OllyDbg just-in-time debugger" и "confirm before attaching". Выходим из отладчика и загружаем IEdie2-3 в IE. Через некоторое время появляется диалоговое окно с сообщением, что программа сделала что-то не так. "ОК" — завершает IE, "отмена" — запускает just-in-time отладчик. Очутившись в отладчике, мы оказываемся в уже знакомой нам точке сбоя по адресу 75ACC4DAh. Многократные запуски IE показывают, что сбои происходят в самых разных местах, но всегда после вызова функции GetDocPtr(), а иногда и внутри самой GetDocPtr(). Как тебе нравится следующее? Just-in-time отладчик показывает обрушение, произошедшее внутри GetDocPtr EAX 00000000 EBX 000BA14C ECX FFFFFFFF EDX 00E50764 ESP 0006DB9C EBP 0006DBCC ESI 00E552B0 EDI 00E552B0 EIP 75A92128 mshtml.75A92128 75A9211D 8B41 10 MOV EAX,DWORD PTR DS:[ECX+10] 75A92120 8B49 1C MOV ECX,DWORD PTR DS:[ECX+1C] 75A92123 F6C1 02 TEST CL,2 75A92126 74 03 JE SHORT mshtml.75A9212B 75A92128 8B40 0C MOV EAX,DWORD PTR DS:[EAX+0Ch] ; место сбоя 75A9212B F6C1 01 TEST CL,1 |