Инженеры Microsoft реализовали в Windows хранилище загрузки, известное ещё как Boot Configuration Data (BCD), и меню загрузки. Первое содержит в себе идентификаторы загрузчиков всех имеющихся на ПК операционных систем, а второе считывает их и выводит в виде перечня ОС, доступных для запуска. Это значительно облегчает жизнь пользователю, на компьютере которого стоит несколько систем. Ему не нужно что-то мудрить, чтобы переключиться между ними. Достаточно перезагрузить компьютер и выбрать нужную из представленного списка. Как и другие части ОС Windows, меню загрузки поддаётся настройке. В этом руководстве перечислены доступные способы редактирования данного раздела.
Примечание: практически все действия, описанные в этом руководстве, нужно выполнять из-под учётной записи с правами администратора. В противном случае вы должны знать пароль от неё.
Редактирование меню загрузки Windows 10 в окне загрузчика
Меню загрузки Windows 10 обладает небольшим разделом настроек. Он предоставляет минимальный набор опций — изменение значения таймера автоматического запуска основной системы, смена ОС, загружаемой по умолчанию, а также дополнительный раздел с режимами старта системы и функцией выключения компьютера.
- Чтобы получить доступ к этим настройкам, вам нужно нажать на пункт Изменить значения по умолчанию или выбрать другие параметры во время отображения экрана со списком доступных для запуска систем.
- Далее вам остаётся нажать на пункт Изменить таймер, чтобы установить время отсрочки автоматической загрузки системы (5 и 30 секунд, а также 5 минут) или же на Выбрать ОС по умолчанию, чтобы указать, какую систему стоит грузить по завершению таймаута.
Редактирование меню загрузки Windows 10 в параметрах системы
В дополнительных параметрах системы, зайти в которые можно через свойства ОС, находится раздел Загрузка и восстановление. Он хранит в себе небольшой список функций для редактирования меню загрузки, который подойдёт нетребовательным пользователям. Так с его помощью вы можете выбрать, какая операционная система будет загружаться по умолчанию, выставить время отображения списка установленных систем или вовсе выключить таймаут, а также активировать вывод вариантов восстановления.
Чтобы попасть в указанный раздел, вам нужно сделать следующее:
- Нажмите на сочетание Win + Pause (Break).
- Кликните по ссылке Дополнительные параметры системы, расположенную в левой части окна.
- Под заголовком Загрузка и восстановление щёлкните на кнопку Параметры.
Редактирование меню загрузки Windows 10 в Конфигурация системы
Если вам необходимо немного больше возможностей по настройке, вы можете попробовать утилиту Конфигурация системы. Помимо упомянутых настроек, она предлагает функцию удаления загрузочных записей операционных систем, опцию для вывода информации об ОС, возможность запустить Windows без графической оболочки, выбрать параметры загрузки безопасного режима и ещё несколько второстепенных функций.
Отредактировать меню загрузки с помощью Конфигурация системы можно следующим образом:
- Нажмите Win + R и введите msconfig. Появится окно утилиты.
- Откройте вкладку Загрузка.
- Выберите из списка интересующую вас запись. Если вы желаете избавиться от неё, нажмите на кнопку Удалить.
- Хотите пометить ОС в качестве основной? Кликните по кнопке Использовать по умолчанию.
- В случае необходимости, установите предпочитаемое время таймаута.
- Нажмите на ОК и перезагрузите компьютер, чтобы система применила изменения.
Как отредактировать меню загрузки Windows 10 с помощью EasyBCD
EasyBCD — бесплатная утилита, предоставляющая широкий выбор возможностей для редактирования меню загрузки. В сравнении с ней все стандартные системные инструменты (кроме Командной строки) смотрятся весьма примитивно.
Эта компактная программа позволяет:
- Удалять ОС из списка доступных для запуска.
- Добавлять новые записи Windows (в том числе и устаревших), Linux / BSD, Mac.
- Добавлять записи для установки систем с помощью ISO-образов или отдельных разделов жёсткого диска.
- Переименовывать записи операционных систем.
- Выставлять систему по умолчанию.
- Изменять положение записей в списке.
- Устанавливать язык меню загрузки.
- Выбирать оболочку интерфейса загрузчика (Metro или более раннюю от Windows Vista / 7).
- Выставлять длительность таймаута.
- Архивировать и восстанавливать настройки хранилища загрузки (BCD).
- Просматривать содержимое BCD и меню загрузки.
Интерфейс программы полностью локализован на русский, а сама она достаточно простая в использовании и не требует от пользователя никаких сверхъестественных способностей.
Как добавить запись системы в меню загрузки
- Скачайте и установите EasyBCD. Во время установки укажите, что вы будете использовать программу в личных целях, а не в коммерческих.
Примечание: для редактирования меню загрузки в старших версиях Windows может понадобиться EasyBCD 1.7.2. - Запустите программу и выберите язык интерфейса.
- Нажмите на Добавить запись и выберите вкладку Windows.
- Напротив пункта Тип выберите Vista / 7 / 8 / 10. Если добавляемая запись должна загружать более старую версию «винды», разверните выпадающий список и кликните по подходящему варианту.
- В поле Имя укажите предпочитаемое название записи.
- Напротив пункта Диск откройте список разделов жёсткого диска и выберите тот, где установлена ОС, к которой вы хотите восстановить доступ.
- Нажмите на Добавить.
Как удалить запись системы из меню загрузки
- В программе нажмите на Редактировать меню загрузки.
- Из списка записей выберите нужную и нажмите на Удалить. Подтвердите своё действие.
- Кликните по кнопке Сохранить.
Как переименовать запись системы в меню загрузки
- В разделе редактирования загрузочного меню кликните по записи, имя которой вы хотите сменить.
- Нажмите на кнопку Переименовать и введите новое название.
- Сохраните данное изменение.
Как переместить запись системы в меню загрузки
- Выберите из списка пункт, позицию которого нужно сменить.
- Используя кнопки Вверх и Вниз измените положение в списке.
- Нажмите на Сохранить.
Как выбрать систему для загрузки по умолчанию
- В столбце По умолчанию установите галочку напротив нужной операционной системы.
- Сохраните изменения.
Как изменить время отображения меню загрузки
- Возле пункта Таймаут нажмите на поле и введите оптимальное для вас время. Учтите, что в меню загрузки оно измеряется в секундах.
- После внесения изменений кликните по кнопке Сохранить.
Как изменить язык меню загрузки
- Найдите пункт Язык, разверните список возле него и выберите нужное вам наречие.
- Сохраните внесенные изменения.
Как отредактировать меню загрузки Windows 10 с помощью командной строки
Если вы не доверяете сторонним программам и стараетесь пользоваться исключительно системными инструментами, тогда вам стоит опробовать способы редактирования меню загрузки Windows 10 с помощью командной строки.
Создание или восстановление резервной копии хранилища загрузки Windows
Перед выполнением всех действий создайте резервную копию хранилища загрузки, чтобы вы могли восстановить его в случае необходимости. Создать бекап BCD вы можете следующим образом:
- На любом не системном разделе создайте папку BCDBackup.
- Запустите командную строку с правами администратора. Для этого нажмите на Win + S, введите Командная строка, кликните правой кнопкой мышки по результату и выберите Запустить от имени администратора.
- Введите команду bcdedit /export E:\BCDBackup\BCD, где E — буква раздела, на котором находится созданная ранее папка.
- Для восстановления рабочей копии BCD вам нужно ввести bcdedit /import E:\BCDBackup\BCD, где Е — буква раздела, содержащего каталог с резервной копией хранилища загрузки.
Как добавить запись системы в меню загрузки
- Всё в ту же командную строку, запущенную от имени администратора, введите bcdedit /copy {current} /d «Windows OS», где Windows OS — произвольное название новой записи. В результате вы должны получить сообщение об успешном копировании существующей записи в новую, а также её уникальный идентификатор.
- Далее наберите bcdedit /set {ИД} device partition=E:, где ИД — идентификатор новой записи, созданной в процессе выполнения предыдущего пункта, а Е — буква локального диска, на котором расположены файлы другой операционной системы. Чтобы не допустить ошибку при вводе длинного ID, скопируйте его в эту команду вместе с фигурными скобками.
- Следом введите bcdedit /set {ИД} osdevice partition=E:, где ИД — код созданной записи, а E — буква раздела, содержащего системные файлы другой ОС.
- В конце всего этого процесса введите команду bcdedit /displayorder {ИД} /addlast, где ИД — код ранее созданной записи операционной системы. Эта команда должна добавить новую запись в самый низ списка ОС, доступных для запуска из меню загрузки.
Как удалить запись системы из меню загрузки
- Введите команду bcdedit, чтобы получить список всех записей установленных ОС. Обратите внимание на пункт displayorder в разделе Диспетчер загрузки Windows. В нём перечислены уникальные коды всех операционных систем. Их порядок точно такой же, как и пунктов установленных систем в меню загрузки.
- Наберите команду bcdedit /delete {ИД}. Вместо ИД вам нужно вставить код записи, которую собираетесь удалить. Его вы можете получить из пункта displayorder. Данная команда уберёт запись не только из диспетчера загрузок, но и из хранилища. Если нужно удалить запись с именем (к примеру, {default}), а не в виде комбинации букв и цифр, тогда команда должна выглядеть так: bcdedit /delete {ИД} /f. Как и во всех остальных случаях, на место ИД нужно вставить идентификатор.
- Если вы желаете лишь на время исключить её из списка, тогда выполните команду bcdedit /displayorder {ИД} /remove. Запись исчезнет из него, но при этом останется в хранилище, что позволит при необходимости восстановить её.
Как изменить порядок отображения систем в меню загрузки
Для редактирования положения записей в загрузчике используйте команду bcdedit /displayorder {ИД2} {ИД1} {ИД3}. Вместо всех ИД укажите реальные коды записей в той последовательности, в которой вы хотите видеть их во время запуска компьютера.
Как выбрать систему для загрузки по умолчанию
Всё, что вы должны сделать, это выполнить команду bcdedit /default с указанием кода системы в фигурных скобках.
Как переименовать систему в меню загрузки
Для изменения названия операционной системы используйте команду bcdedit /set {ИД} description «Новое имя».
Как изменить время отображения меню загрузки
Чтобы установить оптимальное время отображения меню загрузки наберите команду bcdedit /timeout time, где time — время таймаута в секундах.
Вот, собственно, и все основные способы редактирования меню и хранилища загрузки в операционной системе Windows 10.
Привет друзья! Если на вашем компьютере или ноутбуке установлены две операционные системы Windows 10, то при включении ПК у вас должно выходить специальное меню загрузки, в котором вы можете выбрать для работы любую ОС. Многих пользователей смущает то, что названия операционных систем в этом меню выглядят практически одинаково, разница лишь в указании тома, с находящейся на нём Win 10. Изменить название операционной системы в меню загрузки Windows 10 очень просто и в сегодняшней статье я покажу, как это сделать с помощью редактирования Диспетчера загрузки инструментом bcdedit.exe.
Как изменить название операционной системы в меню загрузки Windows 10
Интересный факт. Подобный вопрос на сайте задают часто, но всегда по разному
, например:
Как изменить надпись в загрузчике Windows 10?
Как поменять название Windows 10 при загрузке?
Как изменить название системы в Диспетчере загрузки Windows 10?
Итак, возьмём для примера компьютер с двумя установленными Windows 10 версии 1703 (Сборка ОС 15063.413).
В Управлении дисками видно, что первая Win 10 находится на диске (C:), а вторая на диске (E:). По умолчанию загружается Windows 10, расположенная на томе 4 (на скриншоте диск (C:)).
Примечание: Третий том скрыт (служебный раздел MSR) и не отображается в Управлении дисками.
При включении ПК выходит меню загрузки OS.
Теперь откроем Диспетчер загрузки с помощью инструмента bcdedit.exe
Запускаем командную строку от имени администратора и вводим команду: bcdedit
За название операционной системы в Диспетчере загрузки отвечает параметр description.
Как видим, названия обоих операционных систем в Диспетчере одинаковые: — Windows 10.
С помощью инструмента bcdedit можно изменить название ОС, отображаемое в меню загрузки. Делается это командой:
bcdedit /set {ID} description «Название системы»,
где {ID} — идентификатор системы, а новое название ОС берём обязательно в кавычки.
Давайте для начала изменим название Windows 10, которая загружается с раздела (E:) на другое, к примеру — «Windows 10 1703 15063.413″.
Так как идентификатор Win 10, загружающейся с раздела (E:) — {bfb431f7-21af-11e7-8e9f-ae65f1000b0b}, то команда в нашем случае будет такой:
bcdedit /set {bfb431f7-21af-11e7-8e9f-ae65f1000b0b} description «Windows 10 1703 15063.413»
Запускаем bcdedit и видим, что название системы в Диспетчере загрузки изменилось.
Меню загрузки.
Если вы хотите изменить название Windows 10, которая загружается с раздела (C:), то сделать это можно точно также.
Идентификатор Win 10, загружающейся с раздела (C:) — {current}, а название будем менять на такое «Working Windows 10 1703 15063.413″,
значит команда будет:
bcdedit /set {current} description «Working Windows 10 1703 15063.413″
Запускаем bcdedit и видим, что название Win 10, расположенной на диске (C:) и загружаемой по умолчанию, изменилось.
Содержание статьи:
- Настройка загрузки: выбор ОС по умолчанию
- Если установлено несколько версий ОС Windows 7/10/11
- Если установлена Linux + ОС Windows (меню GNU GRUB)
- Вопросы и ответы: 5
Вопрос от пользователя
Здравствуйте.
Подскажите, с одной проблемой. У меня на диске была установлена Windows 10, затем я установил еще одну Windows. Теперь по умолчанию после включения компьютера — загружается именно вторая новая система (мне же приходится вручную на этапе загрузки успевать указывать свою «родную» 10-ку).
Как сделать так, чтобы по умолчанию стартовала моя основная Windows 10. Спасибо!
Здравствуйте.
Да, вы правы, при установке еще одной версии ОС Windows — она будет загружаться по умолчанию! Исправить это можно 👉 в свойствах системы (ниже покажу на примерах, как это делается).
*
Настройка загрузки: выбор ОС по умолчанию
Если установлено несколько версий ОС Windows 7/10/11
Вариант 1
Итак…
Обратите внимание на фото с окном выбора ОС ниже 👇 (такое, обычно, бывает при использовании Windows 10/11, в Windows 7 — просто список на «черном» фоне).
Так вот, в идеале в нижней части окна у вас должна быть ссылка «Изменить значения по умолчанию или выбрать другие параметры» — ее и нужно нажать! (примечание: отображаться может не всегда, у некоторых эта ссылка «уходит» за границы экрана и ее ну видно — в этом случае используйте др. способы, приведенные ниже).
Окно, появляющееся после вкл. ПК/ноутбука (по умолчанию 30 сек. отображается)
Далее появится окно, в котором вы сможете установить таймер (как долго будет отображаться окно с выбором ОС) и выбрать ОС по умолчанию. Если предложенных параметров недостаточно — загрузите пока какую-нибудь копию Windows и переходите к нижеприведенным инструкциям.
Параметры — изменить таймер, выбрать ОС по умолчанию
*
Вариант 2
Выбрать ОС Windows по умолчанию (как уже говорил выше) можно в 👉 свойствах системы.
Самый простой способ открыть их — вызвать меню «Выполнить» (сочетание кнопок Win+R) и использовать команду sysdm.cpl (также это команду можно использовать в диспетчере задач).
sysdm.cpl — диспетчер задач
После нужно перейти во вкладку «Дополнительно / параметры загрузки и восстановления». См. скриншот ниже. 👇
Загрузка и восстановление системы, отладочная информация
В появившемся окне вы сможете выбрать нужную ОС (для ее загрузки по умолчанию) и установить таймер. См. пример на скрине ниже. 👇
Важно! Рекомендую с осторожностью выставлять значение «0» в таймере отображения списка ОС Windows! Например, если вы ошибочно укажите «0» и выберите «неработающую» ОС — могут быть сложности при загрузке… (и придется прибегать к восстановлению).
Операционная система, загружаемая по умолчанию
*
Вариант 3 (+ удаление «ненужных» ОС)
Этот способ хорош еще и тем, что позволяет удалить ненужные ОС (правда, с этим следует быть осторожным: если надумали удалять что-то — 👉 см. эту инструкцию).
Сначала нажать сочетание Win+R, и в окно «Выполнить» вставить команду msconfig, подтвердить клавишей Enter.
msconfig
Должно открыться окно «Конфигурация системы» — нам нужна вкладка «Загрузка». В ней можно выбрать ОС, которая будет загружаться по умолчанию (+ удалить ненужную ОС), установить таймаут и пр. См. пример ниже. 👇
msconfig — конфигурация системы
*
Если установлена Linux + ОС Windows (меню GNU GRUB)
GNU Grub // меню после вкл. ПК/ноутбука // В качестве примера
В этом случае наиболее простой и быстрый путь сконфигурировать загрузчик (GNU Grub) — это воспользоваться утилитой с графич. интерфейсом Grub Customizer. Она позволит изменить не только очередь загрузки, но и установить фоновое изображение, цвет и размер шрифта, и многое другое…
Для ее установки в Ubuntu используйте команду:
sudo apt install grub-customizer
Если появятся ошибки — попробуйте выполнить поочередно следующие команды:
sudo add-apt-repository ppa:danielrichter2007/grub-customizer
sudo apt-get update
sudo apt-get install grub-customizer
После завершения установки — запустите приложение, команда:
grub-customizer
Пример установки и запуска grub-customizer (Linux Mint)
Далее откройте окно основных настроек и установите время отображения меню Grub, а также тот пункт в списке, который будет выбран по умолчанию (в моем случае это Windows Boot Manager). 👇
Меню grub-customizer
Есть также вкладка «Настройки оформления» — может быть архи-полезна, если на вашем экране элементы Grub выглядят мелко / или плохо-читаемы. Шрифт текста можно увеличить вручную!
👉 Важно! После измененных настроек не забудьте нажать кнопку «Сохранить»! (+ перезагрузить компьютер)
Настройки оформления — сохранить
В общем-то, при следующей загрузке ПК вы должны заметить, что по умолчанию курсор в меню стоит на той ОС, которую вы выбрали. Т.е. задача решена?! 👌😉
*
Дополнения — приветствуются!
Успехов!
👋
Если на вашем компьютере установлено более одной ОС Windows 11, Windows 10 или других версий этой ОС, по умолчанию при загрузке будет появляться меню «Выберите операционной систему». В некоторых случаях отображаемые пункты могут быть одинаковыми, а их порядок — не тот, который удобен вам.
В этой простой инструкции подробно о том, как переименовать пункты для установленных операционных систем в меню выбора ОС при загрузке, а также изменить их очередность. Речь пойдет лишь о стандартном меню и загрузчике Windows.
Изменение имени пункта в меню выбора операционной системы при загрузке
Если вам требуется переименовать какой-то из пунктов в меню загрузки, достаточно выполнить следующие простые шаги:
- Запустите командную строку от имени администратора. Для этого можно использовать поиск в панели задач по «командная строка», а затем выбрать пункт «Запуск от имени администратора».
- Введите команду bcdedit и нажмите Enter — это отобразит различные элементы загрузки, в нашем случае интересны пункты «Загрузка Windows». Для изменения имени пункта меню нам потребуется его идентификатор. Загрузка Windows с идентификатором {current} — это текущая запущенная ОС, другие будут иметь более сложный идентификатор.
- Введите команду
bcdedit /set {идентификатор} description "новое имя"
и нажмите Enter.
- Результат изменения имени будет виден при первой же перезагрузке компьютера или ноутбука:
Тем же способом вы можете поменять имена для других пунктов в меню загрузки Windows.
Иногда может быть полезным и создание собственных пунктов меню с другими вариантами загрузки единственной ОС на компьютере, например, вы можете добавить безопасный режим в меню загрузки, что описано в последней части этой инструкции.
Изменение порядка пунктов в меню при загрузке Windows
Для того, чтобы поменять порядок пунктов в меню выбора ОС при загрузке, также потребуется использовать идентификаторы этих записей:
- Запустите командную строку от имени администратора, введите bcdedit и нажмите Enter. В результатах вас будут интересовать значения поля «идентификатор» для пунктов «Загрузка Windows».
- Введите команду (количество идентификаторов может быть разным):
bcdedit /displayorder {ИД первой системы} {ИД второй системы} {ИД тертьтей системы}
и нажмите Enter.
- В результате порядок пунктов будет изменен на заданный вами.
- Ещё одна возможность — установить пункт с нужным идентификатором первым в порядке загрузки и загружаемым по умолчанию с помощью команды
bcdedit /displayorder {идентификатор} /addfirst
На этом всё. Если остаются вопросы на тему меню выбора ОС при загрузке Windows — задавайте их в комментариях, я постараюсь подсказать решение.
Введение
Возможно некоторые читатели помнят мою самую первую статью на ресурсе, посвященную загрузке Windows с VHD-образа. Возможно я бы и не вернулся к этой теме, если бы не нашлись люди, попытавшиеся повторить данную технологию на своих домашних машинах. Естественно, с реализацией этого решения возникли проблемы, касающиеся в основном тех ошибок, которые выплевывает bootmgr в тех случаях, когда ему что либо не нравится. Попытки интерпретации ошибок загрузки вроде 0xc03a0003 путем гугления к особо ценным результатам не приводят, а документация Microsoft на этот счет хранит многозначительное молчание. Возникла идея изучить процесс обработки VHD-образов, получив информацию из первых рук, то есть от самого загрузчика.
Если обратится к уже имеющейся в сети информации, то существует замечательный блог «Записки эникейщика о Windows» на страницах которого (раз, два и три) размещены, на мой взгляд, самые ценные сведения, по вопросам устройства bootmgr. Автор подробно рассмотрел процесс загрузки, включая исследования кода MBR и PBR, остановившись на структуре bootmbr, кратко описав происходящие при его работе процессы.
Мы же пойдем дальше — опишем инструментарий, который можно использовать для изучения устройства загрузчика и попытаемся разобраться с некоторыми, интересующими нас алгоритмами. Если такое предложение показалось кому-то интересным, милости прошу под кат
1. Достаем код Bootmgr из системы
Загрузчик Bootmgr появился в операционных системах семейства Windows начиная с Windows Vista. Причиной его разработки послужило то, что старый добрый ntldr, использовавшийся в линейке NT не мог загружать систему, на компьютерах с материнскими платами оснащенными UEFI, в те времена (2005 год) мало распространенными среди широкого круга рядовых пользователей.
По умолчанию, при штатной установке, этот загрузчик помещается в отдельный раздел, расположенный в начале HDD, с размером, достаточным для размещения самого bootmgr а так же файлов его конфигурации. Данный раздел не монтируется в обычном режиме работы системы и буква диска ему не присваивается. В системах с MBR создания этого раздела можно избежать, устанавливая Windows на предварительно размеченный и отформатированный HDD. В этом случае загрузчик помещается в тот же раздел, что и файлы ОС. Системы с EFI + GPT изначально требуют наличия такого раздела, имеющего тип 0xef и отформатированного в FAT.
Таким образом, первая наша задача — добыть bootmgr. Желательно взять его из системы, которая будет выступать в роли подопытной. Для этого установим ОС Windows на виртуальную машину. Это может быть и VirtualBox, и VMware, и QEMU — всё зависит от того, каким инструментарием виртуализации вы располагаете. Я преимущественно работаю в ОС Linux, буду в основном ориентироваться на инструменты применяемые там, хотя уделю внимание и Windows.
Итак, предположим у нас есть виртуальная машина (ВМ) с установленной на ней Windows 7 (x86). Разметка диска выполнена на основе MBR, система установлена в один раздел. Допустим это QEMU, диск на котором установлена подопытная имеет формат raw. то есть обыкновенный двоичный образ. Монтируем этот образ
$ sudo modprobe -r loop
$ sudo modprobe loop max_part=15
$ sudo losetup -f win7.hdd
$ sudo mount /dev/loop0p1 ~/virt-win
$ ls -l ~/virt-win
На смонтированном разделе мы увидим следующее содержимое
итого 5504541
-rwxrwxrwx 1 root root 24 июн 11 2009 autoexec.bat
drwxrwxrwx 1 root root 4096 май 21 09:08 Boot
-rwxrwxrwx 1 root root 391640 июл 21 2015 bootmgr
-rwxrwxrwx 1 root root 8192 май 21 09:08 BOOTSECT.BAK
-rwxrwxrwx 1 root root 10 июн 11 2009 config.sys
lrwxrwxrwx 2 root root 60 июл 14 2009 'Documents and Settings' -> /home/maisvendoo/virt-win/Users
-rwxrwxrwx 1 root root 2415517696 май 21 09:26 hiberfil.sys
-rwxrwxrwx 1 root root 3220692992 май 21 09:26 pagefile.sys
drwxrwxrwx 1 root root 0 июл 14 2009 PerfLogs
drwxrwxrwx 1 root root 4096 май 21 09:14 ProgramData
drwxrwxrwx 1 root root 4096 апр 12 2011 'Program Files'
drwxrwxrwx 1 root root 0 май 21 09:14 Recovery
drwxrwxrwx 1 root root 0 май 21 09:14 '$Recycle.Bin'
drwxrwxrwx 1 root root 4096 май 21 09:09 'System Volume Information'
drwxrwxrwx 1 root root 4096 май 21 09:14 Users
drwxrwxrwx 1 root root 16384 май 21 09:09 Windows
Для нас представляет интерес файл bootmgr. Однако, прежде нам нужен не совсем он, а 32-разрядный образ загрузчика bootmgr.exe, который находится в bootmgr в упакованном виде. Для его распаковки необходимо использовать утилиту bmzip, которая написана в общем-то для Windows (с наскока собрать её под Linux не вышло), поэтому распаковку выполним на виртуальной машине. Бинарную сборку этой утилиты, которая бы работала нормально оказалось довольно трудно найти, несмотря что тут дана ссылка на неё. В итоге, пакет был найден на каком-то из сайтов, посвященных кастомизации bootmgr. Для работы bmzip оказалась необходима библиотека MSCompression.dll. Готовый к работе пакет теперь можно скачать тут.
Создадим на диске ВМ папку utils и скопируем туда bmzip.exe вместе с MSCompression.dll. Отмонтируем образ и запустим ВМ. Запустим командную строку от имени администратора. Чтобы случайно не попортить загрузчик сделаем его копию
C:\ Windows\System32>cd c:\
C:\ xcopy bootmgr utils\bootmgr /h
Файл загрузчика является скрытым и системным, поэтому снимем с него эти атрибуты
C:\ cd utils
C:\ attrib -S -H /s
Распаковываем загрузчик
C:\ bmzip bootmgr bootmgr.exe
В итоге получаем распакованный образ bootmgr.exe
Выключаем ВМ и снова монтируем её диск в линуксе. Создадим какую-нибудь папку, где будем потрошить загрузчик дизассемблером и скопируем туда распакованный образ
$ mkdir -p ~/work/bootmgr/
$ cp ~/virt-win/utils/bootmgr.exe ~/work/bootmgr/
2. Дизассеблируем bootmgr.exe
Теперь скормим полученный «экзешник» дизассемблеру. Например IDA Pro. Запустим «иду» и откроем в ней добытый файл.
IDA верно идентифицирует файл как 32-разрядный исполняемый файл формата PE. Жмем ОК. Теперь, если в IDA Pro установлен плагин для работы с pdb-файлами, по ходу дизасеммблирования нам предложат загрузить отладочные символы, и не откуда нибудь, а сайта Microsoft.
Соглашаемся и получаем такую картину
Ага, слева мы видим прототипы функций, содержащихся в исследуемом файле, благодаря тому что согласились загрузить отладочные символы. Это очень сильно облегчит нам последующую работу. А пока определим точку входа в код загрузчика, и нетрудно догадаться что это будет функция BmMain(). Однако, не принимая это на веру жмем Ctrl + E
убеждаясь что наша догадка верна — BmMain() является точкой входа, расположенной по адресу 0x401000. Жмем ОК и перемещаемся на начало кода
Видим мы заголовок функции BmMain() с внушительным списком локальных переменных, и чуть ниже и сам код функции
Разобраться в мешанине ассемблерного кода довольно трудно, да и не зачем этого делать. Прежде всего определимся с тем, какие функции загрузчика мы хотим изучить. Я что-то там говорил о VHD? Ну так поищем среди кода что-нибудь, касающееся виртуальных дисков. Щелкаем правой кнопкой по списку функций слева и в вывалившемся контекстном меню выбираем «Quick filter» (или перейдя в окно с прототипами жмем Ctrl + F). В строке поиска набираем «vhd» и…
да, таковые функции имеются в количестве 33 штук. Среди них VhdOpen() очевидно будет отвечать за открытие виртуального диска, а вот например VhdiVerifyVhdFooter() как пить дать отвечает за проверку футера VHD-диска на корректность. То есть мы примерно представляем себе, куда будем ставить точки останова в отладчике. Кстати, поговорить об отладке самое время
3. Отладка Bootmgr на связке QEMU + IDA Pro
Запускаем виртуальную машину с ключами -s -S — это включает режим отладки
$ qemu-system-x86_64 ~/VM/qemu/win7-efi/win-x86.hdd -m 4096 -s -S
ВМ запускается и сразу же становится на паузу, ожидая подключения отладчика
Важно! Ни в коем разе не используйте ключ -enable-kvm применяющий аппаратную виртуализацию. При её использовании отладка в QEMU не работает.
Теперь на панели инструментов в IDA выбираем отладчик «Remote GDB debugger»
Ответив «Да» на несколько заданных нам вопросов получим окошко
где вобьем параметры соединения с ВМ: localhost на порту 1234. Жмем ОК. Нам сообщат, что некоторый процесс уже запущен и ожидает подключения отладчика — не хотим ли мы присоединится к нему? Конечно же ходим!
Поэтому отвечаем «Да» и…
мы встаем на паузу где-то в начала bios виртуальной машины. Великолепно, но теперь мы должны добраться до того места, где начинает выполнятся bootmgr. Ставим точку останова на функции BmMain(). Нажимаем на панели инструментов список точек останова, жмем Insert на клавиатуре и указываем на каком адресе мы хотим прервать выполнение кода и перейти в отладку
Вбиваем адрес 0x401000. Если же мы хотим поставить бряк на нужную нам функцию, то идем в главное меню и открываем в сеансе отладки список функций: View -> Open subviews -> Functions. В появившемся списке правой кнопкой мыши вызываем контекстное меню и выбираем Add breakpoint. Теперь жмем F9 и после недолгого ожидания попадаем в самое начало кода загрузчика
Теперь мы можем проходить код по шагам, смотреть значения регистров и стека, отслеживать стек вызовов и так далее. В какой-то степени отладчик, встроенный в IDA удобен и интуитивно понятен.
Возможно меня спросят — а можно ли использовать GDB? Можно, запускаем ВМ в режиме отладки, запускаем gdb в консоли
$ gdb -q
Подключаемся к удаленной сессии ВМ
(gdb) target remote localhost:1234
Включаем отображение дизассемблированных инструкций
(gdb) display/4i $pc
Если вас не устраивает синтаксис AT&T переключаемся на интел
(gdb) set disassembly-flavor intel
Ставим точку останова на BmMain() и запускаем исполнение
(gdb) b *0x401000
Breakpoint 1 at 0x401000
(gdb) c
Continuing.
Breakpoint 1, 0x00401000 in ?? ()
1: x/4i $pc
=> 0x401000: mov edi,edi
0x401002: push ebp
0x401003: mov ebp,esp
0x401005: and esp,0xfffffff8
(gdb)
Пожалуйста, мы видим почти тоже самое, что видели в IDA, располагая при этом всей мощью GDB. Почти, потому что тут мы не сумеем использовать отладочные символы от Microsoft, ибо GDB их не понимает. Но возможности GDB не в пример более широки, чем возможности IDA именно в плане процесса отладки и его автоматизации.
Однако, существует ещё одна возможность отладки, мимо которой пройти нельзя
3. Отладка на связке WinDbg + VirtualBox
Те, кто занимается разработкой драйверов для ОС Windows безусловно знакомы с этим замечательным отладчиком. Замечателен он тем, что имеет возможности сравнимые с возможностями линуксового GDB. Единственным его недостатком является жуткий способ настройки его интерфейса. Но мы опустим эти моменты, а обратимся к возможностям данного отладчика для решаемой нами задачи.
Итак, пускай на у нас имеется ВМ на основе VirtualBox. Создадим для этой ВМ COM-порт со следующими параметрами
Это виртуальный COM-порт, пробрасываемый в именованый канал. Для отладки через последовательный порт виртуальную машину следует настроить соответствующим образом. Загружаем её и запускаем консоль с административными правами. С ней вводим команды настройки загрузчика для отладки
c:\ Windows\system32> bcdedit /bootdebug {bootmgr} on
Эта команда включит возможность отладки загрузчика. Далее настроим порт для отладки
c:\ Windows\system32> bcdedit /dbgsettings serial debugport:1 baudrate:115200
Указываем, что мы используем COM1 со скоростью 115200 бод. Отлично, выключаем ВМ и запускаем отладчик.
Отладчик WinDbg можно скачать официально с сайта Microsoft вместе с комплектом для разработки драйверов. Однако у этой сборки отладчика есть проблема — глюк с отображением значений регистров. Поэтому я использую сборку, которая качается с того же сайта редмодовцев, на которую ведет ссылка из твитера некоего Доминика Вонга. В этой сборке данный баг отсутствует. Запускаем WinDbg следующей командой
c:\Wingdbx86> windbg -b -k com:pipe,port=\\.\pipe\com1,resets=0,reconnect
Откроем настройки интерфейса (File -> Open Workspace in File) в который среди прочих параметров сохранен путь http://msdl.microsoft.com/download/symbols для загрузки отладочных символов с серверов Microsoft. У меня этот путь заранее вбит в настройки (File -> Symbol File Path) и сохранен в теме для WinDbg. Такая настройка позволит нам автоматически получить отладочную информацию для загрузчика.
Теперь запустим ВМ. Практически сразу она встанет на паузу, а в окне отладчика мы увидим следующую картину
Ага, отладчик подключился к ВМ и встал на точке, любезно предоставленной нам майкрософтом. Ну что же, теперь нам доступны все возможности отладки с использованием windbg.
Однако мы останавливаемся не в самом начале кода загрузчика, а чуть дальше. Как показывает пошаговая отладка мы находимся как раз за функцией BlInitializeLibrary() которая обеспечивает начальную инициализацию оборудования
и, при отладке при помощи IDA мы сюда просто не попадаем. Таким образом, при отладке с WinDbg от нас ускользает часть действий bootmgr сразу после его запуска. В этом заключается недостаток использования стандартных средств отладки, предоставленных Microsoft. Однако, недоступный код мы всегда сможем исследовать отдельно с помощью IDA.
Теперь, в качестве примера, посмотрим на то, как bootmgr работает с образами VHD фиксированного размера.
4. Отлаживаем загрузку с VHD
Всё ниже следующее рассматривается на отладчике WinDbg, подключенном к ВМ на VirtualBox, но в равной степени справедливо и для других методов отладки, с учетом их особенностей. ВМ, используемая в данном примере содержит две системы: одна установлена на HDD, другая на VHD образ. Поставим точку останова на функции VhdOpen()
kd> bp VhdOpen
и нажмем F5. Отладчик встанет на указанной функции
Причем, внимание — мы ещё вообще не заходили в меню загрузки и не выбирали загрузку из VHD. А это означает, что проверка VHD происходит задолго до появления меню. Такое же поведение мы и наблюдаем, например если подсунем bootmgr пустой VHD. Меню загрузки нам вообще не покажут, а покажут ошибку с кодом 0xc000000F.
Проходим чуть дальше, нажимая F10 или вводя в комадной строке p и дойдем до вызова VhdiAllocateVhdData() — очевидно это создание в памяти некоторых структур для работы с образом
Чуть ниже расположен вызов VhdiVerifyAndInitializeVhd() — очевидно проверка корректности образа. Это показалось мне интересным и я пошел внутрь (F11)
Ниже, после некоторых подготовительных операций загрузчик читает последние 512 байт образа, в которых содержится так называемый «футер» образа, вызывая функцию VhdiReadVhdInformation(). Не надо ходить к гадалке, чтобы понять — функция возвратит указатель на структуру, содержащую данные футера. Как мне удалось выяснить, этот указатель, после вызова VhdiReadVhdInformation() оказывается в регистре ecx. Его значение равно 0x110098. Посмотрим на память по тому адресу
kd> db 0x110098
Команда читает память по указанному адресу, выводя её в окно отладчика в виде последовательности байт
00110098 63 6f 6e 65 63 74 69 78-00 00 00 02 00 00 01 00 conectix........
001100a8 ff ff ff ff ff ff ff ff-70 5e d3 1e 77 69 6e 20 ........p^..win
001100b8 00 06 00 01 57 69 32 6b-00 00 00 40 06 00 00 00 ....Wi2k...@....
001100c8 00 00 00 40 06 00 00 00-cb 2c 10 3f 02 00 00 00 ...@.....,.?....
001100d8 83 e6 ff ff 75 11 0a 5a-eb 03 c6 43 b9 c9 d6 df ....u..Z...C....
001100e8 24 b6 76 57 00 00 00 00-00 00 00 00 00 00 00 00 $.vW............
001100f8 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
00110108 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
Ага, мы видим знакомое слово — conectix. Это поле предваряет футер VHD образа, носит название cookie и хранит память о том, что Microsoft купила технологию VHD у фирмы Conectix, которая разработала данный формат виртуальных дисков для старых компьютеров Macintosh, Это несомненно футер VHD, мы можем видеть тут сигнатуру операционной системы в которой он был создан (Wi2k) а так же последовательность win указывает на то, что VHD создан средствами Windows. Да, все так и было. Пройдя чуть дальше мы натыкаемся на вызов VhdiVerifyVhdFooter() проверяющий формат футера. В качестве параметра он получает указатель на вышеописанную структуру, почему-то через регистр esi (???)
Этот участок кода интересовал меня больше всего, поэтому где-то с помощью IDA Pro, где-то руками, я преобразовал его в псевдокод на C
signed int __usercall VhdiVerifyVhdFooter(int footer)
{
signed int error_code; // Error code
int cur_checksum; // Actual checksum, writed in VHD
int calc_checksum; // Calculated checksum
int disk_type; // Disk type
int creator_host_os; // Creator host OS
// Error code
error_code = -1069940733; // 0xc03a0003
// Check cookie
if ( RtlCompareMemory((const void *)footer, "conectix", 8) == 8 )
{
// Store actual checksumm
cur_checksum = *(_DWORD *)(footer + 64);
// Write zero to checksum in footer structure
*(_DWORD *)(footer + 64) = 0;
// Calculate check summ
calc_checksum = BlUtlCheckSum(0x40001, 0, footer, 0x200);
// Restore checsum in footer
*(_DWORD *)(footer + 64) = cur_checksum;
// Checksum verify
if ( calc_checksum == cur_checksum )
{
// File type verify
if ( *(_WORD *)(footer + 14) == 1 )
{
// Check disk type
disk_type = *(_DWORD *)(footer + 60);
if ( disk_type == 2 || disk_type == 3 || disk_type == 4 )
{
// Check creator host OS
creator_host_os = *(_DWORD *)(footer + 36);
if ( creator_host_os != 1798465879 && creator_host_os )
{
error_code = -1073741637; // 0xc00000bb
} // Check disk size (by integer sectors count)
else if ( *(_DWORD *)(footer + 48) & 0x1FF || *(_DWORD *)(footer + 40) & 0x1FF )
{
error_code = -1069940718; // 0xc03a0012
}
else
{
error_code = 0;
}
}
else
{
error_code = -1069940732; // 0xc03a0004
}
}
else
{
error_code = -1069940731; // 0xc03a0005
}
}
else
{
error_code = -1069940734; // 0xc03a0002
}
}
return error_code;
}
Футер VHD можно представить в виде следующей структуры (в комментариях указаны смещения от её начала).
//-----------------------------------------------------------------------------
// VHD foother's data
//-----------------------------------------------------------------------------
struct vhd_footer_t
{
char cookie[8]; // +0
uint32_t features; // +8
uint32_t file_format_version; // +12
uint64_t data_offset; // +16
uint32_t time_stamp; // +24
char creator_application[4]; // +28
uint32_t creator_version; // +32
char creator_host_os[4]; // +36
uint64_t original_size; // +40
uint64_t current_size; // +48
vhd_disk_geometry_t disk_geometry; // +56
uint32_t disk_type; // +60
uint32_t checksum; // +64
vhd_uuid_t unique_id; // +68
uint8_t saved_state; // +84
uint8_t reserved[427];
};
Пользуясь этими данными можно сделать вывод о том, какие поля футера проверяет bootmgr и какие ошибки он выбрасывает. При корректном VHD образе данная функция возвращает ноль, в иных случаях расклад таков
0xc03a0003 - Неверный cookie
0xc03a0002 - Неверная контрольная сумма футера
0xc03a0005 - Неверная версия формата файла
0xc03a0004 - Неверный тип виртуального диска
0xc00000bb - Виртуальный диск создан не в Windows
0xc0300012 - Размер диска не кратен 512 (размер сектора в VHD)
Полученная мной информация решила спор возникший с коллегой по форуму, на котором обсуждалась методика загрузки Windows с VHD. Я его проиграл, считая что образы, созданные VirtualBox не будут грузится с помощью bootmgr. VirtualBox, создавая такие образы пишет все поля в соответствии со спецификацией Microsoft, кроме поля creator_application, куда записано win в оригинальном образе и vbox в случае с виртуалбоксом. Но это поле не проверяется bootmgr-ом, так что диски работают, а у меня они не работали по совсем другой причине, которая является предметом совсем другой истории…
Заключение
Возможно, статья несколько сумбурна. Но, она говорит о том, что горшки обжигают не боги, а отладка низкоуровневого кода Windows лишь дело техники. Интересующую вас информацию всегда можно получить, приложив к этому голову и руки. В этом тексте я попытался обобщить разрозненную информацию, собранную мной в сети по вопросам отладки bootmgr. Надеюсь что у меня это получилось, благодарю всех читателей за внимание и…
продолжение следует!