破解「清华同方 超越 S100」的 BIOS 密码限制

转载请注明原帖链接和作者!


手里有个小主机,型号是 清华同方 超越 S100,配置很低,Intel Atom 230 的 CPU,百兆有线,只有VGA接口,以及常规的 SATA、USB、RS232、LPT、音频。主板有 PCI 槽,然而机箱里并不支持插 PCI 卡。
配置这么低的电脑,居然还不能让人安心用。。。

第一次拿到开机时,提示 CMOS 信息无效,带电重启就不再提示,断电后再开机就会提示。看来是电池没电了,那么换一个吧。
换了电池后,这个问题是没有了,然而新的问题出现了:每次开机,BIOS都会要求输入密码,不然什么都进不去。。
经过多方查找,得知了BIOS 默认密码是 wisdom。使用密码进入 BIOS 设置后,清除密码,然后重启,然后。。WTF!?还是要密码,密码还是 wisdom。。。。
那么换个其他的密码呢,结果还是一样。
看来这破 BIOS 还有种种限制啊,那么就要想个办法去掉这个坑爹的密码限制了。

比较幸运的一点,是这个主板的 BIOS 做成了可插拔式的,DIP 的插座和 DIP 封装的 SPI Flash。
那么这就好办多了,直接上编程器就可以很方便地读写 BIOS 数据,也不怕改错数据导致主板变砖。

于是乎马上用编程器备份出 BIOS 的数据,一共 512 KB。

考虑到这个 BIOS 是 AMI 的,那么抄起 AMI 的 MMTools 来分析:

嗯,模块很多,有第一个执行的 Bootblock,有清华同方的 Logo,有微码等等。。
为了找出密码存在于哪个模块里,只得把所有的可疑的模块全部解压出来,然后用 WinHex 来查找。
最后发现 wisdom 存在于 ID 为 1B 的这个模块里(还好找到了,不然就尴尬了)。

但是看这个文件的开头,这应该不是一个 RAW 格式的可执行文件,应该是有结构的。
为了了解这个文件的结构,我在网上找了很多资料,最后发现了一位大神 Pinczakko,他对各个厂家的 BIOS 做了非常多的逆向工程:
https://sites.google.com/site/pinczakko/pinczakko-s-guide-to-ami-bios-reverse-engineering-1
也找到了他写的用于解析 1B 这个文件的工具:
https://github.com/pinczakko/AMIBIOS8_1B_Utils

使用这个程序,我成功地将 1B 这个文件分解成了 24 个部分

继续在这些文件里用 WinHex 查找 wisdom,发现它出现在 POST_CSEG 中。

在分解 1B 的输出信息中,可以知道这个文件的加载地址是物理地址 0x40000,也就是说 CS 段寄存器的值是 0x4000,IP 寄存器的值是 0x0000。
那么用 IDA 载入这个文件,以 16 位模式载入

通过 WinHex 的查找结果,可以得知 wisdom 出现在偏移量 0x87ea 处。
此时 IDA 还没有分析出代码,因此在 wisdom 字符串处还看不到交叉引用。
需要先在 IDA 中将加载的数据转换为汇编代码。

根据 https://sites.google.com/site/pinczakko/pinczakko-s-guide-to-ami-bios-reverse-engineering-1#_4_5 的介绍,
本文件内部也是分为了多个部分的,每个部分的代码和数据应该是挨着的,所以定位到 0x87ea处,反汇编其上下的代码,然后果然得到了读取这个字符串的代码

可以看到相关代码就在 wisdom 上方

至此,解决方法就很简单了:
将条件跳转指令 jz 改为jmp 这个无条件跳转指令,即可避开密码验证。
然后用 Pinczakko 的工具将 1B 重新打包,再用 MMTools 重新打包 BIOS,
最后用编程器写入 SPI Flash 芯片,开机测试,果然没有出现烦人的密码验证界面了。

 

其实观察 1B 的结构,可以发现比较有趣的事:
1B 中有个文件 RUN_CSEG,其加载地址为 0xf0000,大小为 0x10000。
稍微了解 x86 体系的人应该记得,x86 复位后,物理地址 0xf0000 - 0xfffff 会映射到 ROM,也就是 BIOS 所在的 SPI Flash 中的空间。
这段空间应该是不可写的,但是为什么 RUN_CSEG 能够被载入这片地址呢,那么肯定是因为南桥芯片上有相应的寄存器设置,可以关掉这一段映射。

RUN_CSEG 这个文件的内容,很明显是在 BIOS 加载 MBR 后,提供 BIOS 中断服务的代码。这也很容易理解,因为 x86 实模式下,低端 640KB 内存是给用户使用的,
往上是映射的显存,一些扩展的 BIOS 数据,再往上就是 BIOS ROM 映射范围了。在 MBR 阶段,MBR 需要调用 BIOS 中断来从存储设备中加载后续的 Bootloader 来运行。
那么 BIOS 中断服务代码放在哪呢?BIOS ROM 就有 512KB,而 BIOS ROM 映射范围一般是 64KB,最多 128KB,也不够装下整个 BIOS 的内容。
因此 BIOS 选择了将 BIOS 中断服务单独做成了一个模块,在 BIOS 将 CPU 控制权交到 MBR 之前,将 BIOS ROM 映射关掉,然后将 BIOS 中断服务代码放入这片区域。
这样既解决了BIOS ROM 不能完全映射的问题,也避免了 BIOS 中断服务代码占用低端内存 640KB 的用户区域。
顺带一提 RUN_CSEG 这个文件只有 56KB,大小也满足要求。

1B 中还有个文件  IVT_DSEG,它的加载地址为 0,正好是 x86 中断向量表的起始位置,那么很明显这个文件里包含的正是 BIOS 中断服务的入口地址。

 

 

另外,查了一下 coreboot 项目,发现它刚好支持这个小主机的配置 (Intel D945GCLF),编译后写入 SPI Flash,发现它确实可以正常启动。
那么以后这个小主机就变成我用来学习 x86 架构和启动的绝佳环境了,说不定还能开发出一个 BIOS 级别的 Breed 呢(笑。

破解「清华同方 超越 S100」的 BIOS 密码限制》有1个想法

  1. 记得我小升初那的时候还意外获得过一台清华同方的品牌机,478接口的商用机(阉割了AGP接口)。在修改BIOS设置的时候也是需要密码的,不过它的默认密码是 thtfpc ,不过也是能力有限,没有对这方面进行过多的研究。
    至于用途嘛...因为我没有电脑手机播放器什么的,只有电脑主机又没有显示器又喜欢听歌;考虑到硬盘噪音,就 CDLive 了 GeeXBox 拿来听歌用(x

发表评论

电子邮件地址不会被公开。 必填项已用*标注