Запись кода MBR

Я инженер-электрик, который недавно обнаружил необходимость изменения кода в MBR. В основном мне нужна возможность выполнять код на жестком диске раньше, ОС запускается и берет верх.

Я полностью понимаю, что это нужно будет записать в Assembly и дать 446 байт или около того пространства кода в MBR. Я просто ожидаю, что вы вызовете другой код за пределами MBR. Мой вопрос - лучший способ записи в MBR? Если я хочу изменить MBR, давайте скажем диск HDD_1... Лучше ли подчинить HDD_1 другому компьютеру, а затем написать ему или записать его прямо (вне окон) на текущем компьютере. В принципе, я полагаю, что я вставлю вызов и оставлю остальную часть MBR.

Любые предложения будут оценены

Крис

Я прекрасно понимаю, что это будет сложно. Мой вопрос - лучший способ поставить инструкцию в MBR? Разумеется, Windows не разрешает прямой доступ к диску. Как вы предлагаете писать инструкции в MBR? Возможно, загрузится живой компакт-диск * nix и записывается в MBR?

Ответ 1

Существуют различные способы записи в загрузочный сектор диска, и есть общая ссылка, которую я использовал, когда я экспериментировал с разработкой ОС домашней ОС: http://wiki.osdev.org/

Я лично просто загружаюсь под Linux и использую dd:

  • Первая резервная копия

    dd if =/dev/sda of = ~/windows_bootloader.bin bs = 512 count = 1

  • Разберите загрузчик

    ndisasm -b16 -o7C00h ~/windows_bootloader.bin > ~/windows_bootloader.asm

  • Внесите свои изменения и соберите

    nasm ~/windows_bootloader.asm -f bin ~/modified_bootloader.bin

  • Перезаписать загрузчик

    dd if = ~/modified_bootloader.bin of =/dev/sda bs = 512 count = 1

Это предполагает, что "sda" является правильным блочным устройством. Обратите внимание, что шаг 4 не просто копирует файл в /dev/sda (что может, но тогда вы можете перезаписать больше, чем только первый сектор, если выходной двоичный файл > 512 байт)

Очевидно, вы не захотите отлаживать этот подход в живой системе. Это избавит вас от многих головных болей, чтобы использовать какой-то эмулятор x86, такой как bochs, qemu или VMWare Server.

Однако, как заявил Майкл Берр, это, вероятно, будет плохой идеей. Модификация загрузчика Windows, вероятно, оставит вас с небольшим количеством места или без него для вашего собственного кода.

Ответ 2

BIOS загружает компьютер с жесткого диска (или флоппи-дисковода), читая первый сектор (512 байт) каждого загрузочного устройства и проверяя определенный набор байтов подписи. Если эти байты найдены, 512-байтовый сектор копируется в ram (в определенной позиции), а BIOS перескакивает, чтобы запустить его.

Другое, тогда байты подписи, 446 байт в секторе доступны для использования в качестве загрузочной программы, но программа загрузки должна полностью входить в этот сектор! Поскольку 446 байт не очень велико, вам придется сделать вызовы BIOS, чтобы скопировать другие сектора с жесткого диска (или флоппи-дисковода или что-то еще) в ram для их запуска.

После того, как вы загрузили достаточно в ram, чтобы запустить вашу программу, перейдите к ней, и вы хорошо пойдете.

Вот как операционная система буквально "подтягивает себя своими собственными бутстрапами"

См. http://en.wikipedia.org/wiki/Master_boot_record

Теперь нет причин, по которым вы не могли бы написать загрузочный код на C или С++ (или что-нибудь еще), за исключением того, что при сборке вы точно знаете, какой код будет сгенерирован, и легко сделать вызовы BIOS.

Я бы посоветовал вам написать 512-байтовый диск для копирования копира, который загружает вашу программу с диска в RAM, а затем переходит к начальному адресу вашей программы. Затем вы можете написать свою программу на любом языке, который вы хотите. Имейте в виду, что когда ваш загрузочный код начинает работать, эти 512 байт - это единственное, на что вы можете рассчитывать, как в ram. (Ну, BIOS там, вы можете делать вызовы BIOS. BIOS также будет размещать некоторую системную информацию в определенных местах в ram...) Если вы хотите вызвать любые функции, которые вы написали, которые находятся за пределами этого сектора, вам нужно загрузите их в плунжер самостоятельно.

