«Синий экран смерти» в любом другом цвете

Автор: Topol Четверг, Май 3rd, 2012 Нет комментариев

Рубрика: Операционные системы

Наблюдение BSoD не в синем цвете может смутить кого угодно, даже меня, и, основываясь на реакции аудитории TechEd, я готов поспорить, что вам было бы интересно подобрать свой цвет и потом показать его своим друзьям-айтишникам. Впервые я увидел это в исполнении Дэна Пирсона (Dan Pearson) во время его беседы о диагностике аварийных дампов памяти, которую он вел несколько лет назад с Дэйвом Соломоном (Dave Solomon), и теперь я завершаю свои презентации из серии »Дело о …» BSoD’ом в выбранном аудиторией цвете (реакцию аудитории на подобную концовку вы можете услышать, например, в конце этого видео). Стоит отметить, что описанные мной шаги для изменения цвета BSoD проделываются вручную и затрагивают только сеанс загрузки, так что они подходят для демонстраций, а не для общей настройки BSoD.

Подготовка системы
Поскольку вам нужно будет изменить код ядра, первый шаг заключается в открытии возможности редактировать код ядра в памяти, если это ранее не было сделано. Системы Windows с менее чем 2 Гб ОП используют 4 Кб страницы для хранения кода ядра, благодаря чему им можно обеспечить такой уровень защиты, который требуется для их содержимого. Например, страницы данных ядра должны разрешать доступ на чтение и запись, в то время как код ядра должен предоставлять доступ только для чтения и выполнения. В рамках оптимизации, которая позволяет увеличить скорость трансляции виртуальных адресов, Windows использует большие страницы (4 Мб на x86 и x64) на больших системах. Это означает, что если в странице хранится и код, и данные, то эта страница должна представлять доступ на чтение, запись и выполнение; так что для того, чтобы гарантировать наличие возможности редактирования страницы, вы должны обеспечить использование Windows больших страниц. Если у вас Windows XP или Windows Server 2003 и менее 256 Мб ОП, или Windows Vista или старше и есть 2 Гб ОП или меньше, создайте значение REG_DWORD с названием LargePageMinimum, которое установлено в 1, в ветке реестра HKLM\System\CurrentControlSet\Control\Session Manager\Memory Management:

Чтобы вы тот час же не помчались показывать результаты своей работы до автоматической перезагрузки Windows после сбоя, измените настройки автоперезагрузки. На Windows XP и Server 2003 щелкните правой кнопкой мыши на значке «Мой компьютер», выберите вкладку «Дополнительно» и нажмите кнопку «Параметры» в разделе «Загрузка и Восстановление». На Windows Vista и выше щелкните правой кнопкой мыши на значке «Компьютер» в меню Пуск, выберите «Свойства», нажмите «Дополнительные параметры системы», перейдите на вкладку «Дополнительно» и нажмите кнопку «Параметры» в разделе «Загрузка и Восстановление». Снимите флажок с параметра «Выполнять автоматическую перезагрузку»:

Если вы работаете на 64-битной версии Windows Vista или выше, вам нужно загрузить систему в режиме отладки, чтобы вы могли запустить отладчик ядра в режиме «local». Вы можете сделать это либо нажав F8 во время загрузки системы и выбрав режим отладки, либо поставив флажок «Отладка» в утилите «Конфигурация системы» (Msconfig):

Далее перезагрузите систему и запустите отладчик с правами администратора. Настройте отладчик на сервер символов Microsoft, открыв диалоговое окно «Symbol Search Path» из меню Файл и введите следующую строку: srv*c:\symbols*http://msdl.microsoft.com/download/symbols (замените c:\symbols на путь к локальной папке, в которой отладчик должен хранить кэшированные символы). Далее откройте диалоговое окно «Kernel Debugging» из меню Файл, выберите вкладку «Local» и нажмите OK:

Следующие шаги отличаются в зависимости от того, работаете вы с 32-битной или 64-битной Windows и от версии Windows.

