无电池的情况下,如何升级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啦。
于是想了个办法,让升级程序跳过电池检测而认为系统内有电池而顺利升级:
首先开启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啦。
- 无电池的情况下,如何升级DELL INSPIRON 6400的bios
- 没有电池升级DELL INSPIRON 6400笔记本的BIOS
- 如何关闭dell inspiron n4010的内置麦克
- Dell Inspiron 6400上安装Fedora 5后配置无限网卡的步骤
- Dell Inspiron 6400上安装Fedora 5后,使声卡工作正常的方法
- DELL Inspiron one 2020 未识别的网络解决办法
- dell inspiron
- 升级我的BIOS
- Dell Inspiron 15R - QQ语音时麦克风没有声音的设置办法
- [Ubuntu]Dell Inspiron 1501显卡驱动不能使用正常分辨率的问题
- Dell Inspiron 15 5000 series 设置u盘启动(新版BIOS)
- Dell Inspiron 15 5000 series 设置u盘启动(新版BIOS)
- Dell Inspiron 15 5000 series 设置u盘启动(新版BIOS)
- Dell Inspiron 15 5000 series 设置u盘启动(新版BIOS)
- <转载>Dell Inspiron 15 5000 series 设置u盘启动(新版BIOS)
- 破解DELL BIOS开机密码,拔电池放电不好使
- windows下如何调用BIOS的函数
- 华硕升级bios的问题
- Learning Perl: 2.7. Getting User Input
- Learning Perl: 2.8. The chomp Operator
- 笔记
- C++ CFile::Rename 出现“拒绝访问”异常 及解决方案(不能说原创,自己悟出来的)
- JAVA的内省机制(introspector)与反射机制(reflection)
- 无电池的情况下,如何升级DELL INSPIRON 6400的bios
- Perl Learning: 2.9. The while Control Structure
- Perl Learning: 2.10. The undef Value
- Learning Perl: 2.11. The defined Function
- A
- CSS控制排版(转载)
- Learning Perl: 2.12. Exercises
- LINUX上安装memcached
- Java异常框架中finally执行、及其他相关问题