Кроме того, самый простой способ протестировать ваш код, вероятно, будет помещать его на гибкий диск и загружать его.

Чтобы ответить на ваш первоначальный вопрос, вы можете где-то сохранить резервную копию старого MBR, а ваш новый MBR может загрузить вашу функцию в ram, запустить ее, а затем загрузить исходный MBR и запустить ее, что позволит окнам продолжать загрузку.

Кроме того, Майкл Бэрр прав, получение того, что вы хотите сделать, будет кошмаром.

В ответ на ваш комментарий о том, как на самом деле записать это на жестком диске, существует несколько программ "сырой записи", которые могут копироваться в сектор на диске. Кроме того, вы можете просто загрузиться с linux live cd и использовать dd для записи ваших данных в выбранный вами сектор на блочном устройстве по вашему выбору. - Просто как пирог той части.

Ответ 3

В принципе, я полагаю, что я вставлю вызов и оставлю остальную часть MBR

Что будет вызвано этим вызовом подпрограммы? Единственным кодом в памяти в этой точке является то, что находится в MBR или ROM.

Пожалуйста, подумайте о том, действительно ли вам нужно то или это, а не лучшая альтернатива, прежде чем тратить на нее слишком много времени. Сторонний код, записанный в MBR (кроме MBR, который загружает загрузчик ОС), часто плохо воспринимается пользователями, потому что:

  • антивирусные программы часто отмечают это как подозрительный код, потому что технология, используемая для получения контроля над машинами, использовала Программы
  • использовали технику вставки себя в MBR и хранения дополнительного кода и данных в "зарезервированных" секторах диска (потому что в MBR действительно мало что можно делать и хранить). К сожалению, поскольку нет хорошего стандартного способа резервирования этих секторов, этот метод (иногда используемый для защиты от копирования) может привести к повреждению структур данных на диске (т.е. Все данные на диске идут до свидания). Пользователи действительно ненавидят это. Я считаю, что в какой-то момент Quicken использовал схему защиты, которая сделала что-то подобное и столкнулась с довольно большой реакцией.

Итак, если вы решите продолжить этот путь, пройдите осторожно и будьте готовы к головной боли.

Ответ 4

Почему не говорится, что Windows не разрешает прямой доступ к диску? Страница MSDN для CreateFile() говорит следующее:

Прямой доступ к диску или к объем ограничен. Для большего информацию, см. "Изменения в файле системы и стека хранилища ограничить прямой доступ к диску и прямой томом в Windows Vista и в Windows Server 2008" в справке и Поддержка базы знаний в http://support.microsoft.com/kb/942448.

Windows Server 2003 и Windows XP/2000: прямой доступ к диску или к объему не ограничено в этом образом.

KB942448 объясняет ограничения, и они, похоже, позволяют процессу с достаточными правами писать в MBR или в загрузочный сектор раздела.

Ответ 5

Я нашел аналогичный вопрос, который может помочь:

Изменение MBR для Windows

Однако вы можете уточнить, что вы планируете делать. Поскольку я обнаружил, что сам код загрузчика может быть довольно утомительным для работы. Кроме того, я бы, конечно, испытал это с помощью гибкого диска.

Насколько реально все это делается из Windows, я немного невежественен. Почти весь мой опыт программирования до этого момента находился в среде Unix.

Ответ 6

Я думаю, что ваш лучший способ с Linux, он имеет nasm для компиляции, dd для копирования кластеров (что также означает MBR) и даже меню загрузчика (например, lilo), если вы Не хотите связываться со своими фактическими разделами.

В прошлом году мне пришлось выполнить свою собственную последовательность загрузки. В принципе, у меня было это:

LILO boot menu:
    -> WindowsXP
    -> linux

Я хотел сделать что-то отдельно на MBR, не затрагивая фактическую установку, поэтому я создал новый (небольшой) раздел и добавил его в список LILO (здесь опущены данные), который дал следующее:

LILO boot menu:
    -> WindowsXP
    -> linux
    -> TESTMBR

Таким образом, поскольку каждый раздел имеет свой собственный MBR, я мог бы поставить любой удачный код, который мне нужен, без риска блокировки (что немного раздражает, чтобы исправить).

