HSIAO-YANG CHEN 发布的文章

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)

如题所云,就是个BATCH文件

内容如下

@echo off
title "简单的静态/动态DHCP转换工具"
echo.
echo #设置环境变量
set name="本地连接"
set addr=172.0.0.100
set mask=255.255.255.0
set gateway=172.0.0.1
set dns1=202.101.103.55
set dns2=218.85.157.99

echo #判断%name%是否启用DHCP
for /F " tokens=1,2,* " %%i in ('netsh interface ip show config %name% ') do if %%i==DHCP if %%j==启用 if %%k==否 (
echo #经检测%name%的DHCP已经关闭,现将启用DHCP,请稍候。。。。。
echo #%name%的接口IP配置
echo #设自动获取IP
netsh interface ip set address name=%name% source=dhcp >NUL
echo #设自动获取DNS
netsh interface ip set dns name=%name% source=dhcp register=PRIMARY >NUL
netsh interface ip set wins name=%name% source=dhcp >NUL
) else (
echo #经检测%name%的DHCP已经启用,现将设置为静态的DHCP,请稍候。。。。。
echo #设静态IP:%addr%,子网掩码:%mask%
netsh interface ip set address name=%name% source=static addr=%addr% mask=%mask% >NUL
echo #设默认网关:%gateway%
netsh interface ip set address name=%name% gateway=%gateway% gwmetric=0 >NUL
echo #设首选DNS:%dns1%
netsh interface ip set dns name=%name% source=static addr=%dns1% register=PRIMARY >NUL
echo #设备用DNS:%dns2%
netsh interface ip add dns name=%name% addr=%dns2% index=2 >NUL
netsh interface ip set wins name=%name% source=static addr=none >NUL
)
echo #
echo #显示%name%配置结果
netsh interface ip show config %name%

@pause

前一阵子已经制作过WIN7引导文件嵌入菜单,现在再发个XP引导文件嵌入可选菜单,使用方法和WIN7引导文件嵌入菜单的方法一致,只是在那基础上增加了一个隐藏的后台GRLDR,按CTRL+HOME,就可以进入GRLDR的命令行,使得光盘的使用性更加灵活。
3edd751ex7df70dde7587&690.jpg
原理:引导文件首先会从“SHOYO”目录引导,若失败则引导“I386”目录,接着引导BOOTFIX.BIN文件,出现从光盘引导的提示,按任意键就从光盘引导,否就从硬盘引导。

修改点示意图如下,简单明了
3edd751ex7df72954e52b&690.jpg
本例包含8个菜单项,11字节的“w2ksect.bin”、12字节的“recovery.bin”……故菜单项数hex:08,引导文件名长度hex:0B,其后就是引导文件名,以此类推。

通过修改这些区域,可以制作出符合我们要求的菜单。最大可以存放26个菜单项。

提示:请确保每个引导文件名长度的准确性,只要错一个引导文件名的长度将会影响后序引导文件名的索引,当然一定要保持菜单文本起始位置的不变和引导文件大小的不变。

建议:被引导文件最好是grub4dos,可以很方便的将引导菜单内置,看起来更简洁。镜像格式为支持ISO-9600的编码。
DEMO镜像下载