无电池的情况下,如何升级DELL INSPIRON 6400的bios

来源:互联网 发布:京东和淘宝买吉他 编辑:程序博客网 时间:2024/06/18 10:56

在果之郎喜冻博文中写了与我遇到相同的情况——无电池的情况下,如何升级DELL INSPIRON 6400的bios,我原来的是A5,要升级到A17,但我手头刚好有一USB软驱,所以接用软驱启动,在DOS下运行MM061A17.EXE --forceit 来完成升能工作的,这样对于有USB软驱的人来说,升能就比较简单了,同样如果有人会做U盘启动的,当然也可以同过U盘启动来完成这项工作了。下面是果之郎喜冻用

IDA调试的方式,跳过电池检测来完成升级的方法:

有电池升级DELL INSPIRON 6400笔记本的BIOS

我的本本(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啦。
原创粉丝点击