分类 BIOS_MOD 下的文章

AWARD ACPITBL 动态法已经研究透了,换研究AMI动态法,由于AMIBIOS主模块1B模块映射到内存是离散的,所以修改的代码最好不要乱跳转,否则极易出现一些无法预知的情况。

1、还是采用XSDT前移、SLIC随后的方法。由于空间限制,所以只能把SLIC加到RSDT里,RSDT长度增加4,即为0X28+0X4=0X2C;接下来就要修正XSDT相关的操作
3edd751ex8c4a7b83eba1.jpg
2、修正XSDT在 RSD PTR的指针,0X100改为0X3C
3edd751ex8c4a7d6c2d3e.jpg
3、修正FACP(相对RSDT 0X200)在XSDT的地址,0X124改为0X3C+0X24=0X60
3edd751ex8c4a7bdf88ff.jpg
4、修正XSDT校验,0X100改为0X3C
3edd751ex8c4a7c68d5f0.jpg
5、修正XSDT增加子表地址,把0X104改为0X40、0X100改为0X3C
3edd751ex8c4a7ca5cb92.jpg
6、以上的步骤完成了XSDT的修正,接下来就是想方设法把SLIC加到RSDT、XSDT中,可以考虑移除一些表的校验如OEMB,换成手工校验
3edd751ex8c4ac8b89afa.jpg
增加SLIC添加代码,移除OEMB的校验代码
3edd751ex8c4a7a715150.jpg
如果空间允许,甚至可以调用RSDT/XSDT增加子表的方法,直接在RSDT和XDST里增加SLIC引用

用动态法修改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区域的数据限制。

This is only to introduce how to modify and checksum on the gma950 vbios.
you can learn the way then cross reference to your vbios, in order to modify right parameter make machine do well.
fllow me to modify gma950 vbios
3edd751ex7e1f345af594&690.jpg
custom the display IO
3edd751ex7e1f3503362a&690.jpg
custom the FPS,the parameter more little more capability
3edd751ex7e1f358c9bcc&690.jpg
custom the display device work in 3:4(0x33 ) or 16:10 (0x73)
3edd751ex7e1f35d8e6ea&690.jpg
this is the checksum,if the checksum is wrong,it will not work any more,on some machine this error maybe deadliness.

checksum: original vbios equal to modified vbios
original:0x01 + 0x01 + 0x4A + 0x33 + 0x00 = 7F
modified:0x13 + 0x09 + 0x48 + 0x73 + 0x? = 7F

?= 007F -(13 +09 +48 +73) = A8(low)