32-битная Windows XP и Windows Server 2003
Функция, которая отображает BSoD на эти операционных системах называется KeBugCheck2. Вы ищите место, где функция передает значение цвета функции, которая заливает фон экрана — InbvSolidColorFill. Введите команду «u kebugcheck2″, чтобы вывести начало функции, затем вводите команду «u», чтобы пролистать дополнительные страницы кода функции до те пор, пока вы не увидите ссылку на InbvSolidColorFill (после первого ввода «u», вы можете просто нажать Enter, чтобы повторить команду). Вам нужно будет пропустить 30-40 страниц до того, как вы увидите этот запрос:

Перед этим запросом вы увидите инструкцию, в качестве аргумента использующую номер 4 («push»), как показано на скриншоте выше. Скопируйте адрес кода этой инструкции, выбрав его из столбца адреса слева и нажав Ctrl+C. Затем в командном окне отладчика введите «eb», затем Ctrl+V, чтобы вставить адресс, затем «+1″ и нажмите Enter. Отладчик войдет в режим редактирования памяти, начиная с адреса значения цвета. Теперь вы можете выбрать цвет, который вы хотите. 1 — это красный, 2 — зеленый, вы также можете поэкспериментировать, чтобы получить другой цвет. Просто введите число и нажмите Enter дважды, чтобы подтвердить ввод, после чего выйдите из режима редактирования. Вот как примерно должен выглядеть экран, после того как вы закончите:

64-битные версии Windows и 32-битные версии Windows Vista или выше
На этих версиях Windows функция ядра для отрисовки BSoD называется KiDisplayBlueScreen. Введите «u kidisplaybluescreen» и затем продолжайте вводить команды «u», чтобы пропустит страницы с кодом функции, до тех пор, пока вы не увидите вызов InbvSolidColorFill. На 32-битных версиях Windows продолжите следование инструкциям, приведенным в разделе Windows XP/Server 2003, чтобы найти и отредактировать значение цвета. На 64-битных версиях эти операционных систем инструкция, предшествующая вызову InvbSolidColorFill, передает цвет, так что скопируйте ее адрес (номер в левой колонке) и введите эту команду для начала редактирования: «eb <address>+4″. Отладчик перейдет в режим редактирования памяти и вы сможете изменить значение (например, 1 для красного, 2 для зеленого):

Просмотр результата
Теперь вы готовы к сбою системы. Если вы работаете на 64-битной Windows, вы можете вызвать сбой без каких-либо дополнительных действий. Kernel Patch Protection заметит модификацию и вызовет сбой системы как средство ограничения деятельности независимых вендоров, которым могло показаться, что изменение кода ядра могло повлиять на поведение их приложений. Перед тем, как это случит, может пройти несколько минут. Чтобы вызвать сбой системы по требованию, запустите утилиту Notmyfault (вы можете скачать ее с веб-страницы Windows Internals, посвященной книгам) и нажмите кнопку «Do Bug» (чтобы избежать потери данных, убедитесь, что вы сохранили любую работу и закрыли все другие приложения):

Появится BSoD в цвете, который вы выбрали, в данном случае это «красный экран смерти»:

Праздничный BSoD
Ведомый духом наступающих праздников, я пошел дальше и сделал праздничный BSoD: я поменял не только цвет фона, но и цвет текста. Чтобы сделать это на 64-битных версиях Windows Vista или выше, найдите вызов InvbSetTextColor сразу после InvbSolidColorFill и адрес инструкции, которая передает цвет текста функции, «move ecx, 0Fh»:

Параметр 0Fh означает белый цвет, но вы можете изменить его используя все ту же методику редактирования. Используйте команду «eb», передавая адрес инструкции плюс 1. Ниже я установил красный цвет (который имеет значение 1):

А вот тот праздничный BSoD, который я сделал:

Счастливых вам праздников! И помните, если у вас были какие-либо случаи диагностики проблем, которыми вы хотите поделиться, пожалуйста, присылайте мне скриншоты (предпочтительно .PNG) и файлы лога.

Источник: thevista.ru

Оставить комментарий

Чтобы оставлять комментарии Вы должны быть авторизованы.

Похожие посты