Раздел: Документация
0 ... 82 83 84 85 86 87 88 ... 102 выше (то есть в более младших адресах) содержатся аргументы функции, ниже - ее локальные переменные пАо". бережно хранит адрес возврата в материнскую функцию. если здесь содержится иусор и обратная трассировка стека начинает характерно шуметь, с высокой степенью вероятности можно предположить, что мы инеем дело сшибкой "срыва стека", а возможно, и с попыткой атаки вашего компьютера четыре первых параметра функции - именно столько параметров Доктор Ватсон отображает на экране: это достаточно жесткое ограничение — многие функции имеют десятки параметров и четыре параметра еще ни о чем не говорят: однако недостающие параметры легко вытащить из копии необработанного стека вручную, достаточно лишь перейти по указанному в поле FramePtr адресу Func Name: имя функции (если только его возможно определить): реально отображает лишь имена функций, импортируемые из других DLL, поскольку встретить коммерческую программу, откомпилированную вместе с отладочной информацией, практически нереально C012FFCO 77Е87903 0О0С0СО0 00000С0С 7-FDF000 С0000005 !<nosymbols> C312FFF0 00000000 00401040 00000C0G 00О000С8 03000100 kernel 32! SetUnnandl edExc ept i orFi Iter ; функции перечисляются в порядке их исполнения: самой последней исполнялась : kernel32!SetUnhandledExceptionFilter - функция, обрабатывающая данное исключение *—> Копия необработанного стека < ---* : копия необработанного стека содержит стек таким, какой он есть. : очень помогает при обнаружении buffer overfull атак - весь shell-код, : переданный злоумышленником, будет распечатан Доктором Ватсоном. и вам : останется всего лишь опознать его (подробнее об этом рассказывается : в моей книге "Техника сетевых атак") 0012ff7C 00 00 00 00 00 00 00 00 - 39 10 40 00 00 00 СО 00.......9.0..... CC12ff83 64 00 00 00 f4 10 40 00 - 01 00 00 00 d0 0е 30 00 d... .(а.......0. S013C090 00 00 00 00 00 00 00 00 - 00 00 00 00 00 00 00 00 ............... М:300а0 00 00 00 00 00 00 ОС 00 - ОС 00 00 00 00 ОС СО 00 ............ *—> Таблица символов <----* таблица символов содержит имена всех загруженных DLL вместе с именами импортируемых функций, используя эти адреса в качестве отправной точки, ны без труда сможем восстановить "перечень загруженных DLL" ntdll.dii 7?F81106 0С0С0000 ZwAccessCheckB/Type 7?FCEFB0 0С0000С0 fltused Продолжение & 264 Приложение А. Практические советы по восстановлению системы в боевых условия Листинг А.2 (продолжение) kernel32.dll 77Е81765 0000003d IsDebuggerPresent 77EDBF7A 00000000 VerSetConditicnMask : итак, возвращаемся к таблице загруженных DLL : (00400000 - 00406000) - зто. очевидно, область памяти, занятая самой программой : (77FB0000 - 77FFAO00) - зто KERNEL32.DLL ; (77ЕВ0000 - 77F37000) - это NTDDL.DLL MICROSOFT VISUAL STUDIO DEBUG При установке среды разработки Microsoft Visual Studio она регистрирует свой отладчик основным отладчиком критических ошибок по умолчанию. Это простой в использовании, но функционально ущербный отладчик, не поддерживающий даже такой банальной операции, как поиск hex-последовательности в оперативной памяти. Единственная «вкусность», отличающая его от продвинутого во всех отношениях Microsoft Kernel Debugger, — это возможность трассировки «упавших» процессов, выбросивших критическое исключение. В опытных руках отладчик Microsoft Visual Studio Debugger способен творить настоящие чудеса, и одно из таких чудес — это возобновление работы приложений, совершивших недопустимую операцию и при нормальном течении событий аварийно завершаемых операционной системой без сохранения данных. В любом случае интерактивный отладчик (коим Microsoft Visual Studio Debugger и является) предоставляет намного более подробную информацию о сбое и значительно упрощает процесс выявления источников его возникновения. Для ручной установки Microsoft Visual Studio Debugger основным отладчиком критических ошибок добавьте в реестр данные, представленные в листинге А.З. Листинг А.З. Установка Microsoft Visual Studio Debugger основным отладчиком критических ошибок [HKEY L0CAL MACHlNt\S0FIWARE\Microsoft\WindOws NT\CufentVersion\AeDebug] "AutO"="l" "Debugger"="\,C:\\Prg FilesWMS VS\\Coanon\\MSDev98\\Bin\\msdev.exe\" -P Sid -e Vd" "UserDebuggerHotKey"=dword:00000000 В листинге A.4 представлена демонстрационная программа, вызывающая со общение о критической ошибке. Листинг А.4. Демонстрационная программа, вызывающая сообщение о критической ошибке //функция возвращает сумму п символов типа char //если ей-передать null-pointer, она "упадет". //хотя источник ошибки не в ней. а в аргументах. //переданных материнской функцией testichar *buf.ir.t n) nit a. sun: for (a = 0:a < n: a++) sum <= buf[a]: // здесь возбуждается исключение return sum; maic { Refine П 100 char *buf =0:// инициализируем указатель на буфер /* but = malloc(lOO):*/ // "забываем" выделить память, здесь ошибка tesUbuf. М):// передаем null-pointer некоторой функции ОБИТАТЕЛИ СУМЕРЕЧНОЙ ЗОНЫ, ИЛИ ИЗ МОРГА В РЕАНИМАЦИЮ Хотите узнать, как заставить приложение продолжить нормальную работу после появления сообщения о критической ошибке? Это действительно очень актуально. Представьте, что «рухнуло» приложение, содержащее уникальные и еще не сохраненные данные. По минимуму их придется набивать заново, по максимуму — они потеряны для вас навсегда. На рынке имеется некоторое количество утилит, способных решить эту задачу (взять те же Norton Utilities), но нх «интеллектуальность* оставляет желать лучшего, и в среднем они срабатывают один раз из десяти. В то же самое время ручная реанимация программы воскрешает ее в 75-90 % случаев. Строго говоря, гарантированно восстановить работоспособность «обрушившейся» программы нельзя, равно как и невозможно выполнить «откат» действий, предшествующих ее обрушению. В лучшем случае вам удастся сохранить свои Данные на диске до того, как программа полностью потеряет нить управления и пойдет вразнос. Но и это неплохо! Существует по меньшей мере три различных способа реанимации: 1-Принудительный выход из функции, возбудившей исключение. 2-«Раскрутка» стека с передачей управления назад. 3-Передача управления на функцию обработки сообщений. Усмотрим каждый из этих способов на примере приложения testt.exe, кото- l4 можно скачать с сайта издательства. Забегая вперед, отметим, что реанимации поддаются лишь те сбои, что вызваны Аритмическими, а не аппаратными ошибками (то есть сбоем оборудования). ecjih информация, хранящаяся в оперативной памяти, оказалась искажена в ре-3У1ьтате физического дефекта последней, то восстановить работоспособность Упавшего приложения, скорее всего, уже не удастся, хотя, если сбой не затронул Жизненно важные структуры данных, некоторая надежда на благополучный ис-Х°Д Все-таки есть. 0 ... 82 83 84 85 86 87 88 ... 102
|