戴尔XPS 15 L502X BIOS更新破解记
2023年8月20日 • Robin Chan
👋,我有一台老旧的戴尔L502X(XPS 15),纯粹是为了怀旧。这台笔记本是我在2011年左右买的,当时作为主力工作机。如今,它的黄金时代早已过去。USB和HDMI接口已经失灵,显卡也烧坏了,除非在设备管理器中禁用,否则会导致蓝屏。电池完全报废,外壳也裂了,还多了几处凹陷,厚度约3英寸,重量4公斤,真是“轻便”得很。
不过!它的扬声器效果很棒——JBL低音炮可能是我在笔记本上听过的最好的声音,而且它的配置还算不错——i7处理器(虽然是第二代)加上SSD,紧急情况下还能凑合用。
我把它从角落里翻出来,打算作为2015款Macbook的备用机。我重新安装了Windows 10,并从戴尔支持网站下载了驱动程序。令人难以置信的是,居然有一个2020年的BIOS更新——这机器在2014年左右就已经停产了。
第一次尝试
我立刻下载了更新并运行,结果立马遇到了这个错误:
真是“棒极了”。点击“确定”后,这个对话框会一直弹出来,直到电池电量超过10%。我可不想为这台老古董订购新电池,它现在就是个玩具。
不过,Windows似乎认为我的电池状态良好。看起来像是8位电池管理系统(BMS)出了大问题,显示电量255%,控制面板里却显示100%,系统托盘里的电池图标却是空的。真有意思。
于是,我打开了Ghidra(一款逆向工程工具),首先搜索了错误信息中的字符串。
在地址0x043c0d8找到这个字符串后,我开始查看它的引用,发现有一个引用来自函数0x0402120,偏移量为0x04036a4。
这让我找到了这段代码——注意那个do-while循环和“case 3:”,我们正处在一个switch语句中,而这里就是我被卡住的地方。我可能只需要修改这个循环代码,问题就能解决。
我还注意到其他与电源管理相关的检查,如果能绕过这些检查就更好了。
在这个子程序中继续滚动查看,我找到了一个case,似乎是当一切正常时执行的,它会为BIOS刷写做准备。这正是我们需要的地方。
快速查看switch语句的比较部分,我发现可以直接修改这个变量,让它总是跳到case 6,这样就能直接进入BIOS刷写过程,跳过那些烦人的检查。
将这段代码:
MOV EAX, dword ptr [EBP + local_d00]
AND EAX, 0x7
修改为:
MOV EAX, 0x7
AND EAX, 0x7
因为0x7 & 0x7 = 0x7,然后减去1,应该会让我们跳到case 6,开始刷写BIOS。
第二次尝试
修改后的二进制文件导出后,我祈祷自己没有把这台4公斤的笔记本变成一块砖头。
成功了!这是BIOS更新完成后笔记本的照片。可以确定的是,这台机器以后应该不会再有什么BIOS更新了。不过整个过程还是挺有趣的。