E420s BIOS 无线网卡白名单限制的分析与破解

获取信息:

原装无线网卡 PCI VID=10EC DID=8176 SUBSYS=819510EC。

我买的新无线网卡是 Atheros AR9287,其 PCI VID=168C DID=002E SUBSYS=30A4168C。

将其插入笔记本,然后开机,得到如下错误提示:

1802: Unauthorized network card is pluggedin - Power off and remove the miniPCI network card (168C/002E/168C/30A4).

System is halted

解包 BIOS:

此版本的 BIOS 文件可直接刷进 BIOS 芯片,未压缩,前 4M 为有效数据,后 260K 不知道有什么作用,但不能去掉。

运行 BIOS[8juj12us].exe,将数据解压到任意位置

使用 PhoenixTool 2.51 打开 <BIOS 文件夹>\8JET44WW\$0A8J000.FL1,等待解压完成。

查找白名单:

对 DUMP 文件夹下的文件进行二进制数据查找,查找内容就是原装无线网卡的 PCI VID DID。

然后找到了两个文件:

79E0EDD7-9D1D-4F41-AE1A-F896169E5216_1549.ROM

A4F2909C-5E2A-438A-91BA-272B0923049A_2173.ROM

发现只有 79E0EDD7-9D1D-4F41-AE1A-F896169E5216_1549.ROM 包含了完整的 PCI VID DID SUBSYS 信息,也就确定这个文件包含白名单。

白名单1

分析文件:

根据对此文件的格式分析,以及 BIOS 的界面内容可知,此 BIOS 为 EFI BIOS,此白名单文件实际上是一个 EFI 模块,为 64 位的 PE+ 格式,可以使用 IDA 进行分析。

使用 IDA 打开此文件,定位到偏移 270h,可以看到,此数据被 sub_B00 这个过程引用了:

1

定位到 sub_B00,但发现由于此模块是可重定位(Relocatable)的,大部分函数都是通过相对寻址的方式进行调用的,分析难度较大(-_-||),只能另辟蹊径。

查看字符串,可以看到之前获取的错误信息:
2

这些数据都在 sub_9EC 里被引用。除了上面那串文本,下面的 %04x/%04x/%04x/%04x 让我立即联想到了 C 语言的 sprintf 函数。

之前错误信息里的 168C/002E/168C/30A4 直接匹配 %04x/%04x/%04x/%04x 这个格式。这也就确定了 sub_9EC 是一个很重要的过程。

查看 sub_9EC 过程:
5

可以看到,有一个跳转 jl loc_AEF 直接跳过了所有的输出操作,到达过程末尾。

jl loc_AEF 前的判断指令为:

xor edi, edi

cmp rax, rdi

相当于

rdi = 0

if (rax < rdi) goto loc_AEF

即判断 rax 是否小于 0

先将此 jl loc_AEF 修改为 jmp loc_AEF 让其强行跳过错误输出。

转到 sub_9EC 被调用的地方:
6

可以看到 call sub_9EC 后还有一个条件跳转指令 jns short loc_D22。此指令的判断条件相当于:

if (rax >= 0) goto loc_D22

向下看,发现无论如何代码都会执行到 loc_D22 处,那么干脆把这个跳转也改成 jmp。

分析发现 sub_9EC 只在 sub_B00 中被调用,那么也就只用修改上述的那两处了。

保存修改,重建 BIOS,得到 $0A8J000_SLIC.FL1。

测试:

将 $0A8J000_SLIC.FL1 刷入 BIOS。

将新无线网卡插入笔记本,开机,一切顺利:

8

发表评论

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