关于解锁Insyde BIOS的思路

当没有Setup Menu Insyde Full Show这个菜单的时候要解锁BIOS高级选项该怎么办?没有实践过,但这个思路大概没啥毛病。

1、总体原理

Universal IFR Extractor反编译出SetupUtility的内容Section_PE32_image_SetupUtility_SetupUtility IFR.txt,查看有类似这样的表述

0x181BB1 		Suppress If {0A 82}
0x181BB3 			QuestionId: 0x1C91 equals value 0x0 {12 06 91 1C 00 00}
0x181BB9 			Ref: Clevo SHOW SETUP ITEM Settings, VarStoreInfo (VarOffset/VarName): 0xFFFF, VarStore: 0x0, QuestionId: 0x1, FormId: 0x601 {0F 0F 7B 09 02 00 01 00 00 00 FF FF 00 01 06}
0x181BC8 		End If {29 02}

Suppress if :不显示

 QuestionId: 0x1C91 equals value 0x0 :当某个叫0x1c91的变量等于0时不显示,1206911C0000为其二进制表示,

不显示的菜单是Clevo SHOW SETUP ITEM Settings

故可将0x0改成其他值使条件不满足即可显示,即将1206911C0000修改为1206911C00FF即可。

SetupUtility位于BIOS的一个使用LZMA压缩算法的区域,需要先解压缩出来,然后修改,再压缩回去,然后比对不同的地方,将不同地方写入到BIOS提取BIOS内,然后修正字节数和校验码。

修改后的BIOS要想用fpt命令刷回去,需要修改BIOS LOCK和Flash Protection Range Registers (FPRR)变量来解除保护。

2、实现方式

用UEFItool解压缩出SetupUtility所在的压缩区,得到Section_GUID_defined_LzmaCustomDecompressGuid_20BC8AC9-94D1-4208-AB28-5D673FD73486_body_uncompressed.bin

用winhex软件打开这个bin文件,替换1206911C0000为1206911C00FF

然后保存,然后压缩回去,

压缩软件:

GitHub - tianocore/edk2-BaseTools-win32: git-svn mirror of https://svn.code.sf.net/p/edk2-toolbinaries/code/trunk/Win32

找到其中的LzmaCompress.exe,命令执行

 .\LzmaCompress.exe -e .\Section_GUID_defined_LzmaCustomDecompressGuid_20BC8AC9-94D1-4208-AB28-5D673FD73486_body_uncompressed.bin -o .\Section_GUID_defined_LzmaCustomDecompressGuid_20BC8AC9-94D1-4208-AB28-5D673FD73486_body_uncompressed.Lzma

得到压缩后的文件Section_GUID_defined_LzmaCustomDecompressGuid_20BC8AC9-94D1-4208-AB28-5D673FD73486_body_uncompressed.Lzma,

仍然用UEFITool导出LzmaCustomDecompressGuid,这次不是解压缩,主要用于对比不同之处

得到Section_GUID_defined_LzmaCustomDecompressGuid_20BC8AC9-94D1-4208-AB28-5D673FD73486_body.bin文件

然后使用winhex打开这个文件和之前修改后压缩的文件,选中同步和比较

然后选择比较,将不同点存到桌面

可以看到从地址388FE9开始不同,然后跳转到这个地址

先将修改掉的地方拷贝出来,定义选块,地址从第一个不同点到最后一个,388FE9-39D425,然后以16进制复制,然后新建一个空文件,大小比这个地址差0x1443C Byte大一点,填充为FF,比如84kB的空文件,将不同点复制进去。但也不要太大,待会要把这个文件全拷贝到整个BIOS文件里,本来LzmaCustomDecompressGuid后面空白区有限,太大会覆盖后面有用的数据,那就完了。

接下来用winhex打开提取的原BIOS文件,搜索不同点前面一段数据A7185F77A6CD8785FE

找到后选中第一不同点,83的8字,然后全选之前保存不同点的新建的文件中的内容,以16进制复制,然后切换回BIOS的83位置,编辑->剪贴板数据->写入,然后保存。这里修改后的数据还需要借助UEFITOOL进行修正。

UEFITOOL打开可以看到LzmaCustomDecompressGuid不是折叠的,因为数据有错误需要修正因为大小被改变了,而原来文件中记录的是原来的大小,所以需要修改大小。新的大小是之前选中的末尾的地址39D425+1+Header Size 18h=39D43E,选中LzmaCustomDecompressGuid,右键hex view,如图,23 D4 39 是39D423的小端存储格式,选中23 D4 39 02 98 58 4E然后ctrl+c复制,

然后到winhex中打开BIOS,搜索23D4390298584E,然后将其修改为正确的值,即23改为3E,

现在的大小比原来大0x3E-0x23=1B,LzmaCustomDecompressGuid上级的目录20BC8AC9-94D1-4208-AB28-5D673FD73486大小也需要修改,原大小0x39D43B+1B=现大小39D456,赶超winhex中修改值的上方去查看68 AA 0B 00 3B D4 39这个16进制值,将3B修改成56,

修改大小后校验和会改变,需要UEFITOOL来帮忙计算,UEFItool重新打开修改数值后的BIOS,

会提示不可用的头校验和68h,应该是4Dh,进winhex 将68修改为4D,保存。再用UEFItool载入就不报错了。也能看到LzmaCustomDecompressGuid的下级菜单了。

3、模拟验证效果H2OUVE

用H2OUVE打开修改过的BIOS,可以看到原来不显示的高级菜单能显示了

4、关于后续刷BIOS

由于BIOS的Flash芯片焊在板子上的情况下,用Flash编程器无法读取到Flash中的内容,故肯定没法写入,考虑到刷写BIOS可能会变砖的风险,但没有救砖手段,故没有刷写BIOS,用setup_var修改BIOS lock变量和Flash Protection Range Registers变量也没有继续了。只能留待有条件拆焊Flash读写的同学验证该方法的可行性了。

5、不用fpt刷的方法

重新封装BIOS:https://blog.csdn.net/zhutuizhi/article/details/141787782

不过也是没有验证过的方法。 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值