Раздел: Документация
0 ... 81 82 83 84 85 86 87 ... 102 260 Приложение А. Практические советы по восстановлению системы в боевыу —-—Суслов! Листинг А.2 (продолжение} код категории исключения расшифровку кодов исключений можно найти в WINNT.H. входящем в состав SDK. прилагаемой к любому Windows-компилятору подробное описание всех исключений содержится в документации по процессорам Intel и AMD, бесплатно распространяемой их производителями (внимание: для перевода кода исключения операционной системы в вектор прерывания ЦП вы должны обнулить старшее слово) в данном случае это 0x5 - попытка доступа к памяти по запрещенному адресу *----> Сведения о системе <----* Имя компьютера: KPNC Имя пользователя: Kris Kaspersky Число процессоров: 1 Тип процессора: х8б Family 6 Model 8 Stepping б Версия Windows 2000: 5.0 Текущая сборка: 2195 Пакет обновления: None Текущий тип: Uniprocessor Free Зарегистрированная организация: Зарегистрированный пользователь: Kris Kaspersky : краткие сведения о системе *----> Список задач <----* 0 idle.exe, 8 Systerri.exe 232 smss.exe 1244 os2srv.exe 1164 os2ss.exe 1284 wirdbg.exe 1180 MSDEV.exe 1312 cmd.exe 612 iest.exe 1404 drwtsn32.exe 0 Tota!.ехе (00400000 - 00406000) (77F80000 - 77FFA0C0) (77Е80000 - 77F37000) : перечень загруженных DLL : согласно документации, справа от адресов должны быть перечислены имена ; соответствующих модулей, однако практически все они так хорошо "замаскировались . ; что стали совершенно не видны, вытащить их имена из файла протокола все-таки hojw ; но придется немного пошаманить (см. ниже "таблицу символов") Копия памяти для потока 0x188 : ниже идет копия памяти потока, вызывавшего исключение еах-00000064 eox=7ffdf000 ссх=00000000 edx=00000064 esi=00000000 edi=00000000 eiD-00401C14 esp=0012ff70 ebp=0012ffc0 iopl-0 nv up ei pi nz na pe nc 0Й > 0040;0i4 0fbe3c31movsx edi.byte ptr [ecx+esi]ds:00000000=?? Продолжение & rS,n01b ss=0023 ds=0023 es=0023 fs=0038 gs=OODO ef1-00000202 совер*имое Регистров и флагов Функция: <nosymbols> . распечатка окрестной точки сбоя O0400ffc 0000add [eaxl.alds:00000064=?? ; записываем в ячейку, на которую ссылается ЕАХ. значение AL ; значение адреса ячейки, вычисленной Доктором Ватсоном, равно 64h. : что. очевидно, не соответствует действительности: ; Доктор Ватсон подставляет в выражение значение регистра ЕАХ ; на момент возникновения сбоя, и это совсем не то значение, которое ; было в момент исполнения! к сожалению, чему был равен ЕАХ в момент : исполнения ни нам. ни Доктору Ватсону не известно. 004CSffe 0000add [eaxl.alds:00000064=?? : записываем в ячейку, на которую ссылается ЕАХ, значение AL : как? опять? что это за бред?! вообще-то так кодируется ; последовательность 00 00 00 00, по всей видимости, являющаяся : осколком некоторой машинной команды, неправильно интерпретированной : дизассемблерным движком Доктора Ватсона: 0040:000 8Ь542408 rov cdx.Lcsp+0x8]ss:00f8d547=???????? : загружаем в EDX аргумент функции : какой именно аргумент - сказать невозможно, так как мы не знаем адрес ; стекового фрейма: 004С10С4 33с9хогссх.есх : обнуляем ЕСХ 00401006 85d2testedx.cdx 00401008 7е18jle00409b22 : если EDX = 0. прыгаем на адрес 409B22h 0040100a 8D4424C8 moveax.[esp0x8~,ss:00f8d547=???????? : загружаем уже упомянутыйаргумент в регистр ЕАХ 0040 2 ООе 56pusr. esi : сохраняем ESI в стеке, перемещая тем самым указатель вершины стека : на 4 байта вверх (в область младших адресов) 0040100-f 8Ь742Д08 mov esi. [esp+OxS]SS:C0f80547=???????? : загружаем в ESI очередной аргумент : поскольку ESP был только что изменен, это совсем не тот аргумент. ". с которым мы имели дело ранее 00401013 Ь7push edi : сохраняем регистр EDI в стеке FramePtr ReturnAd ?a<~am#l Param#2 Paran#3 Param#4 -unction Name : FramePtr:указывает на значение фрейма стека. Листинг А.2 (продолжение) вот мы и добрались до инструкции, возбудившей исключение доступа, она обращается к ячейке памяти, на которую указывает сумма регистров ЕСХ а чему равно их значение? прокручиваем экран немного вверх и находим ЕСХ + ESI =0. о чем Доктор Ватсон нам и сообщает: "ds:000000" отметим, что этой информации можно верить, поскольку подстановка эффективного адреса осуществлялась непосредственно в момент исполнения теперь вспомним, что ESI содержит копию переданного функции аргумента и что ЕСХ был обнулен явно, следовательно, в выражении [ECX+ESI] регистр ESI - указатель, а ЕСХ - индекс. раз ESI равен нолю, то нашей функции передали указатель на невыделенную область памяти, обычно зто происходит либо вследствие алгоритмической ошибки, либо вследствие исчерпания виртуальной памяти, к сожалению. Доктор Ватсон не осуществляет дизассемблирование материнской функции, и какой из двух предполагаемых вариантов правильный, нам остается лишь гадать... правда, можно дизассемблировать дамп памяти процесса (если, конечно, он был сохранен), но это уже не то... 00401018 С3с7add еах. edi ; сложить содержимое регистра ЕАХ с регистром EDI и записать результат в ЕАХ 0040101а 41inc ссх : увеличить ЕСХ на единицу 004010it> ЗЬсаст.р ecx.edx 00401010 7cf5jl 00407014 : до тех пор пока ЕСХ < EDX. прыгать на адрес 407014 : (очевидно, мы имеем дело с циклом, управляемым счетчиком ЕСХ). : при интерактивной отладке мы могли бы принудительно выйти : из функции, возвратив флаг ошибки, чтобы материнская функция : (а с ней и вся программа целиком) могла продолжить свое выполнение. : и в этом случае потерянной окажется лишь последняя операция, но все : остальные данные окажутся неискаженными: 0040101т 5fpop cdi 004С1020 5еpop es- 00401C2I c3-et : выходим из функции ----> Обратная трассировка стека <----* содержимое стека на момент возникновения сбоя распечатывает адреса и параметры предыдущих выполняемых функций. при интерактивной отладке мы могли бы просто передать управление на одну из вышележащих функций, что эквивалентно возращению в прошлое. зто только в реальной жизни разбитую чашку восстановить нельзя. в компьютерной вселенной возможно все! 0 ... 81 82 83 84 85 86 87 ... 102
|