Модификация MBR Windows
Мне нужно изменить MBR Windows, и я действительно хотел бы сделать это из Windows.
Вот мои вопросы. Я знаю, что могу получить дескриптор на физическом устройстве с помощью вызова CreateFile. Всегда ли MBR будет на \\.\PHYSICALDRIVE0? Кроме того, я все еще изучаю Windows API для чтения непосредственно с диска. Являются ли readabsolutesectors и writeabsolutesectdors двумя функциями, которые мне понадобятся для чтения / записи в секторах диска, которые содержат MBR?
Править из того, что я узнал самостоятельно. MBR не всегда будет на \\.\PHYSICALDRIVE0. Также вы можете записать в загрузочный сектор (по крайней мере, с правами администратора в XP), вызвав CreateFile с именем устройства, на котором находится MBR. Кроме того, вы можете записать на этот диск, просто вызвав WriteFile и передав дескриптор устройства, созданного путем вызова CreateFile.
Отредактируйте по адресу Джоэл Коухорн. Мне нужно отредактировать MBR, потому что я работаю над проектом, который должен изменить аппаратные регистры после POST в BIOS, но до того, как Windows будет разрешено загружаться. Мы планируем внести эти изменения, изменив загрузчик так, чтобы он выполнял наш код до загрузки Windows.
Редактировать для Cd-MaN. Спасибо за информацию. Однако в вашем ответе нет ничего такого, чего я не знал, и ваш ответ не отвечает на мой вопрос. В частности, реестр не будет делать то, что нам нужно, по нескольким причинам. Основная причина в том, что Windows - самый высокий уровень среди множества программных уровней, которые будут работать с нашим продуктом. Эти изменения должны произойти еще до запуска нижних уровней, поэтому реестр не будет работать.
PS для CD-MaN. Насколько я понимаю, информация, которую вы предоставляете, не совсем верна. Для Vista, я думаю, вы можете записать на том, если сектора, в которые пишутся, являются загрузочными секторами. См. http://support.microsoft.com/kb/942448
3 ответа
Как только ОС запускается, MBR обычно защищается по вирусным причинам - это один из самых старых вирусных приемов в книгах - восходит к передаче вирусов с дискет на дискеты.
Даже если это не ограничено, вы должны написать код низкого уровня - он не является частью файловой системы, но существует в определенном месте на жестком диске.
Из-за этого вы в значительной степени ограничены написанием низкоуровневого (большинство программ реализует это в ассемблере) или кода C, предназначенного для 16-битной DOS.
Большинство из этих программ используют интерфейс BIOS (я полагаю, что 13 часов) для прямого доступа к секторам диска. Вы можете получить к ним доступ в C, используя некоторую встроенную сборку или предоставленные компилятором интерфейсы. Как правило, вы не получите доступ к BIOS без сотрудничества с ОС, поэтому ваша программа, опять же, будет ограничена DOS. Если вы можете получить к ним доступ, вы почти дома свободны - хорошая вещь в BIOS - вам не нужно беспокоиться о том, какой тип HD находится в системе - даже карты RAID часто вставляются в процедуры BIOS, чтобы к ним можно было получить доступ не зная, где в памяти находится контроллер ATA или SATA, и выполняя команды на этом низком уровне.
Однако, если вам абсолютно необходим доступ к нему в операционной системе, вам достаточно написать драйвер устройства для доступа к BIOS или к области памяти, где существуют контроллеры HD. Однако я бы не рекомендовал это делать, поскольку с этим очень сложно справиться - современные компьютеры размещают контроллеры HD в разных местах памяти, с разными IRQ, и каждый набор микросхем становится немного более эзотерическим, поскольку они могут обеспечить минимальный интерфейс. в BIOS для загрузки, а затем конкретный драйвер для Windows. Они пропускают все другие тонкости интерфейса, которые считаются совместимыми с другими контроллерами, потому что совместимость обходится дороже.
Вы можете обнаружить, что на уровне драйверов внутри окон у вас будут методы для прямого доступа к секторам дисков (или псевдо-напрямую), но, опять же, они, вероятно, очень хорошо защищены из-за вышеупомянутых вирусных проблем.
Удачи!
Модификация загрузчика плохая, плохая идея. Вот только некоторые из возможных ошибок:
- он потенциально может уничтожить продукты полного шифрования диска (Truecrypt, PGP, Vista BitLocker и т. д.)
- это может привести к отключению AV-продуктов (напугать пользователей)
- это потенциально убивает сложные сценарии загрузки (цепные загрузчики и т. д.)
- при использовании модуля TPM он уничтожит цепочку доверия (поскольку проверяет MBR на наличие изменений перед его выполнением)
- Прямой доступ к диску не разрешается, начиная с Vista (только с использованием драйверов)
Альтернативы (такие как изменение аппаратного регистра во время загрузки Windows через драйвер, который настроен на загрузку во время загрузки или после загрузки Windows) действительно должны быть рассмотрены. Если изменение так же просто, как запись в порт, то есть:
OUT AX, BL
тогда существуют драйверы для всех версий Window, которые могут это делать (чтение / запись значения из / в определенный порт), которые можно вызывать из пользовательского режима.
Может быть, вам поможет сценарий загрузки PXE? Просто загрузитесь с созданного образа PXE, который изменяет аппаратные регистры, которые нужно изменить, и затем верните элемент управления в основную загрузочную запись или в загрузочную запись активного раздела.
Таким образом, вам не нужно изменять загрузочные записи.