Чтобы действительно изменить этот MBR, я сделал это:

  • Резервное копирование реального MBR, например dd if=/dev/sda3 of=/home/you/mbr−backup count=1
  • Изменить код в файле: boot.asm
  • Скомпилировать с nasm: nasm boot.asm -o boot.bin -f bin исправление, если ошибки
  • Скопируйте только что созданный MBR на диск: dd if=boot.bin of=/dev/sda3
  • Reboot.
  • Выберите TESTMBR в меню.
  • Посмотрите, как это происходит.

Конечно, вы можете сделать это непосредственно на диске MBR вместо MBR раздела, как я здесь, но для моего собственного случая это было более практичным.

Что касается фактического вытеснения кода из MBR, вам нужно использовать прерывание INT 13,42, которое загружает любой кластер на диск. Для моего теста мне просто пришлось отображать его содержимое, но я могу присмотреться, если хотите.

Надеюсь, что это может помочь, извините за длинный ответ.

Ответ 7

Если вы можете сделать дискету, компакт-диск или флешку, загружаемую в командную строку MS, и иметь соответствующую версию отладки MS, вы можете читать и записывать в MBR, как показано ниже. Машина, работающая с win95 или win98, должна иметь возможность создавать загрузочную дискету для вас. Просто скопируйте debug из каталога windows\command на дискету.

внутри отладки: используйте команду r для изменения значений регистра. установите для оси 0201 значение для чтения или 0301 для записи. установите es: bx на начальный адрес памяти (буфера), который вы хотите использовать. 0000: 7C00 может работать, так как обычно это область, которую ваш следующий сектор получает в процессе загрузки. установите cx на 0001 для чтения/записи одного сектора по 512 байт. установите dx на 0080 для первого физического жесткого диска.

используйте команду "a" для сборки одной строки кода: INT 13h

используйте команду "p" для продолжения. Данные будут считаны или записаны на основе вашего выбора AX.

Вы можете прочитать в памяти "n", чтобы назвать файл, "w", чтобы записать файл, а затем отредактировать копию mbr в какой-либо другой программе. После завершения используйте debug "n" и "L", чтобы назвать и загрузить отредактированный файл MBR, и вызовите int 13h, используя ax = 0301h, чтобы записать изображение в правильный сектор.

Ответ 8

Вы уверены, что вам нужно написать MBR? Я диск с разделами, вы также можете изменить раздел VBR (Volume Boot Record). Это может быть проще/безопаснее, так как вам не нужно прикасаться к MBR, и ваш компьютер все равно сможет загрузиться на другие разделы (и ОС), даже если вы полностью уничтожите тестовый раздел.

Ответ 9

Вы можете посмотреть GRUB. Я никоим образом не специалист по MBR-коду, и я долгое время работал с операционной системой * nix, но я помню, что загрузчик работал поэтапно и загружал этапы с диска до запуска ОС. Вы можете написать свой собственный этап, чтобы выполнить работу, которую необходимо выполнить до загрузки ОС, а затем загрузить ОС. Я не уверен, насколько практичен этот вариант, особенно потому, что код, кажется, находится в середине перезаписи, потому что "устаревшая" версия была недостижимой в соответствии с документацией.

Ответ 10

Редактирование MBR вполне возможно изнутри Windows (XP). Для этого используется шестигранный редактор HxD, вы можете буквально скопировать-вставить шестнадцатеричный файл по MBR, даже на ваш активный системный диск (используйте с осторожностью!:)) http://mh-nexus.de/en/hxd/

В качестве отправной точки a получит MBR, доступный для источника, например Grub. (Так что пусть grub делает botoing для Windows). С этой целью у вас есть хорошая отправная точка для внесения изменений в ваш MBR. Редактирование MBR не должно быть слишком сложным, так как эта небольшая часть программного обеспечения довольно проста. Однако необходимы навыки ассемблера на 16 бит (DOS). Другой способ - позволить grub запускать некоторую дополнительную полезную нагрузку и вообще не изменять MBR, но я на 100% уверен, что это возможно; обратитесь к руководствам Grub.

Ответ 11

В Windows есть недокументированная утилита "debug", которая позволяет: 1) загружать любой сектор (включая mbr) hdd в ram. 2) просматривать этот код как двоичный или сборный. 3) Соберите некоторый код в ram.4) напишите этот код в любой сектор (также в mbr). Чтобы запустить эту утилиту, введите debug в команде promt, нажмите enter. Приглашение изменится на "-". Then введите "help". вы получаете informstion abot, как использовать его,