最近帮网友搞一台联想家悦机子的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模块分离出来,分析
可以看出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区域的数据限制。