当没有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
然后保存,然后压缩回去,
压缩软件:
找到其中的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
不过也是没有验证过的方法。