2010年2月

用动态法修改BIOS,为了保证MINIT、HTINIT、1PE32、1PE32B、2PE32、2PE32B各个模块在BIOS中位置不变,我们经常用模块修补的方法,但过程有些繁琐,现在向大家提供一种可行的AWARD BIOS模块合并的方法。
通过前面的AWARD BIOS 压缩模块分析,我们很容易就能修改模块的大小,修改校验码。
3edd751ex7f9da3da9fe6&690.png
首先我们用CBROM查找BIOS中模块容量最小且在这些需要修正入口地址的模块之前,大小在374-1024B,如EPA模块就基本能符合我们的要求。
接下来把我们找到的理想合并模块完整的保存成一个文件,从BIOS中把此模块剪切掉,此时BIOS容量变小;查找BIOS最后一个模块的尾部把保存的文件进行写入,查找ACPITBL.BIN模块的尾部把保存的文件进行粘贴,此时BIOS容量恢复。把粘贴进来的这个模块填充“FF”
最后把ACPITBL的模块长度+保存下来的模块长度修正到ACPITBL模块中并修正校验码,到此模块合并完毕,还差最后一步计算主模块到(BIOS容量-10003H)的checksum16填入(BIOS容量-10002H),切记必须修正BIOS的头部信息,不然刷完直接进不了BIOS也进不了系统,此头部信息可以通过CBROM加入ACPITBL.BIN后获得。用AWARD SLIC MOD v1.29特别版,把事先修改完成的MAIN_MOD.BIN和ACPI_MOD.BIN放于目录下,选择动态法,就能完美修改咯

3edd751ex7f9da3da9fe6.png
模块大小:000258D

未压缩实际大小:0000583C

Checksum16: 填写阴影部分的Checksum8

压缩>0: 不压缩的模块为0

模块结束:模块结束标志为“00”或者“FF”,一个模块的结束链接着另一个模块的开始;本例里中ACPITBL.BIN模块的起始点为标记的“24”

最近帮网友搞一台联想家悦机子的MARK,老提示写保护,用过了许多的方法都不行,百般无奈只能对1B模块入手进行修改。

据网友说:机子本来是预装VISTA的,有SLIC 2.0,后来想升级到2.1,按照论坛里的方法都试过了好几遍,不但没成功反而把原来的2.0搞没了,刷回原备份的BIOS一样没SLIC 2.0,只是一张LENOVOTC-03的空表,真是郁闷。

于是我就开始探索着去分析各种失败的原因,历经波折MARK还是失败。于是不得不对1B模块进行改造,因为1B模块里就已经有SLIC的信息了,只是这个SLIC信息不完整,只是个空壳,还需要MARK区域的数据来填充,既然MARK区域是写不进去了,那就移除掉从MARK区域来填充SLIC的操作。
把ACPITBL从1B模块分离出来,分析
3edd751ex7f4db9e2e6f4.jpg
3edd751ex7f4dbb17e940.jpg
可以看出SLIC表起始地址处于0440,就搜索HEX:4004,查找对SLIC的一些操作,发现了两处对SLIC的操作,如下

;清空SLIC

0001C3ED: EB0C                        jmps       00001C3FB  --- (1)
0001C3EF: 687758                      push       05877 ;'Xw'
0001C3F2: 07                          pop        es
0001C3F3: BF4004                      mov        di,00440 ;'@'
0001C3F6: 0E                          push       cs
0001C3F7: E80600                      call       00001C400  --- (2)
0001C3FA: F9                          stc
0001C3FB: 1F                          pop        ds
0001C3FC: 07                          pop        es
0001C3FD: 6661                        popad
0001C3FF: CB                          retf
0001C400: 6651                        push       ecx
0001C402: 50                          push       ax
0001C403: 6657                        push       edi
0001C405: B000                        mov        al,0
0001C407: 66B976010000                mov        ecx,000000176 ;'  v'
0001C40D: AA                          stosb
0001C40E: E2FD                        loop       00001C40D  --- (3)
0001C410: 665F                        pop        edi
0001C412: 58                          pop        ax
0001C413: 6659                        pop        ecx
0001C415: CB                          retf

 

;填充SLIC

0001C458: 665E                        pop        esi
0001C45A: 1F                          pop        ds
0001C45B: 06                          push       es
0001C45C: 1F                          pop        ds
0001C45D: 33F6                        xor        si,si
0001C45F: 687758                      push       05877 ;'Xw'
0001C462: 07                          pop        es
0001C463: BF4004                      mov        di,00440 ;'@'
0001C466: 83C724                      add        di,00024 ;'$'
0001C469: 66B952010000                mov        ecx,000000152 ;'  R'
0001C46F: FC                          cld
0001C470: F3A4                        repe       movsb
0001C472: 1F                          pop        ds
0001C473: 07                          pop        es
0001C474: 6661                        popad
0001C476: CB                          retf
 

问题就是在这两处,即便你把1B模块的SLIC补充完整了,但是一个清空SLIC和一个填充SLIC操作,就把你补充完整的SLIC给抹杀了,移除这两处对SLIC的操作,不就可以使填充的SLIC信息保全了吗?

具体修改

0001C40D: 90                          nop
0001C40E: 90                          nop
0001C40F: 90                          nop

0001C46F: 90                          nop
0001C470: 90                          nop
0001C471: 90                          nop

再把SLIC信息填充完整,用MMTOOL把1B压缩回BIOS就OK了,从此摆脱MARK区域的数据限制。