首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >编写MBR代码

编写MBR代码
EN

Stack Overflow用户
提问于 2009-02-20 05:08:22
回答 11查看 23.8K关注 0票数 15

我是一名电气工程师,最近发现需要修改MBR中的代码。基本上,我需要在硬盘上执行代码的能力,然后操作系统启动并接管。

我完全理解这将需要用汇编语言编写,并且考虑到MBR中446字节左右的代码空间,我只希望调用MBR之外的其他代码。我的问题是,写入MBR的最佳方式是什么?如果我想改变磁盘HDD_1的MBR...最好是将HDD_1从到另一台机器上然后再写入,还是在当前机器中直接写入(在windows之外)。基本上,我认为我将插入一个调用,而不去管MBR的其余部分。

如有任何建议,我们将不胜感激

克里斯

我很清楚这将是一件困难的事情。我的问题是,在MBR中放置指令的最佳方式是什么?不用说,Windows不允许直接访问磁盘。您建议我如何将指令写入MBR?是不是启动了一张*nix的live CD并从那里写入MBR?

EN

回答 11

Stack Overflow用户

发布于 2009-02-20 09:16:02

有多种写入驱动器引导扇区的方法,我在尝试开发自制操作系统时使用了一个通用的参考:http://wiki.osdev.org/

我个人只是在linux下启动并使用dd:

首先进行

  1. 备份

dd if=/dev/sda of=~/windows_ bootloader .sda bs=512 count=1

  • Disassemble引导加载程序

~/windows_bootloader.asm

  • Make -b16 -o7C00h ~/windows_bootloader.bin > ndisasm您的修改并重新组装

nasm ~/windows_bootloader.asm ~/modified_bootloader.bin

  • Overwrite -f bin启动加载程序

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

这假设'sda‘是正确的块设备。请注意,步骤4并不只是将文件复制到/dev/sda (它可以这样做,但是如果输出二进制文件> 512字节,那么您可能会覆盖超过第一个扇区)

显然,您不会想要在实时系统上调试这种方法。使用bochs、qemu或VMWare服务器之类的x86仿真器会让你省去很多麻烦。

然而,正如Michael Burr所说,这可能是一个坏主意。修改Windows引导加载程序,可能会给您自己的代码留下很少甚至没有空间。

票数 20
EN

Stack Overflow用户

发布于 2009-02-20 05:15:16

BIOS通过读取每个引导设备的第一个扇区(512字节)并检查一组特定的签名字节,从硬盘(或软驱)引导计算机。如果找到这些字节,则将512字节的扇区复制到ram (在特定位置),并且BIOS跳转以运行它。

除了签名字节,扇区中的446字节可供您用作引导程序,但引导程序必须完全适合该扇区!因为446字节不是很大,所以你必须调用BIOS来从硬盘驱动器(或软盘驱动器,或其他驱动器)复制其他扇区到ram中才能运行这些扇区。

一旦你已经加载了足够的内存来运行你的程序,跳转到它,你就可以开始工作了。

这就是一个操作系统是如何“靠自己的引导程序把自己拉起来”的。

请参阅http://en.wikipedia.org/wiki/Master_boot_record

现在,你没有理由不能用C或C++ (或大多数其他语言)编写引导代码,除了使用汇编,你可以确切地知道将生成什么代码,并且很容易进行BIOS调用。

我建议你写一个512字节的磁盘驱动器到ram复制器,它会把你的程序从磁盘加载到ram中,然后跳转到你程序的起始地址。然后你可以用你想要的任何语言来编写你的程序。请记住,当您的引导代码开始运行时,这512个字节是您在ram中唯一可以依靠的东西。(好的,BIOS在那里,您可以进行BIOS调用。BIOS还会将一些系统信息放在内存中的某些位置...)如果你想调用你写的任何在这个扇区之外的函数,你必须自己把它们加载到ram中。

此外,测试代码的最简单方法可能是将其放在软盘上并从软盘启动。

要回答你原来的问题,你可以在某个地方保留一个旧的MBR的备份副本,而你的新的MBR可以将你的函数加载到ram中,运行它,然后加载原始的MBR并运行它,从而允许windows继续引导。

此外,Michael Burr是对的,完成你想要做的事情将是一场噩梦。

为了回答你关于如何在硬盘上实际写入的评论,有几个“原始写入”程序可以复制到磁盘上的一个扇区。此外,您还可以从linux live cd启动,然后使用dd将数据写入您选择的块设备上的扇区。--就像馅饼那部分一样简单。

票数 9
EN

Stack Overflow用户

发布于 2009-02-20 05:25:47

基本上,我认为我将插入一个调用,而不去管

的其余部分

此子例程调用将调用什么?此时,内存中唯一的代码是MBR或ROM中的任何代码。

在你花太多时间在它上面之前,请仔细考虑你是否真的需要它,或者没有更好的替代方案。写入MBR (而不是OS加载程序放入其中的MBR )的第三方代码通常不会被用户很好地接受,因为:

  • 杀毒程序通常将其标记为可疑代码,因为这是病毒用来获得对machines
  • programs的控制的技术,病毒使用的技术是将自己插入到
    • 中,并将额外的代码和数据存储在磁盘的“保留”扇区中(因为在MBR中确实没有什么可以做和存储的)。不幸的是,由于没有好的、标准的方法来实际保留这些扇区,这种技术(有时用于复制保护)可能会导致磁盘上的数据结构损坏(即,驱动器上的所有数据都会消失)。用户真的很讨厌这样。我相信,在某一时刻,Quicken使用了一种保护方案,就像这样做了,并面临着相当大的反弹。

因此,如果你决定继续走这条路,请谨慎行事,并为令人头疼的事情做好准备。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/568359

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档