7

我需要修改 Windows 的 MBR,我真的很想从 Windows 中执行此操作。

这是我的问题。我知道我可以通过调用 CreateFile 来处理物理设备。MBR 会一直在 \\.\PHYSICALDRIVE0 上吗?另外,我还在学习直接从磁盘读取的 Windows API。readabsolutesectors 和 writeabsolutesectdors 是我需要用来读取/写入包含 MBR 的磁盘扇区的两个函数吗?

根据我自己学到的东西进行编辑。MBR 并不总是在 \\.\PHYSICALDRIVE0 上。此外,您可以通过使用包含 MBR 的驱动器的设备名称调用 CreateFile 来写入引导扇区(至少作为 XP 上的管理员)。此外,您可以通过简单地调用 WriteFile 并传递调用 CreateFile 创建的设备的句柄来写入该驱动器。

编辑以解决 Joel Coehoorn。我需要编辑 MBR,因为我正在处理一个需要在 BIOS 中的 POST 之后,但在允许 Windows 启动之前修改硬件寄存器的项目。我们的计划是通过修改引导加载程序以在 Windows 启动之前执行我们的代码来进行这些更改。

编辑 Cd-MaN。谢谢(你的)信息。但是,您的回答中没有任何我不知道的内容,而且您的回答也没有解决我的问题。由于多种原因,特别是注册表绝对不会做我们需要的事情。一个重要的原因是 Windows 是与我们的产品一起运行的多个软件层中的最高层。这些更改甚至需要在较低级别运行之前发生,因此注册表将无法正常工作。

PS 用于 Cd-MaN。据我了解,您提供的信息并不完全正确。对于 Vista,如果要写入的扇区是引导扇区,我认为您可以写入卷。请参阅http://support.microsoft.com/kb/942448

4

3 回答 3

7

一旦操作系统启动,MBR 通常会因病毒原因受到保护——这是书中最古老的病毒技巧之一——可以追溯到将病毒从软盘传递到软盘。

即使它没有受到限制,您也必须编写低级代码——它不是文件系统的一部分,而是存在于硬盘驱动器的特定位置。

因此,您几乎只能编写低级(大多数程序在汇编中实现)或针对 16 位 DOS 的 C 代码。

这些程序中的大多数使用BIOS 接口(我相信是 13h)直接访问磁盘的扇区。您可以使用一些内联汇编或编译器提供的接口在 C 中访问这些。但是,如果没有操作系统的合作,您通常无法访问 BIOS,因此您的程序将再次受限于 DOS。如果您可以访问这些,您几乎可以在家免费使用 - BIOS 的好处是您不必担心系统中的 HD 类型 - 甚至 RAID 卡也经常将自己插入 BIOS 例程以便可以访问它们不知道 ATA 或 SATA 控制器在内存中的位置,并在该低级别执行命令。

但是,如果您绝对必须在操作系统中访问它,您几乎必须编写设备驱动程序来访问 BIOS 或 HD 控制器所在的内存空间。不过我不推荐它,因为这很难处理——现代计算机将高清控制器放在内存中的不同位置,具有不同的 IRQ,并且每个芯片组都变得更加深奥,因为它们可以提供最小的接口到bios进行启动,然后是Windows的特定驱动程序。他们跳过了所有其他被认为与其他控制器兼容的接口细节,因为兼容成本更高。

您可能会发现,在 Windows 内的驱动程序级别,您将拥有直接(或伪直接)访问驱动器扇区的方法,但同样,由于上述病毒问题,它们很可能受到很好的保护。

祝你好运!

于 2008-09-02T18:25:28.517 回答
4

修改引导加载程序是个坏主意。这里只是一些可能的问题:

  • 它可能会杀死全盘加密产品(Truecrypt、PGP、Vista 的 BitLocker 等)
  • 它可能会绊倒 AV 产品(吓唬用户)
  • 它可能会杀死复杂的引导场景(链式引导加载程序等)
  • 使用 TPM 模块时,它会终止信任链(因为它会在执行之前检查 MBR 是否有更改)
  • 从 Vista 开始不允许直接访问磁盘(仅使用驱动程序)

确实应该考虑替代方案(例如在 Windows 启动期间通过设置为在启动时或 Windows 启动后加载的驱动程序修改硬件寄存器)。如果修改就像写入端口一样简单,即:

OUT AX, BL

然后驱动程序存在于所有版本的 Window 中,可以执行此操作(从/向某个端口读取/写入值),可以从用户模式调用。

于 2008-09-02T16:49:40.680 回答
2

也许 PXE 引导方案可以帮助您?只需在您精心制作的 PXE 映像上引导,该映像会修改您需要修改的硬件寄存器,然后将控制权返回到主引导记录或活动分区的引导记录。

这样您就不必修改引导记录。

于 2008-09-15T20:11:48.120 回答