ami bios 代码_ami bios logo

       好久不见,今天我想和大家探讨一下关于“ami bios 代码”的话题。如果你对这个领域还不太熟悉,那么这篇文章就是为你准备的,让我们一起来了解一下吧。

1.电脑故障检测卡常用代码

2.问下高手.845主板诊断卡显AD什么意思?

3.如何提取BIOS固件中的代码

4.主板检测卡代码是由BIOS的类型决定的

ami bios 代码_ami bios logo

电脑故障检测卡常用代码

       Debug 卡是一块具有硬件侦错功能的外接卡,也叫诊断卡或POST 卡。通过它可以方便地找出板卡的故障所在。

       2.Debug 卡的工作原理

       Debug 卡的工作原理很简单,每个厂家的BIOS 都有POST CODE,即开机自我侦测代码,当BIOS 要进行某项测试时,首先将该POST CODE 写入80H 地址,如果测试顺利完成,再写入下一个POST CODE,因此,如果发生错误或死机,根据80H 地址的POST CODE 值,就可以了解问题出在什么地方。Debug 卡的作用就是读取80H 地址内的POST CODE,并经译码器译码,最后由数码管显示出来。这样就可以通过Debug 卡上显示的16 进制代码判断问题出在硬件的哪一部分,而不用仅依靠计算机主板那几声单调的警告声来粗略判断硬件错误了。通过它可知道硬件检测没有通过的是内存还是CPU,或者是其他硬件。

       以此类推,还可以判断超频的瓶颈硬件是哪一个,做到有的放矢,查障无忧。

       3.Debug 卡分类

       Debug 卡的种类比较多,专业的Debug 卡具备比较复杂的功能,如Dual port(双面接口,即上下两面接口分别为ISA 和PCI)、自动重启、外接显示LED 、Step by Step trace(步步跟踪)等 ,不过售价也比较高。市场上面向普通用户的Debug 卡功能相对较少,售价较低,使用也比较方便。常见的有两种类型:一种是ISA 接口的Debug 卡,另一种是PCI 接口的Debug 卡,不过现在用得比较多的是PCI接口的Debug 卡。

       只要有主板、CPU 、内存、显卡4 个基本配件就可以使用Debug 卡检测了。比如在CPU 超频后出现黑屏现象时、无法确定内存、AGP 显卡或IDE 设备到底哪里出了问题,只好凭自己的经验插这个拔那个,结果也许还是徒劳。现在,只需看看POST 卡上的参数即可。有的主板厂商已经把Debug 卡做到了主板上,而且界面和内插式Debug 卡一样,这样在主板出问题时检测起来就更加方便。

       --

       计算机故障检测卡(PCI/ISA两用型)故障代码表

       --------------------------------------------------------------------------------代码含义速查: 请输入两位16进制的故障代码PCI/ISA两用型DEBUG卡故障代码明细表(只适用于PCI/ISA两用型及PCI单用型)

       代码 Award BIOS AMI BIOS Phoenix和Tandy3000 BIOS

       00 (见特殊代码意义) 已显示系统的配置;即将控制工INT19引导装入。(见特殊代码意义) (见特殊代码意义)

       01 处理器测试1,处理起状态核实,如果测试失败,循环是无限的。 处理器寄存器的测试即将开始,不可屏蔽中断即将停用。 CPU寄存器测试正在进行或者失灵。

       02 确定诊断的类型(正常或者制造)。如果键盘缓冲器含有数据就会失效。 停用不可屏蔽中断;通过延迟开始。 CMOS写入/读出正在进行或者失灵。

       03 清除8042键盘控制器,发出TEST-KBRD命令(AAH)。 通电延迟已完成。 ROM B10S检查部件正在进行或失灵。

       04 使8042键盘控制器复位,核实TESTKBRD。 键盘控制器较复位/通电测试。 可编程间隔计时器的测试正在进行或失灵。

       05 如果不断重复制造测试1至5,可获得8042控状态。 已确定软复位/通电;即将启动ROM。 DMA初始准备正在进行或者失灵。

       06 使电路片作初始准备,停用视频,奇偶性,DMA电路片,以及清除DMA电路片,所有页面寄存器和CMOS停机字节。使电路片作初始准备,停用视频,奇偶性,DMA电路片,以及清除DMA电路片,所有页面寄存器和CMOS停机字节。 已启动ROM计算ROM BIOS检查总和,以及检查键盘缓冲器是否清除。 DMA初始页面寄存器读/写测试正在进行或失灵。

       07 处理器测试2,核实CPU寄存器的工作。 ROM BIOS检查总和正常,键盘缓冲器已清除,向键盘发出BAT(基本保证测试)命令。 无意义

       08 使CMOS计时器作初始准备,正常地更新计时器的循环。 已向键盘发出BAT命令,即将写入BAT命令。 RAM更新检验正在进行或失灵。

       09 EPROM检查总和且必须等于零才通过。 核实键盘的基本保证测试,接着核实键盘命令字节。 第一个64K RAM测试正在进行。

       0A 使视频接口作初始准备。 发出键盘命令字节代码,即将写入命令字节数据。 第一个64K RAM芯片或数据线失灵,移位。

       0B 测试8254通道0。 写入键盘控制器命令字节,即将发出引脚23和24的封锁/解锁命令。 第一个64K RAM奇/偶逻辑失灵。

       0C 测试8054通道1。 键盘控制器引脚23,24已封锁/解锁;已发出NOP命令。 第一个64K RAM的地址线故障。

       0D 1.检查CPU速度是否与系统时钟相匹配。2.检查控制芯片已编程值是否条符合初设置。3.视频通道测试,如果失败,则鸣喇叭。 已处理NOP命令;接着测试CMOS停开寄存器。 第一个64K RAM的奇偶性失灵。

       0E 测试CMOS停机字节。 CMOS停开寄存器读/写测试;将计算CMOS检查总和。 初始货输入/输出端口地址。

       0F 测试扩展的CMOS。 已计算CMOS检查总和写入诊断字节;CMOS开始初始准备。 无意义。

       10 测试DMA通道0。 CMOS已作初始准备,CMOS状态寄存器即将为日期和时间作初始准备。 第一个64K RAM第0位故障。

       11 测试DMA通道1。 COMS状态寄存器已作初始准备,即将停用DMA和中断控制器。 第一个64K RAM第1位故障。

       12 测试DMA页面寄存器。 停用DMA控制器1以及中断控制器1和2;即将视频显示器并使端口B作初始准备。 第一个64K RAM第2位故障。

       13 测试8471键盘控制器接口。 视频显示器已停用,端口B已作初始准备;即将开始电路片初始化/存储器自动检测。 第一个64K RAM第3位故障。

       14 测试存储器更新触发电路。 电路片初始化/存储器自动检测结束;8254计时器测试即将开始。 第一个64K RAM第4位故障。

       15 测试开头64K的系统存储器。 第2通道计时器测试了一半;8254第2通道计时器即将完成测试。 第一个64K RAM第5位故障。

       16 建立8259所用的中断矢量表。 第2通道计时器测试结束;8254第1通道计时器即将完成测试。 第一个64K RAM第6位故障。

       17 调准视频输入/输出工作,若装有视频BIOS则启用。 第1通道计时器测试结束;8254第0通道即将完成测试。 第一个64K RAM第7位故障。

       18 测试视频存储器,如果安装选用的视频BIOS通过,则可绕过。 第0通道计时器测试结束;即将开始更新存储器。 第一个64K RAM第8位故障。

       19 测试第1通道的中断控制器(8259)屏蔽位。 已开始更新存储器,接着将完成存储器的更新。 第一个64K RAM第9位故障。

       1A 测试第2通道的中断控制器(8259)屏蔽位。 正在触发存储器更新线路,即将检查15微秒通/断时间。 第一个64K RAM第10位故障。

       1B 测方式CMOS电池电平。 完成存储器更新时间30微秒测试;即将开始基本的64K存储器测试。 第一个64K RAM第11位故障。

       1C 测试COMS检查总和。 无意义。 第一个64K RAM第12位故障。

       1D 调定COMS的配置。 无意义。 第一个64K RAM第13位故障。

       1E 测定系统存储器的大小,并且把客观存在和COMS值比较。 无意义。 第一个64K RAM第14位故障。

       1F 测试64K存储器至最高640K。 无意义。 第一个64K RAM第15位故障。

       20 测量固定的8259中断位。 开始基本的64K存储器测试;即将测试地址线。 从属DMA寄存器测试正在进行或失灵。

       21 维持不可屏蔽中断(NMI)位(奇偶性或输入/输出通道的检查)。 通过地址线测试;即将触发奇偶性。 主DMA寄存器测试正在进行或失灵。

       22 测试8259的中断功能。 结束触发奇偶性;将开始串行数据读/写测试。 主中断屏蔽寄存器正在进行或失灵。

       23 测试保护方式8086虚似方式和8186页面方式。 基本的64K串行数据读/写测试正常;即将开始中断矢量初始化之前的任何调节。 从属中断屏蔽寄存器测试正在进行或失灵。

       24 测定1Mb以上的扩展存储器。 矢量初始化之前的任何调节完成,即将开始中断矢量的初始准备。 设置ES段地址寄存器注册表到内存高端。

       25 测试除头一个64K之后的所有存储器。 完成中断矢量初始准备;将为旋转武断续开始读出8042的输入/输出端口。 装入中断矢量正在进行或失灵。

       26 测试保护方式的例外情况。 读写8042的输入/输出端口;即将为旋转式断续开始使全局数据作初始准备。 开启A20地址线;使之参入寻址。

       27 确定超高速缓冲存储器的控制或屏蔽RAM。 全1数据初始准备结束;接着将进行中断矢量之后的任何初始准备。 键盘控制器测试正在进行或失灵。

       28 确定超高速缓冲存储器的控制或者特别的8042键盘控制器。 完成中断矢量之后的初始准备;即将调定单色广式。 CMOS电源故障/检查总和计算正在进行。

       29 无意义。 已调定单色方式,即将调定彩色方式。 CMOS配置有效性的检查正在进行。

       2A 使键盘控制器作初始准备。 已调定彩色方式,即将进行ROM测试前的触发奇偶性。 置空64K基本内存。

       2B 使磁盘驱动器和控制器作初始准备。 触发奇偶性结束;即将控制任选的视频ROM检查前所需的任何调节。 屏幕存储器测试正在进行或失灵。

       2C 检查串行端口,并使之作初始准备。 完成视频ROM控制之前的处理;即将查看任选的视频ROM并加以控制。 屏幕初始准备正在进行或失灵。

       2D 检查并行串口,并使之做初始准备。 以完成任选的视频ROM控制,即将进行视频ROM回复控制之后任何其他处理的控制。 屏幕回扫测试正在进行或失灵。

       2E 使磁盘驱动器和控制器作初始准备。 使视频ROM控制之后的处理复原;如果没发现EGA/VGA就要进行显示存储器读写测试。 检查视频ROM正在进行。

       2F 检测数学协处理器,并使之做初始准备。 没发现EGA/VGA;即将开始显示存储器读/写测试。 无意义。

       30 建立基本内存和扩展内存。 通过显示存储器读/写测试;即将进行扫描检查。 认为屏幕是可以工作的。

       31 检测从C800:0至EFFF:0的选用ROM,并使之做处世准备。 显示存储器读/写测试失败,即将进行另一种显示存储器读/写测试。 单色监视器是可以工作的。

       32 对主板上的COM/LTP/FDD/声音设备等I/O芯片编程使之适合设置值。 通过另一种显示存储器读/写测试;即将进行另一种显示器扫描检查。 彩色监视器(40列)是可以工作的。

       33 无意义。 视频显示器检查结束;将开始利用调节开关和实际插卡检验显示器的类型。 彩色监视器(80列)是可以工作的。

       34 无意义。 已检验显示适配器;接着将调定显示方式。 记时器滴答声中断测试正在进行或失灵。

       35 无意义。 完成调定显示方式;即将检查BIOS ROM的数据区。 停机检测正在进行或失灵。

       36 无意义。 已检查BIOS ROM数据区;即将调定通电信息的游标。 门电路中A—20失灵。

       37 无意义。 识别通电信息的游标调定已完成;即将显示通电信息。 保护方式中的意外中断。

       38 无意义。 完成显示通电信息;即将读出新的游标位置。 RAM测试正在进行或者地址故障>FFFFh。

       39 无意义。 己读出保存游标位置,即将显示引用信息串。 无意义。

       3A 无意义。 引用信息串显示结束;即将显示发现(ESC)信息。引用信息串显示结束;即将显示发现信息。 间隔计时器通道2测试或失灵。

       3B 用OPT电路片(只是486)使辅助超高速缓冲存储器作初始准备。 已显示发现信息:虚拟方式,存储器测试即将开始。 按日计算的日历时钟测试正在进行或失灵。

       3C 建立允许进入CMOS设置的标志。 无意义。 串行端口测试正在进行或失灵。

       3D 初女台化键盘/PS2鼠标/PNP设备及总内存节点。 无意义。 并行端口测试正在进行或失灵。

       3E 尝试打开L2高速缓存。 无意义。 数学处理器测试正在进行或失灵。

       3F 无意义。 无意义。 无意义。

       40 无意义。 已开始准备虚拟方式的测试;即将从视频存储器来检验。 调整CPU速度,使之外围时钟精确匹配。

       41 中断己打开,将初始化数据以便于0:0检测内存变换(中断控制器或内存不良)。 从视频存储器检验之后复原;即将准备描述符表。 系统插件板选择失灵。

       42 显示窗口进入SETUP。 描述符表已准备好;即将进行虚拟方式作存储器测试。 扩展CMOS RAM故障。

       43 若是即插即用BIOS,则串口,并口初始化。 进入虚拟方式;即将为诊断方式实现中断。 无意义。

       44 无意义。 已实现中断(如已接通诊断开关;即将使数据作初始准备以检查存储器在0:0返转。 BIOS中断进行初始化。

       45 初始化数学处理器。 数据已作初始准备;即将检查存储器在0:0返转以及找出系统存储器的规模。 无意义。

       46 无意义。 测试存储器已返回;存储器大小计算完毕,即将写入页面来测试存储器。 检查只读存储器ROM版本。

       47 无意义。 即将在扩展的存储器试写页面;即将基本640K存储器写入页面。 无意义。

       48 无意义。 已将基本存储器写入页面;即将确定1Mb以上的存储器。 视频检查,CMOS重新配置。

       49 无意义。 找出1Mb以下的存储器并检验;即将确定1Mb以上的存储器。 无意义。

       4A 无意义。 找出1Mb以上的存储器并检验:即将检查BIOS ROM的数据区。 进行视频的初始化。

       4B 无意义。 BIOS ROM数据区的检验结束,即将检查和为软复位清除1Mb以上的存储器。 无意义。

       4C 无意义。 清除1Mb以上的存储器(软复位)即将清除1Mb以上的存储器。 屏蔽视频BIOS ROM。

       4D 无意义。 已清除1Mb以上的存储器(软复位);将保存存储器的大小。 无意义。

       4E 若检测到有错误,在显示器上显示错误信息,并等待客户按(F1)健继续。 开始存储器的测试:(无软复位);即将显示第一个64K存储器的测试。 显示版权信息。

       4F 读写软、硬盘数据,进行DOS引导。 开始显示存储器的大小,正在测试存储器将使之更新;将进行串行和随机的存储器测试。 无意义。

       50 将当前BIOS临时区内的CMOS值存到CMOS中。 完成1Mb以下的存储器测试;即将高速存储器的大小以便再定位和掩蔽。 将CPU类型和速度送到屏幕。

       51 无意义。 测试1Mb以上的存储器。 无意义。

       52 所有ISA只读存储器ROM进行初始化,最终给PCI分配IRQ号等初始化工作。 已完成1Mb以上的存储器测试;即将准备回到实址方式。 进入键盘检测。

       53 如果不是即插即用BIOS,则初始化串口、并口和设置时钟值。 保存CPU寄存器和存储器的大小,将进入实址方式。 无意义。

       54 无意义。 成功地开启实址方式;即将复原准备停机时保存的寄存器。 扫描“打击键”。

       55 无意义。 寄存器已复原,将停用门电路A—20的地址线。 无意义。

       56 无意义。 成功地停用A—20的地址线;即将检查BIOS ROM数据区。 键盘测试结束。

       57 无意义。 BIOS ROM的数据区检查了一半;继续进行。 无意义。

       58 无意义。 BIOS ROM的数据区检查结束;将清除发现信息。 非设置中断测试。

       59 无意义。 已清除信息;信息已显示;即将开始DMA和中断控制器的测试。 无意义。

       5A 无意义。 无意义。 显示按“F2”键进行设置。

       5B 无意义。 无意义。 测试基本内存地址线。

       5C 无意义。 无意义。 测试640K基本内存。

       5D 无意义。 无意义。 无意义。

       5E 无意义。 无意义。 无意义。

       5F 无意义。 无意义。 无意义。

       60 设置硬盘引导扇区病毒保护功能。 通过DMA页面寄存器的测试;即将检验视频存储器。 测试扩展内存。

       61 显示系统配置表。 视频存储器检验结束;即将进行DMA#l基本寄存器的测试。 无意义。

       62 开始用中断19H进行系统引导。 通过DMA#l基本寄存器的测试;即将进行DMA#2寄存器的测试。 测试扩展内存地址线。

       63 无意义。 通过DMA#2基本寄存器的测试;即将检查BIOS ROM数据区。 无意义。

       64 无意义。 BIOS ROM数据区检查了一半,继续进行。 无意义。

       65 无意义。 BIOS ROM数据区检查结束;将把DMA装置1和2编程。 无意义。

       66 无意义。 DMA装置1和2编程结束;即将使用59号中断控制器作初始准备。 Cache注册表进行优化配置。

       --

问下高手.845主板诊断卡显AD什么意思?

       所以刚刚的那句话就是说,更新了新版BIOS后, 你的主板就做好了支持列表给出的处理器的支持准备。如果不更新,则主板可能无法正确的识别和使用Athlon(速龙) 8X81系列、Sempron X8(双核闪龙) CPU

如何提取BIOS固件中的代码

       代码 Award BIOS Ami BIOS Phoenix BIOS或Tandy 3000 BIOS

       00 . 已显示系统的配置;即将控制INI19引导装入。 .

       01 处理器测试1,处理器状态核实,如果测试失败,循环是无限的。 处理器寄存器的测试即将开始,不可屏蔽中断即将停用。 CPU寄存器测试正在进行或者失败。

       02 确定诊断的类型(正常或者制造)。如果键盘缓冲器含有数据就会失效。 停用不可屏蔽中断;通过延迟开始。 CMOS写入/读出正在进行或者失灵。

       03 清除8042键盘控制器,发出TESTKBRD命令(AAH) 通电延迟已完成。 ROM BIOS检查部件正在进行或失灵。

       04 使8042键盘控制器复位,核实TESTKBRD。 键盘控制器软复位/通电测试。 可编程间隔计时器的测试正在进行或失灵。

       05 如果不断重复制造测试1至5,可获得8042控制状态。 已确定软复位/通电;即将启动ROM。 DMA初如准备正在进行或者失灵。

       06 使电路片作初始准备,停用视频、奇偶性、DMA电路片,以及清除DMA电路片,所有页面寄存器和CMOS停机字节。 已启动ROM计算ROM BIOS检查总和,以及检查键盘缓冲器是否清除。 DMA初始页面寄存器读/写测试正在进行或失灵。

       07 处理器测试2,核实CPU寄存器的工作。 ROM BIOS检查总和正常,键盘缓冲器已清除,向键盘发出BAT(基本保证测试)命令。 .

       08 使CMOS计时器作初始准备,正常的更新计时器的循环。 已向键盘发出BAT命令,即将写入BAT命令。 RAM更新检验正在进行或失灵。

       09 EPROM检查总和且必须等于零才通过。 核实键盘的基本保证测试,接着核实键盘命令字节。 第一个64K RAM测试正在进行。

       0A 使视频接口作初始准备。 发出键盘命令字节代码,即将写入命令字节数据。 第一个64K RAM芯片或数据线失灵,移位。

       0B 测试8254通道0。 写入键盘控制器命令字节,即将发出引脚23和24的封锁/解锁命令。 第一个64K RAM奇/偶逻辑失灵。

       0C 测试8254通道1。 键盘控制器引脚23、24已封锁/解锁;已发出NOP命令。 第一个64K RAN的地址线故障。

       0D 1、检查CPU速度是否与系统时钟相匹配。2、检查控制芯片已编程值是否符合初设置。3、视频通道测试,如果失败,则鸣喇叭。 已处理NOP命令;接着测试CMOS停开寄存器。 第一个64K RAM的奇偶性失灵

       0E 测试CMOS停机字节。 CMOS停开寄存器读/写测试;将计算CMOS检查总和。 初始化输入/输出端口地址。

       如果诊断卡的代码跑00或FF停止,说明CPU还没有开始工作,一般是CPU或主板的问题 ;代码从00 FF跑到C1或D3(BIOS不同跑的代码不一定相同)说明CPU是好的,问题出在内存部分没有工作,一般是内存的金手指或插槽脏了,或者主板给内存提供的工作条件不足,也就是说可能是主板坏了;代码从00 FF跑到26,一般来说如果显卡和主板没有问题的话,显示器就应该点亮了;如果代码从00 FF跑到41,主机不亮,有很大的可能是BIOS坏了,要重新刷写或更换BIOS。诊断卡从00 FF代码经过CI C3 05 07 13 26 (0B)41 43等等代码后再次跑回00或FF,说明主板的启动过程完毕,开始按照CMOS的设置进行引导。

主板检测卡代码是由BIOS的类型决定的

       2 逆向系统管理中断(SMI)句柄

        或许有人认为应该动用“硬件分析器”来参与我们的宏伟计划,其实这是一种误解。SMI处理程序是BIOS固件的一部分,和普通的BIOS代码一样,也可以类似的从中将其反汇编出来。Pinczakko的《BIOS Disassembly Ninjutsu Uncovered 》和《Guide to Award BIOS Reverse Engineering》二书,讲述了Award and AMI BIOS逆向方面的详细情况,有兴趣的读者可以到此参考。在这里,从BIOS中转储SMI处理函数,我们有两种方法可供选择。

       1. 找一个漏洞,从保护模式进入SMRAM,并将SMRAM中的所有内容,尤其是TSEG,High SMRAM和0xA0000-0xBFFFF等区域转储出来。如果BIOS没有锁定D_LCK位,可以通过Duflot和BSDaemon介绍的修改SMRAMC PCI配置寄存器的方式转储。万一BIOS锁定了SMRAM,BIOS固件看上去也无懈可击,那就只有修改BIOS,令其不会设置D_LCK位这一条路了。将修改的程序重刷回BIOS的ROM,这样在启动时,SMRAM就不会被锁定了。不过这样做首先要确定BIOS不需要数字签名(digitally signed),而且目前几乎没有主板会使用带数字签名的非EFIBIOS固件。

       我想在这里有必要提一下BIOS设置D_LCK位的方法。通常情况下,BIOS都倾向于使用0xCF8/0xCFC端口,通过合法的I/O访问,设置相关的PCI配置寄存器。BIOS首先将0x8000009C写入到0xCF8的地址端口,然后再将0x1A的数值写入到0xCFC的数据端口,设置SMRAMC寄存器就可以锁定SMRAM了。

       2. 还有另外一种方法,相对前者来说要简单一些,不需要访问运行时的SMRAM数据。

       2.1 从BIOS开发商的网站下载最新的,或者使用闪存编程器件(Flash Programmer)从BIOS的ROM中提取固件的二进制代码。我们针对的ASUS P5Q主板就是要下载P5Q-ASUS-PRO-1613.ROM文件。

       2.2 大多数的BIOS固件都包含了主BIOS模块,压缩的SMI处理句柄就位于其中,利用开发商提供的提取/解压工具打开BIOS主模块。由于ASUS BIOS是基于AMI BIOS的,我们使用AMIBIOS BIOS Module Manipulation Utility 和MMTool.exe从中抽取主模块。在MMTool中打开下载的.ROM文件,单击“Single Link Arch BIOS”抽取模块(ID=1Bh),然后检查“In uncompressed form”的选项,最后保存,就得到了包含SMI处理句柄的主BIOS模块。

       2.3 主BIOS模块抽取完成,就可以用HIEW或IDA Pro等工具开始我们的SMI反汇编之旅了。

       反汇编SMI句柄

        我们注意到在ASUS/AMI BIOS中使用的是一个结构体数组来描述SMI的处理函数。数组中的每一个入口项都有“$SMIxx”的签名,其中“xx”字符指明了具体的SMI处理函数。图1显示的是基于P45芯片组ASUS P5Q SE主板的AMIBIOS 8所使用的SMI分配表(SMI dispatch table)数据。

       反汇编SMI分配函数

        BIOS中有一个特殊的SMI分配函数,我们将其命名为“dispatch_smi”,将遍历分配表中的所有入口,并调用handle_smi_ptr指向的处理函数。如果没有任何处理函数能够响应当前的SMI中断信号,它将调用最后的$DEF例程。下面的代码就是我们从ASUS P5Q主板反汇编得到的Handle_SMI BIOS函数。

       钩挂SMI处理函数

        基于上述的讨论,钩挂SMI处理函数的方法也有很多,可以添加一个新的SMI处理句柄,也可以给已有的句柄打个补丁,加上新的功能。两种方法在本质上并没有多大区别,所以两种情况我们都将做必要的介绍。

        1.在SMI分配表中添加我们自己的SMI处理函数。

        要加入新的函数,必须先在分配表中建立一个新的入口表项,我们将其取名为“$SMIaa”,如图3所示。

        该入口包含了指向默认SMI处理句柄的指针,待会儿我们将修改这个默认的处理函数。或者我们也可以在SMRAM中找一块空闲区域,放上一段shellcode,将指向默认句柄的指针替换为指向shellcode。最后还要注意,当有新的处理函数加入到分配表中之后,保存在SMRAM数据段中的SMI代码计数值也要相应的加1,保持SMI处理函数数目的一致性。

        上述这个“调试”处理函数只做了一件事情,就是将SMI分配表从0x0B428:[si]拷贝到0x07000:[di]的位置,看来我们可以放心大胆的用自己的SMI代码钩挂它了。随后,我们将实现一个键盘记录程序,将其注入到这个处理函数内部。不过在我们开始新的章节之前,还是有必要先来回顾一下可以用于在用户击键时,调用记录程序的相关技术。

       1. 使用I/O APIC将键盘的硬件中断(IRQ #01)导向SMI。Shawn Embleton和Sherri Sparks采用的就是I/O高级可编程中断控制器,将键盘的IRQ #01号中断导向SMI,并在SMI处理程序中捕获击键事件。

       2. 采用键盘控制器数据端口访问时的I/O陷阱机制。

       我们在本文中使用了不同于前者的I/O陷阱技术,该项技术最初是BIOS模拟PS/2键盘的用途,在下一章节中我们将详细的解释其工作原理。

       3 SMM键盘记录程序

       3.1 硬件I/O陷阱机制

        实现一个内核级的键盘记录程序,方法之一是钩挂中断描述符表(IDT)中的调试陷阱#DB处理函数,并设置调试寄存器DR0-DR3,用数据端口0x60捕获系统的击键事件。类似的,我们也可以采用通过键盘I/O端口60/64陷入SMI的方法。我们参考了AMI BIOS的设计白皮书《USB Support for AMIBIOS8》,里面有这样的一段叙述。

       “2.5.4 60/64端口模拟(emulation)

        该选项可以开启或者关闭60h/64h端口的陷阱功能。60h/64h端口陷阱允许BIOS为USB键盘和鼠标提供基于PS/2的完全支持,在Microsoft Windows NT操作系统和支持多语言键盘上尤为有用。该选项还为USB键盘提供了诸如键盘锁定,密码设置和扫描码选择等各项PS/2键盘的功能。”

        该机制由硬件系统来完成,所以我们还要查看一下具体的硬件配置情况。好在Intel和AMD的CPU中都有I/O陷阱的相关机制。AMD开发手册《BIOS and Kernel's Developer's Guide for AMD Athlon 64 and AMD Opteron Processors》中的“SMM I/O Trap and I/O Restart”一节,和Intel手册《Intel IA-32 Architecture Software Developer's Manual》中的“I/O State Implementation and I/O INSTRUCTION RESTART”一节对该机制都有详细的介绍。

        I/O陷阱机制允许陷入SMI后,在SMI处理程序内部使用IN和OUT指令来访问系统的任意I/O端口。之所以设计该机制的目的是为了在断电时,通过I/O端口来开启(power on)某些设备。除此之外,I/O陷阱当然也可以用于在SMI句柄中模拟60h/64h的键盘端口。在某种程度上说,它和上述的调试陷阱机制有些类似,用陷阱捕获对I/O端口的访问,但是并非调用OS内核的调试陷阱处理句柄,而是产生一个SMI中断,让CPU进入SMM模式,执行I/O陷阱的SMI处理函数。

        当处理器陷入I/O指令,进入SMM模式时,它会将I/O指令陷入时的所有信息保存在SMM存储状态映射区(Saved State Map)的I/O状态域(I/O State Field)中,位于SMBASE+0x8000+0x7FA4的位置。图4是该区域的数据分布情况,待会儿我们的记录程序将会用到。

       -设置了IO_SMI (bit 0),表示当前是一个I/O陷阱SMI。

       - I/O 长度标志(bits [1:3])表示 I/O访问是byte(001b)、word(010b)或dword(100b)三者之一。

       - I/O Type标志(bits [4:7])表示I/O指令的类型,IN imm(1001b),IN DX(0001b)等。

       - I/O 端口(bits [16:31]),包含了当前访问的I/O端口号。

        如果当前是通过IN DX指令,字节宽度来访问0x60端口, IO_SMI置位,SMM keylogger首先需要检测和更新SMM存储状态映射区中的EAX域,然后还要检测0x7FA4处的I/O状态域的值是否为0x00600013。

       mov esi, SMBASE

       mov ecx, dword ptr fs:[esi + 0xFFA4]

       cmp ecx, 0x00600013

       jnz _not_io_smi

        上述是检测的简化形式,SMM keylogger还需要检测I/O状态域中I/OType和I/O Length等其他标志。因为我们是记录键盘的目的,所以只关心I/O陷阱,并不用理会I/O重启(I/O Restart)的相关设置。I/O重启和I/O陷阱构成了完整的SMI I/O处理方式,当SMM中的SMI执行完毕时,I/O重启允许IN或OUT指令从SMI中断处恢复并继续执行。

        I/O陷阱机制允许我们在任意I/O端口的软硬件交互读写操作时陷入SMI的处理例程,现在关心的只是0x60数据端口,实现键盘击键时的I/O陷入的具体步骤如下:

       1. 击键事件发生时,键盘控制器产生一个硬件中断,用I/O APIC将IRQ 1中断信号导向SMI的处理句柄。

       2. 收到键盘中断之后,APIC调用IDT中的键盘中断处理程序,对PS/2键盘是0x93号中断向量。

       3. 键盘中断处理程序通过端口0x60从键盘控制器的缓冲区中读取按键扫描码。正常情况下将清空扫描码,并将其显示在屏幕上。

       4. 此时芯片组引起端口0x60的读取陷阱,产生信号通知I/O陷阱SMI。

       5. 在SMM模式下,keylogger的SMI处理句柄响应SMI中断,处理I/O陷阱SMI。

       6. 退出SMM时,keylogger的SMI处理句柄将结果(当前扫描码)返回给0x60端口的读取指令,交由内核的中断句柄作进一步处理。

       上述的第6步操作,将扫描码返回到OS的键盘中断处理程序,在I/O陷阱和I/O APIC下的实现是有区别的。如果使用了APIC来触发SMI,SMI keylogger必须再次向键盘控制器的缓冲区中填充扫描码,以待操作系统再次读取,做进一步处理。

        I/O陷阱下则是采用另外的方法。OS键盘中断处理程序使用的“IN al, 0x60”指令会引起SMM keylogger的I/O陷入,由于该IN指令产生了无穷的SMI陷入循环,将永远无法从SMM中恢复到原来的状态继续执行。此时,SMI句柄只要将IN指令的读取结果保存到AL/AX/EAX寄存器,表现得就像IN指令从来没有陷入过一样。

        IA32体系,EAX寄存器位于SMRAM存储状态区偏移为0x7FD0的位置,即 SMBASE +0x8000+0x7FD0,在IA64下为SMBASE + 0x8000+0x7F5C。因此当上述的IO_SMI置位时,SMM keylogger需要将从0x60端口读取的扫描码更新至EAX域,下面就是更新EAX域的代码片段:

       ; 1.验证读取0x60端口时设置的IO_SMI位

       ; 2.更新SMM存储状态区的EAX域(SMBASE + 0x8000 + 0x7FD0)

       mov esi, SMBASE

       mov ecx, dword ptr fs:[esi + 0xFFA4]

       cmp ecx, 0x00600013

       jnz _not_io_smi

       mov byte ptr fs:[esi + 0xFFD0], al

       3.5 多处理器下的keylogger说明

        我们的keylogger已经更新了系统SMRAM存储状态映射区中的EAX(RAX)寄存器,要是碰到了多处理器系统那又该怎么办呢?当多个逻辑处理器同时进入SMM模式时,它们在SMRAM中都要有自己的SMM存储状态映射区,这将由BIOS为每个处理器分配不同的SMRAM 基地址(SMBASE)来妥善解决,因此该项技术也被称为“SMBASE重定向”。

        例如在双处理器系统中,两个逻辑处理器分别具有不同的SMBASE,SMBASE0和SMBASE0+0x300;第一个处理器的SMI处理句柄将从EIP = SMBASE0+0x8000处开始执行,而第二个则从EIP = SMBASE0+0x8000+0x300的地方开始;同理,它们各自的存储状态映射区也就分别位于(SMBASE0+0x8000+0x7F00)和(SMBASE0+0x8000+0x7F00+0x300)。

        不只是0x300,BIOS也会为额外的处理器设置其他的SMBASE增量偏移。增量偏移虽然可变,但是其计算过程也不算复杂。在SMM存储状态映射区内部0x7EFC偏移处包含了一个SMM修正ID(Revision ID),对每个处理器来说都是同样的数值。例如SMM的修正ID可能为0x30100,在SMRAM中找到各处理器的修正ID,计算它们之间的差值也就得到了各SMBASE间的相对位移。

        下面我们展示的是SMM keylogger在双处理器系统上的EAX更新代码。它将顺次检查I/O状态域是否和某个处理器的I/O陷阱匹配,确定的话则更新其SMM存储状态映射区中的EAX值。

       ; 在双处理器系统上更新EAX

       mov esi, SMBASE

       lea ecx, dword ptr [esi + SMM_MAP_IO_STATE_INFO]

       cmp ecx, IOSMI_IN_60_BYTE

       jne _skip_proc0:

       mov byte ptr [esi + SMM_MAP_EAX], al

       _skip_proc0:

       lea ecx, dword ptr [esi + SMM_MAP_IO_STATE_INFO + 0x300]

       cmp ecx, IOSMI_IN_60_BYTE

       jne _skip_proc1:

       mov byte ptr [esi + SMM_MAP_EAX + 0x300], al

       _skip_proc1:

       …

       4 建议的检测方法

       4.1 I/O陷阱机制检测

       4.2 计时(timing)检测

        BIOS厂家

       目前主要有2家BIOS厂家,分别是Phoenix-Award和AMI。

BIOS类型

       主板检测卡代码是由BIOS的类型决定的。

代码相同

       只要主板使用Phoenix-Award的BIOS,那它们的代码都是相同的,而AMI也是一样的。

主板牌子无关

       所以主板的检测卡代码跟主板牌子没有关系,同一个牌子的主板,具体型号不一样,有可能使用不同厂家的BIOS,代码就不一样了。

       好了,今天关于“ami bios 代码”的话题就讲到这里了。希望大家能够通过我的介绍对“ami bios 代码”有更全面的认识,并且能够在今后的实践中更好地运用所学知识。如果您有任何问题或需要进一步的信息,请随时告诉我。