获取信息:
原装无线网卡 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 信息,也就确定这个文件包含白名单。
分析文件:
根据对此文件的格式分析,以及 BIOS 的界面内容可知,此 BIOS 为 EFI BIOS,此白名单文件实际上是一个 EFI 模块,为 64 位的 PE+ 格式,可以使用 IDA 进行分析。
使用 IDA 打开此文件,定位到偏移 270h,可以看到,此数据被 sub_B00 这个过程引用了:
定位到 sub_B00,但发现由于此模块是可重定位(Relocatable)的,大部分函数都是通过相对寻址的方式进行调用的,分析难度较大(-_-||),只能另辟蹊径。
这些数据都在 sub_9EC 里被引用。除了上面那串文本,下面的 %04x/%04x/%04x/%04x 让我立即联想到了 C 语言的 sprintf 函数。
之前错误信息里的 168C/002E/168C/30A4 直接匹配 %04x/%04x/%04x/%04x 这个格式。这也就确定了 sub_9EC 是一个很重要的过程。
可以看到,有一个跳转 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 让其强行跳过错误输出。
可以看到 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。
将新无线网卡插入笔记本,开机,一切顺利:
大佬大佬,E420 是不是可以直接套用这个 Bios文件哇?
Hi,
Could it be possible to send me over the modded BIOS package?
I would like to flash my BIOS with one which is modded and allows adding different WiFi cards.
Thank you in advance