Жизнь после BSOD


Рисунок6 soft-ice показывает инструкцию


Вот она! Инструкция, вызвавшая сбой! А давайте ее "перепрыгнем", продолжив выполнение с RET 08h? Сказано — сделано. Но для начала нужно выйти из обработчика исключения. Для этого в soft-ice необходимо выполнить следующие команды:

 

q       r eip = *esp + sizeof(mov eax,[0]);   // устанавливаем регистр EIP на RET

q       r cs = *(esp + 4);                                   // устанавливаем селектор CS (не обязательно)

q       r FL = I;                                                 // разрешаем прерывания;

q       r esp = esp + C                                      // снимаем со стека 3 дв.слова, заброшенные туда CPU

q       x                                                              // выходим из отладчика

 

После выполнения этой "магической" последовательности команд, система продолжит свою нормальную работу и синий экран уже не появится. Фантастика! Невероятно! Мы только что избежали гибели, которая еще мгновение назад казалась неотвратимой!

Один маленький нюанс. Моя (и возможно ваша) версия soft-ice не умеет восстанавливать регистр ESP в обработчике исключения. Отладчик игнорирует команду r esp=esp +C, на самом деле только имитируя ее выполнение! А это значит, что стек остается несбалансированным и несмотря ни на какие усилия "медиков", система все-таки грохается. Приходится хитрить. Мы видим, что за RET 08h расположена длинная цепочка NOP'ов. А что если воткнуть сюда команду "ADD ESP,0Ch", чтобы стек сбалансировал сам процессор?

Говорим отладчику 'A BE67C008' (ассемблировать начиная с адреса BE67C008) и вводим следующие ассемблерные инструкции: ADD ESP,0C<ENTER>JMP BE67C005<ENTER> и еще один <ENTER> для завершения ввода. Переустанавливаем EIP на начало нашей "заплатки" — r eip =BE67C008 и... выходим из soft-ice. На этот раз у нас все получается!

На всякий случай, вот последовательность команд по реанимации системы. Напоминаю, что она применима только в данном частном случае:

 

u *esp

r eip = *esp

r eip = eip + 9

a eip

add esp,0c

jmp BE67C005h ; адрес команды RET 8, в вашем случае будет другим

<ENTER>

r fl=I

x




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