Жизнь после BSOD


Рисунок5 soft-ice отлавливает


Если нажать "x" (или <Ctrl-D>), то немедленно после выхода из soft-ice вспыхнет синий экран и тогда чинить будет уже нечего. Но пока мы в находимся в soft-ice еще можно кое-что предпринять. А предпринять можно следующее:

 

q       определить место сбоя (в нашем случае это обращение по нулевому указателю), исправить ситуацию (установить валидный указатель), вручную выйти из обработчика исключения, вернув CS:EIP на прежнее место: способ хороший, но увы — не универсальный и требующий определенного интеллекта, которого у машины нет;

q       зациклить текущий поток к ядреной фене, воткнув в свободное место jmp $ и выйти из отладчика, разрешив прерывания командной r fl=I (если они вдруг были запрещены) — все будет ужасно тормозить, но ось продолжит работать и мы по крайней мере сможем корректно завершить ее работу;

q       дождаться вызова функции KeBugCheckEx и сразу же выйти из нее, проигнорировав сбой и продолжив нормальное выполнение, правда, никаких гарантий, что система не рухнет окончательно, у нас нет;

q       способ предложенный ms-rem — дикий, но иногда работающий: отдать команды r eip=0/r cs=1B, переключающие процессор на прикладной режим;

 

Короче, вариантов много. Можно сказать, толпа. В глазах рябит и разбегается, вызывая оживленное подергивание где-то в области хвоста. Ладно, попробуем для начала воспользоваться первым способом. Мы знаем, что в данном случае, авария произошла из-за ошибки нарушения доступа (в другом случае мы этого знать не будем). Следовательно, процессор возбудил исключение, забросил на вершину стека EIP/CS/FLAGS и передал управление обработчику исключений внутри которого мы сейчас и находится (примечание: иногда по не совсем понятной причине, soft-ice останавливается не на первой команде обработчика исключений, а на непосредственно на месте самого сбоя. Под VM Ware первый раз soft-ice 2.6 всегда останавливается в обработчике, а все последующие разы — на месте сбоя. Эффект сохраняется вплоть до перезапуска VM Ware).

Даем команду "d esp" для отображения содержимого стека и видим (примечание: для удобства рекомендуется переключить окно дампа в режим двойных слов, воспользовавшись командой "dd"):

 

:d esp

0010:F7443C88 BE67C000  00000008  00200202  804A4431      ..g....... .1DJ.

0010:F7443C98 81116AD0  8649D000  BE8F1D08  BE8F1D08      .j....I.........

0010:F7443CA8 81480020  F7443D34  745FFFFF  83A49E60       .H.4=D..._t`...




- Начало -  - Назад -  - Вперед -