全部博文(685)
分类: LINUX
2014-09-15 00:07:50
我的笔记本是 ThinnkPad E420s,质量很好,被我拆机无数次,主板上有几个电容都被我摁碎了,仍然照常运行(还好是电容)。但是————一个很大的问题,就是无线网卡。
无线网卡是 Realtek RTL8188CE,150M。这个网卡在 Windows 下使用还没什么,但在 Linux 下,就极不稳定。因为驱动的关系,无线网每隔10几分钟就会断开,需要重连。这是让人非常不爽的。另外,因为路由是 300M 的,这个网卡连带宽都不能完全使用,简直是浪费。
于是乎,我就想到了更换无线网卡。由于之前研究路由器,积累了一些无线网卡芯片的信息,我决定选用和我的 300M 路由一个型号的无线网卡,其芯片是 Atheros AR9287,网卡型号是 AR5B97。
本来嘛,换网卡应该是很简单的事,但由于 ThinkPad BIOS 对网卡作了白名单限制,因此事情就变得麻烦了。这里记下来,留作参考。
何为白名单?其实就是计算机生产商为了保护自己的设备硬件不被轻易更换,而对硬件作了限制,当检测到计算机接入了不在白名单内的硬件,就阻止开机,并提示更换硬件。
那么,笔记本里的无线网卡是什么样的呢?其实是很小的一张卡:
要安装新的网卡,就必须得破解 BIOS 的白名单限制。那么 BIOS 是通过什么来判断无线网卡的型号呢?由于无线网卡是 Mini PCI-E 接口的,因此 BIOS 用来判断的肯定是 PCI 设备的 Vendor ID 和 Device ID 了。那么为了在 BIOS 程序中定位 Vendor ID 和 Device ID,需要先知道现有网卡的 VID 和 DID。
设备管理器->找到无线网卡->属性->详细信息->选择设备实例路径:
可以看到这样的信息(这里是我更换网卡之后的信息) :
PCI\VEN_168C&DEV_002E&SUBSYS_660311AD&REV_01\4&…
其中 VEN 后面的 168C 就是 VID,DEV 后的 002E 就是 DID,另外一个要记下来的是 SubSystem ID 660311AD。另外在 Linux 下使用 lspci 命令就可以看到所有 PCI 设备的信息。旧的 Realtek RTL8818CE 的信息是 VID = 10EC, DID = 8176, SubSystem ID = 819510EC。
然后是获取要更换的无线网卡的这些信息。将新的无线网卡插入笔记本,肯定没法开机,但是错误提示会有这些信息:
需要的信息都获取了,然后就是修改 BIOS 了。
话说修改 BIOS 就得刷 BIOS,这个风险很高。一旦出错就开不了机了(变成“砖机”),没有相关的工具就只能拿去返修(但我有相关的工具,所以出错了也可以自己“救砖”)。
首先是找一个现成的 BIOS 文件,这个在联想的官网上下载就行。下载后解压,得到一个 $0A8J000.FL1 文件,这就是 BIOS 文件了。
用 PhoenixTool 载入这个文件,等待解压结束:
然后用 RW Everything 保存系统的 ACPI 表:
在 PhoenixTool 中载入保存的 ACPI 表:
单击 [Advanced],进入高级选项,选中 [Allow user to modify other modules] 和 [No SLIC],然后单击 [Done] 结束:
在 PhoenixTool 上单击 [Go] 按钮,直到出现 “You can now make manual alterations to any module in the DUMP directory” 提示,此时不要单击 [OK]:
然后就需要查找包含原无线网卡 VID 和 DID 的文件,自己写了个程序进行搜索,然后发现有两个文件包含 VID 和 DID:
79E0EDD7-9D1D-4F41-AE1A-F896169E5216_1549.ROM
A4F2909C-5E2A-438A-91BA-272B0923049A_2173.ROM
首先用 WinHex 打开第一个文件,找到 VID 和 PID,可以发现这里面有很多组 VID 和 PID,包括了 Realtek、Broadcom、Intel、nVidia、华为等多个厂商的设备,看来这就是白名单了:
注意到由于 x86 架构使用 Little-Endian 字节序,因此 ID 顺序是相反的。另外一个文件只包含了 VID 和 DID 而没有包含 SubSystem ID:
那么,现在要做的就是修改一组现成的网卡信息。为了保证如果以后换回原装网卡也能正常开机,因此我选择了一组 Broadcom 的网卡信息来修改。修改完后保存。然后单击 PhoenixTool 提示框的 [OK] 以开始重建 BIOS 文件:
然后就是使用联想提供的 BIOS 更新工具中的 winflash.exe 来刷新。由于修改的 BIOS 和现在的 BIOS 版本相同,不能直接刷,必须使用命令行参数来跳过版本和日期检查:
winflash.exe /sd /sv $0A8J0000_SLIC.FL1
但是这样操作,winflash.exe 会提示失败:
查看其日志,有如下信息:
[0318/202335:INFO:utils.cpp(29)]
version=10002h HeaderSize=1000h HeaderChecksum=607ah
TotalImageSize=421000h TotalImageChecksum=de49h NumberOfImages=2
[0318/202335:INFO:utils.cpp(29)]
[0]: 180000h, 280000h Bios
[0318/202335:INFO:utils.cpp(29)]
[1]: 400000h, 20000h Ec
[0318/202335:INFO:utils.cpp(29)] imageDigest fail!
[0318/202335:INFO:utils.cpp(29)]
Fail to authenticate image!
[0318/202335:INFO:utils.cpp(29)] Fail to authenticate image!
Fail: UNSUPPORTED!
[0318/202335:INFO:utils.cpp(29)]
winflash.exe end at [2014-03-18 20:23:35].
[0318/202335:INFO:phlashdlg.cpp(567)] PFAE return 28675
看来应该是修改好后的 BIOS 文件的校验没通过,这不影响使用,但必须修改 winflash 程序让其强行通过。
以 imageDigest fail! 为关键字进行搜索,发现其在 environment.dll 中。用 OllyDbg 打开 environment.dll 然后定位:
将 je short environm.100185B1 的 je 改为 jmp;将 jnz short environm.100185CF 的 jnz 改为 jmp,保存。然后再运行 winflash 命令,就成功刷入 BIOS 了。
关机,换无线网卡,在 BIOS 里启用网卡,开机,连接路由,已经是 300M 的网络了:
体验了一下,发现网络信号增强,能搜到很多之前搜不到的信号,下载速度也变快了很多:
至此,曲折的换网卡过程就结束了。。。