BIOS首跳导致内存空

逆向工程 艾达 x86 固件 固件分析 BIOS
2021-07-04 18:42:48

我正在尝试反转工业 PC 的 BIOS 以修复它。该设备基于 ETX 外形的主板,不起眼的意大利 SECO M671,与旧的控创 PM-15(C) 非常相似,但具有定制的 OEM BIOS。即,英特尔赛扬 M(移动 = Dothan 系列)处理器 + 82855 北桥 + 82801 (ICH4) 南桥。BIOS 存储在英特尔固件集线器兼容的闪存芯片 (sst49lf004b) 上,该芯片连接到 LPC 总线。

主板开始拒绝使用 POST 序列 d0、00、d1、d2 进行 POST(空白屏幕,什么也没有发生)。我不知道为什么会有 00h 代码(这通常意味着控制权交给了操作系统),我试图忽略它。d0, d1, d2 模式对应于 AMIBIOS8,我想,(是的,没有人记得 bios 制造商)并且意味着错误的引导块校验和。

然后我用并行编程器转储了闪存芯片的内容。但结果证明它们很好,完全等于备份文件(考虑到一些偏移量差异)!实际上,除了一件事:闪存芯片包含(远离“主”代码部分)第二个 VGA BIOS 模块,我在备份中没有找到。但我想它不会受到太大的伤害,并且可能存在一些可选功能。

所以要么是闪存芯片内的 LPC 控制器坏了(因为编程接口是并行的,这仍然是可能的),要么我误解了 POSTcodes。此外,我将我的备份文件与一些 AMI 更新文件进行了比较,但没有发现相似之处。所以似乎 BIOS 反转和理解 D2 现在是我唯一的选择。可能一旦我正确地反汇编了它,我只需要立即搜索 0xd2-s 并找到正确的一个)。

我已将闪存芯片映像加载到 IDA 中,查找芯片组数据表(顺便说一句,我发现关于 BIOS 内存映射的主题非常不清楚)并相应地更正了闪存芯片地址,即将 BIOS ROM 的上 128K 复制到 0xE0000 到 0xFFFFF 16 -位分析部分,并且还复制了适合高 BIOS 区域 FFE0_0000h-FFFF_FFFFh 的所有内容(32 位分析部分,因为是 32 位地址)。然后从 0xFFFF0(x86 复位向量,16 位实模式)开始分析。处理器设置是 P6(据我所知 Dothan 系列是基于 P6 arch)这就是我得到的(注意 F7A1 和红色指针都导致内存未映射到 BIOS ROM,至少到目前为止正如我从数据表中可以看出的那样): IDA拆解

显然,对执行的前 16 个字节进行 32 位分析(在 FFFF_FFF0 处)也没有任何意义,因为处理器以实模式启动。

键盘控制器访问(首先检查它是否忙,然后启用 A20 - 标准 x86 东西)告诉我我可能对重置向量内存映射是正确的。

但是为什么会跳转到一些空的位置呢?我究竟做错了什么?闪存芯片镜像和备份文件:https : //drive.google.com/drive/folders/1MwpiqiRK3N9ZBajyiOUuZde522236gmq?usp=sharing


编辑:红色的指针实际上指向一个映射到 BIOS ROM 的位置,我的错。这是控制跳转的地方: IDA反汇编2 我们找到了 POSTcode D0,太好了。但是这里所有的跳转都会导致一些低地址,这些地址没有映射到 BIOS ROM。同样的问题重复出现。

2个回答

您需要在线性地址 0xF0000 (0xF000:0000) 处加载 ROM 的最后 64KB,并在那里创建一个以 0xF000 为基址的 16 位段。然后你所有的“低地址”将排列起来(它们指向当前的段,CS=0xF000)。

如果您获得对 E000 的引用,请加载第二个 64KB 块,依此类推。

一旦您使用 32 位代码,它可能会使用 32 位寻址,ROM 的末尾位于 FFFFFFFF,因此相应地加载和创建 32 位段。

您的反汇编没有显示足够的内存来知道目标是否为空内存,但 x86 分段模型意味着 0xF000:E205 的跳转目标是 0xFE205(即 (0xF000 << 4) + 0xE205)。默认情况下,IDA 不会以明显的方式显示这一点。