8(495)909-90-01
8(964)644-46-00
pro@sio.su
Главная
Системы видеонаблюдения
Охранная сигнализация
Пожарная сигнализация
Система пожаротушения
Система контроля удаленного доступа
Оповещение и эвакуация
Контроль периметра
Система домофонии
Парковочные системы
Проектирование слаботочных сетей
Аварийный
контроль
Раздел: Документация

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