项目涉及的相关知识及技术目录
1、 实验环境,使用bochs调试工具。
2、 刷新BIOS技术问题。
3、 代码植入BIOS问题。
4、 源代码相关技术问题:
A、如何编写BIOS模块(如:PCI、 ISA)。
B、实模式关于HOOK磁盘中断的问题。
C、磁盘中断中选择再次HOOK的问题。
D、NT保护模式下设置物理地址映射。
E、NT保护模式下线性地址寻址问题。
BIOS模块调试实验环境采用Bochs
Bochs虚拟机可以调试BIOS及操作系统,Bochs使用主要是配置它的配置文件,我们以实例配置文件简单讲解,Bochs实验调试等网上有很多相关文章,这里简单讲解。
我的配置实例:文件名xp.bxrc,修改后的及需要设置的内容如下:
- ######使用的系统BIOS模块######
- romimage: file=$BXSHARE/BIOS-bochs-latest
- ######使用的CPU 相关参数######
- cpu: count=1, ips=10000000, reset_on_triple_fault=1
- ######设置内存大小 ######
- megs: 128
- ######添加我们的BIOS模块######
- optromimage1: file=test.bin, address=0xd0000
- ######使用的VGAROM模块######
- vgaromimage: file=$BXSHARE/VGABIOS-lgpl-latest
- ######设置虚拟机硬盘与光盘######
- ata0-master: type=disk, path="c.img", mode=flat, cylinders=4161, heads=16, spt=63
- #ata0-slave: type=cdrom, path="xp.iso", status=inserted
- ######设置引导设备 ######
- boot: c
- #boot: cdrom, disk
Bochs调试加载配置文件方法:可以设置一个bat文件,如下内容:
set BXSHARE=d:\bochs
%BXSHARE%\bochsdbg.exe -q -f xp.bxrc
如何刷新各种BIOS问题
各种BIOS刷新相关工具早已在网上流传,工具的使用这里不作介绍,IcLord的作者已经给出很多编程方法实现。这里简单说下。
UniFlash开源项目我也详细分析过,如果有必要我会给出UniFlash源代码的详解,该项目指出可以刷写所有BIOS芯片,但是该项目刷新BIOS存在很多问题,绝大多数情况是无法刷新的我实验过很多次,也尝试修改他的代码过很多次,没找到原因。
Aword BIOS已经有通用的刷写API调用,不管在NT下还是在实模式下,IcLord也作了讲解。如果有时间我会给出实模式及NT下的刷写源代码及分析。
代码植入BIOS问题
关于网上提及的,IcLord讲到的我就不再做重复的分析。这里主要讲下我们的模块可以植入哪些地方以方便隐藏。以前的教程讲过的方法存的问题分析。
一、 ISA模块形式植入:这种方式只适合于较早的计算机,因为目前的计算机系统BIOS是不会加载ISA模块的。故只能做实验调试用的方法。
二、 PCI模块形式植入:该方法虽然系统BIOS都要加载PCI ROM,但是系统BIOS只加载实际存在的PCI卡的ROM模块。而且通常BIOS设置中可以
关闭相应的ROM启动。
三、 HOOK BootBlock或者说要启动的模块:该方法当然我认为是最有效的,但是又存在很多技术上的难题。检验和问题,不同BIOS的结构问题,过早的HOOK还存在再次获取CPU运行机会问题等等。
本人实验过以上提及的所有方法,我认为HOOK PCI、VGA及相关启动模块是比较可寻的办法。为什么?一般这类的ROM模块是必须启动的,而且调试发现一般它的ROM本身代码用不完自身设置的大小,我们可以借助剩余大小隐藏我们的代码。例如:集成显卡会把显卡ROM集成到系统BIOS模块中,我们可以对该模块进行HOOK,修改ROM头部的跳转指令,跳到我们的代码开始处执行,我们的代码执行完后跳转到它的代码开始处执行。
如何编写BIOS模块
BIOS是分模块组合在一起的。这里对PCI及ISA模块作下简单分析,VGA模块跟PCI模块几乎一样。模块主要是头部有个规范,该规范适合所有BIOS系统。具体可以参看《PCI系统结构》及其他书籍。
源代码实例可以参看国外ROMOS开源项目,该开源项目的思想很值得学习。该项目讲解了如何在BIOS中嵌入一个小型DOS,如:FreeDos。采用了把整个DOS系统盘镜像植入BIOS中,跟早期的PXE引导DOS机制类似,然后HOOK磁盘中断,模拟DOS系统盘镜像出一个盘,源代码编译后只有900多字节。这种思想在早期还是很值得学习的。
实模式关于HOOK磁盘中断问题
很早前就有业界内人士发贴问,为什么在我的ROM模块中HOOK磁盘中断会失败呢?关于这个问题现在目前网上已经有人作出过回答,国外的开源项目在2003年我都看到过。
由于我们的ROM模块过早的运行,可能运行在磁盘服务前面了,这时如果HOOK Int 13h会因为BIOS加载磁盘服务时重写Int 13h IVT值,故我们设法HOOK其他服务,这个服务要求较早被BIOS安装且不会再次修改且加载操作系统前调用,最佳的这个服务选择就是int 18h、int19h服务。可以参看
BIOS源代码,也可以参看PXE SDK说明文档略有讲过。
我们的磁盘服务代码建议放在实模式高端内存,通过BIOS数据区域可修改,内存40:13,即物理地址413h处的值。降低常规内存值,高端的内存就留给我们用。我们的保护模式下运行的代码建议也放在这段内存,且要求放在以页基址开始的内存中,以便后面代码的页映射我们的保护模式代码物理页。页基址:内存物理页地地址开始的低12位为零,参看《80386保护模式教程》。
若我们的代码直接在内存的ROM映射区内,可能导致在NT下访问不到我们的代码,因为NT内核加载程序ntldr可能不会映射该段内存,甚至可能BIOS在使用后都会关闭ROM区域这段内存,而且ROM区域这段内存在初始化后被系统BIOS设置成只读不能写。当然我们可以采取用int 15h服务对ROM区域这段内存映射。
当然也可以在NT启动过程中,在我们的磁盘服务中对想映射的内存都映射。由于代码大小的限制,故有些没必要的代码。尽量不使用了。

