我的本本(DELL INSPRION 6400 )几个月前电池就故障了,还能用,不过不能正确地向系统报告电池在线和容量,最近想把A14版本的BIOS升级到A17版本,结果发现DELL提供的BIOS升级程序需要笔记本同时联接电源适配器和电池,这本意是为了安全设计,防止用户在升级BIOS过程中断电而损坏机器,但是对于我这样的过保用户来说,为了升级BIOS而买一个新电池实在是有点让人难以接受,而且原来的电池还是能顶一会的嘛。
于是想了个办法,让升级程序跳过电池检测而认为系统内有电池而顺利升级:
首先开启IDA来(反编译工具及调试工具),加载了BIOS的升级程序MM061A17.EXE进来反汇编。
然后找到了弹出提示的地方:
.data:004316B0 ; char aTheAcAdapterAn[]
.data:004316B0 aTheAcAdapterAn db 'The AC adapter and battery must be plugged in before the sys'
.data:004316B0 ; DATA XREF: sub_420D0A+32o
.data:004316B0 db 'tem BIOS can be flashed.',0Dh,0Ah
.data:004316B0 db 0Dh,0Ah
.data:004316B0 db 'Press OK when they are both plugged in or CANCEL to quit.',0
.data:00431742 align 4
然后找到调用这段字符串的代码,原来是一个MessageBoxA的API调用,向前找就找到了如下的代码:
.text:00420D26 loc_420D26: ; CODE XREF: sub_420D0A+58j
.text:00420D26 call sub_4213EB
.text:00420D2B test eax, eax
.text:00420D2D mov [esp+18h+var_8], eax
.text:00420D31 jz short loc_420D6E
.text:00420D33 cmp dword ptr word_433C40, 0
.text:00420D3A jnz short loc_420D64
.text:00420D3C push offset aTheAcAdapterAn ; "The AC adapter and battery must be plug"...
.text:00420D41 push esi ; LPSTR
.text:00420D42 call edi ; wsprintfA
.text:00420D44 cmp [esp+20h+var_8], 3
.text:00420D49 pop ecx
.text:00420D4A pop ecx
这里有一个call sub_4213EB的子程序调用,我在这里下了断点,然后开始调试运行。
程序运行到这里停下来后,按下F7键Step Into跟踪进入了子程序。随后发现这个子程序内调用了GetSystemPowerStatus的Win32 API,很明显,它要去查询系统电源状态。
一路按F8键跟入到这里时:
.text:00421404 loc_421404: ; CODE XREF: sub_4213EB+13j
.text:00421404 cmp [ebp+SystemPowerStatus.BatteryFlag], 80h
.text:00421408 jz short loc_421424
.text:0042140A cmp [ebp+SystemPowerStatus.BatteryFlag], 0FFh
.text:0042140E jz short loc_421424
.text:00421410 cmp [ebp+SystemPowerStatus.BatteryLifePercent], 0Ah
.text:00421414 jbe short loc_421420
.text:00421416 cmp [ebp+SystemPowerStatus.BatteryLifePercent], 0FFh
.text:0042141A jz short loc_421420
.text:0042141C xor eax, eax
.text:0042141E leave
.text:0042141F retn
嗯,原来是检查电池的在线状态和电量,直接把在xor eax,eax这一行设为当前运行地址,让它认为以上检查都通过了。
再次按下F9,呵呵,升级提升的对话框出来了,它已经不再去检查电池的状态了,确定升级、确定重启、自动更新BIOS、再次重启,已经是A17版本的BIOS啦。