我是一名电气工程师,他最近发现需要修改MBR中的代码.基本上我需要能够在HDD之前执行代码,操作系统启动并接管.
我完全理解这需要在汇编中编写,并且考虑到MBR中的446个字节左右的代码空间我只希望调用MBR之外的其他代码.我的问题是什么是写入MBR的最佳方式?如果我想改变MBR,那就说磁盘HDD_1 ...将HDD_1引入另一台机器然后写入它,或者在当前机器中直接(在窗口外)写入它是否更好.基本上我想我会插入一个电话并留下MBR的其余部分.
任何建议,将不胜感激
克里斯
我很清楚这将是困难的.我的问题是将指令放入MBR的最佳方法是什么?不言而喻,Windows不允许直接访问磁盘.您如何建议我在MBR中写入指令?是否可以启动*nix的live CD并从那里写入MBR?
有多种方法可以写入驱动器的引导扇区,在我试验自制软件开发时,我使用了一般的参考资料:http://wiki.osdev.org/
我个人只是在linux下启动并使用dd:
先备份
dd if =/dev/sda =〜/ 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)可以省去很多麻烦.
然而正如Michael Burr所说,这可能是一个坏主意.修改Windows引导加载程序可能会让您很少或根本没有自己的代码空间.
BIOS通过读取每个引导设备的第一个扇区(512字节)并检查一组特定的签名字节,从硬盘驱动器(或软盘驱动器)引导计算机.如果找到这些字节,则将512字节扇区复制到ram(在特定位置)并且BIOS跳转以运行它.
除了签名字节之外,扇区中的446个字节可供您用作引导程序,但引导程序必须完全适合该扇区!由于446字节不是很大,您必须进行BIOS调用以将其他扇区从硬盘驱动器(或软盘驱动器或其他任何东西)复制到ram中以运行它们.
一旦你已经足够装入ram来运行程序,跳转到它就可以了.
这就是操作系统从字面上"通过它自己的引导"拉扯自己的方式
请参见http://en.wikipedia.org/wiki/Master_boot_record
现在,没有理由你不能用C或C++(或大多数其他东西)编写启动代码,除了使用汇编,你确切知道将生成什么代码并且很容易进行BIOS调用.
我建议你写一个512字节的磁盘驱动器到ram复印机,将你的程序从磁盘加载到ram,然后跳转到你的程序的起始地址.然后,您可以使用您想要的任何语言编写程序.请记住,当您的启动代码开始运行时,这些512字节是您可以依赖的唯一内容.(好吧,BIOS就在那里你可以拨打BIOS电话.BIOS也会在ram的某些地方放置一些系统信息...)如果你想调用你写的任何超出该部门的功能,你必须把它们装进你自己的ram.
此外,测试代码的最简单方法可能是将其放在软盘上并启动它.
要回答您的原始问题,您可以在某处保留旧MBR的备份副本,并且您的新MBR可以将您的函数加载到ram中,运行它,然后加载原始MBR并运行它,允许Windows继续启动.
此外,迈克尔伯尔是对的,得到你想做的事情将成为一场噩梦.
在回答您关于如何在硬盘上实际写入此内容的评论时,有几个"原始写入"程序可以复制到磁盘上的扇区.此外,您可以启动Linux live cd并使用dd将数据写入您选择的块设备上您选择的扇区. - 简单就像馅饼一样.
基本上我想我会插入一个电话并留下MBR的其余部分
这个子程序调用会调用什么?此时内存中唯一的代码是MBR或ROM中的任何代码.
请仔细考虑一下你是否真的需要这个,或者在你花太多时间之前没有更好的选择.写入MBR的第三方代码(OS加载器放入的MBR除外)通常不被用户很好地接收,因为:
防病毒程序经常将其标记为可疑代码,因为它是病毒用于控制机器的技术
程序使用了将自身插入MBR并将附加代码和数据存储在光盘的"保留"扇区中的技术(因为实际上没有多少人可以在MBR中存储和存储).遗憾的是,由于没有好的,标准的方法来实际保留这些扇区,这种技术(有时用于复制保护)会导致磁盘上数据结构的损坏(即,驱动器上的所有数据都会再次出现).用户真的很讨厌这个.我相信Quicken在某一时刻采用了类似的保护方案并面临着相当大的反弹.
因此,如果您决定继续这条道路,请谨慎行事,为头痛做好准备.