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