环境信息
系统信息:Windows 10 、Thankpad T430I
涉及工具:x64dbg
测试程序:g1uj49us.exe(Thankpad T430I Bios update)
安装后释放的文件,默认安装驱动的程序是WINUPTP.exe

因
最近入手了一款Thankpad T430I 笔记本,想升级到最新的Bios(2019)但因电池原因(显示255%,软件获取不到电池信息),官方的升级程序检测不到电池导致无法升级。

果
网上搜索文章有说运行的时候加入 -sp参数可跳过电池检测,但测试发现此方法不适合g1uj49us,还有说通过winflash64 BIOS文件直接升级,开始的文章未涉及BIOS文件格式,理解错误导致测试失败
我执行了如下命令:
WinFlash64 /64bit/tpnflhlp.sys

很显然运行失败了。
继续搜索相关文章,在这篇文章下得到了思路:
https://superuser.com/questions/1569417/how-to-update-lenovo-bios-on-a-t460-without-battery
On Lenovo ThinkPad X230i was enough to copy BIOS (*.FL1) and ECP (*.FL2) files to parent folder, where WinFlash64.exe is located then run cmd.exe as administrator and enter command:
> cd <path/to/WinFlash64.exe>
> WinFlash64.exe /file $01D3000.FL1
注意到,当执行WINUPTP.exe 选择Update ThinkPad BIOS

点击Next后会在当前目录释放些文件

看到了升级需要的文件
$01D2000.FL1
升级成功后的截图

逆向分析
测试结果说明,无电池也可升级成功(也没有BIOS电池),故想运行升级程序绕过这个检测
关键信息:
程序会将检测结果以弹窗的形式返回

弹窗后点击暂停

在栈找关键信息,鼠标滚轮下滑
// call调用函数的时候会将地址压入栈中,接着跳转到相关的地址,故可根据栈地址找相关的函数调用

看到了一些显示,继续寻找这个弹窗来自那里
00EFE454 003EC655 return to winuptp.003EC655 from ???

双击进入

上方call下断点

重新运行测试

运行后,弹窗

重新运行,看到有个判断执行此地址

让跳转不成立,程序异常退出
栈分析看到有几个返回,依次进入查看

0055E57C 007ED0AA return to winuptp.007ED0AA from winuptp.007EC60F

0055E598 007E30E9 return to winuptp.007E30E9 from winuptp.007ED07B

看到了OK字样
继续寻找看到了这串字符串:"AC adapter/Battery check...."
在入口点下断点(push ebp 常为函数入口点)

断下

正常,跳转执行(ZF = 1)

修改ZF值,使其不执行(ZF = 0)
// je/jz根据CMP比较结果进行跳转,若ZF=1 就会跳转

运行

已可成功升级,绕过了电池检测
备注:安全考虑,若条件允许升级的时候还是满足条件的好,避免升级出现故障。
此篇文章到此结束,有缘再见
更多【Windows 下的逆向分析-实战1】相关视频教程:www.yxfzedu.com