|
本文由ZHAOLIANG大侠编写! (转自BIOS之家)
特点:
BIOS文件中有“$SLP”,
DOS下用 Phlash16 刷BIOS的同时,
加参数刷入 marker文件.
注意:仅用于试验环境的技术研究以及漏洞的验证。不涉及任何有版权的内容,仅供技术交流研究之用。
XR410&E290&E680 Marker 的分析:
【暂时称这种方式为硬MARKER】
在 SETMARK.BAT 批处理中:
phlash16 LE4_SLP2.wph /prot SLP:SLP2MARK.bin /X
分析如下:
phlash16 是 Phoenix 的 DOS 下刷BIOS的软件,
LE4_SLP2.wph 是 BIOS文件
/prot SLP: 是phlash16的参数,意思是在 “$SLP”的端口处写
SLP2MARK.bin 是SLIC表的marker部分
【SLIC表 = 24h 表头 + 9Ch PUBKey + B6h Marker 】
/X 是phlash16的参数,推测意思是 SLP2MARK.bin 不经过压缩直接写到BIOS中
那么,“$SLP”的端口在哪里呢?
很简单,在 BIOS 文件的 “尾部”里,你可以在BIOS文件中搜索“$SLP”,
以 LE4_SLP2.wph 为例:
(0~100000h 是 BIOS 文件,100000h~100D85h是BIOS的芯片刷新程序)
Offset 0 1 2 3 4 5 6 7 8 9 A B C D E F
00100540 00 00 00 00 00 00 00 00 00 00 00 24 50 52 4F 54 ...........$PROT
00100550 45 43 54 24 53 4C 50 4E 05 00 00 00 03 FA FF B6 ECT$SLPN.....??
00100560 00 00 00 FF FF FF FF 01 00 64 C7 06 4C 05 00 00 ...
$PROTECT 意思是“保护”,就是说“$PROTECT”后面的端口中指定位置,
在刷 BIOS 时,不会被刷新 !!!!!!!!!!!!!!!!
呵呵,就是说BIOS文件中包含的刷新程序设置了一段位置,这段位置在刷BIOS的时候,
是不会被刷新的,除非你加了那个端口的参数并指定文件,那里才能被刷新 !!!
这就是为什么同型号的笔记本,刷同样的BIOS,结果会不一样了 !!!
预装VISTA的BIOS,那个位置是 SLIC表的marker ,升级BIOS之后,那里位置没有被刷新,
SLIC表还在。
没有预装VISTA的BIOS,那个位置不是SLIC表的marker ,升级BIOS之后,那里位置没有被刷新,
你的BIOS就不会有SLIC表,即使有,marker部分也是错误的。
而使用上面的参数刷 BIOS 就不同了,指定的位置会被写成 SLIC表的marker !
$SLP 指定的端口 就是 $PROTECT
$SLP后面的代码分析:
4E 05 00 00 BIOS尾部的相对位置,就是把 10001Bh 当作 0h(1B是头部长度不计在内),
“54E” 就是$PROTECT 尾部的位置,本例是 100568h处,
(568h-1Bh+1=54Eh ,十六进制从0开始)
00 03 FA FF 指定端口的起始位置(BIOS 在内存中的地址),这里是 “FFFA0300”
在BIOS文件中的位置 A0300h
B6 00 00 00 指定的长度 B6h ,^_^ 正好是 SLIC表marker的长度 !
这下部分人已经明白了吧 !
总结:
联想的升级BIOS中,如果有 “$SLP”,那你就看看 “$SLP”所指定的位置,
例如本例中的 “FFFA0300”【用HWDIRECT1.87.00.8 看 】,
看看你的 BIOS 的 “FFFA0300”处是不是 SLIC表的marker,
如果是,你直接更新BIOS,那么你的 BIOS 还是会激活 VISTA ,
如果不是,你就用 SETMARK.BAT 更新BIOS,那么你的 BIOS 就有SLIC了,能激活 VISTA 。
但是要注意最好先看看你的 RSDT表的 OEMID 和 OEMTABLEID,然后选择一个匹配的SLIC文件。
当然,如果RSDT表的 OEMID 和 OEMTABLEID 不是 “LENOVOT” 或 “LENOVOC”开头的话,
就自己选个联想的 SLIC就行了。
F41 Marker 的分析:
【暂时称这种方式为软MARKER】
特点:
适合的BIOS文件的尾部(描述信息)没有“$SLP”,
BIOS 中已经有374字节的SLIC表了,(有可能没有Marker部分)
但是系统中没有SLIC表,或表名不对,或SLIC表不完整。
在纯DOS环境下,运行 MARKER.EXE 加参数,
即可控制 SLIC表的去留,不需要刷 BIOS。
联想 Marker 相关程序下载:
注意:
联想SMI_MARKER 必须在纯DOS下运行 !!!
而且最好不加载类似EMM386之类的内存管理程序。
联想Marker转码模拟程序,只是我做的模拟计算程序,并不能修改BIOS。
4820313a723341a6c2453e27aa7ba9f3.rar 4820313a723341a6c2453e27aa7ba9f3.rar (581.99 KB)
联想能用MARKER的BIOS初步推断:
XR410Marker 可能是刷BIOS时,把 marker 同时刷到BIOS中
F40 Marker 可能是改SMI信息,BIOS运行时读取SMI信息,
符合一定的条件 SLIC表就是正常的,没找到标记就把SLIC改成一半。其实就是刷HOLE。
随便找了几个版本的 BIOS 文件发现一些规律:
首先 SLIC表 = 24h 表头 + 9Ch PUBKey + B6h Marker
用 Phoenix BIOS Editor 打开BIOS文件,在 TEMP 目录
1、
winhex打开 BIOSCOD1.ROM ,搜索 SLIC ,
可以找到 SLIC表的表头部分(长度24h),如下:
53 4C 49 43 00 00 00 00 01 00 4F 45 4D SLIC......OEM
49 44 5F 4F 45 4D 54 41 42 4C 45 00 00 00 00 20 ID_OEMTABLE....
4C 54 50 00 00 00 00 LTP....
每个BIOS中的 SLIC 的 OEM ID&Table ID都是 "OEMID_OEMTABLE"
2、
TEMP 目录中有一个 ACPIX.ROM 或 MOD_XX00.ROM 文件 ,
文件大小是 156字节(9Ch),这个文件是 SLIC表的 PUBkey 部分,
每个BIOS的这个文件内容都完全一样,因为Key是通用的,
比较 LENOVOCB-01、LENOVOTC-2P、LENOVOTC-03、LENOVOTP-79的SLIC表,
发现他们的 PUBkey 部分是完全相同的
3、
TEMP 目录中有一个 HOLEX.ROM ,文件大小是 182字节(B6h),
但是这个文件的内容全部是 “FF”,
这个文件是 SLIC表的 Marker 部分,
比较 LENOVOCB-01、LENOVOTC-2P、LENOVOTC-03、LENOVOTP-79的SLIC表,
发现他们的 Marker 部分是不相同的(包括OEMID也是不同的)。
总结:
每个联想带SLIC的BIOS,
SLIC表头基本相同,只有Creator ID有可能不同,
(注:Creator ID不影响SLIC的功能)
SLIC表的 PUBkey 部分是完全相同的,
SLIC表的 Marker 部分是空的(182个HEX“FF”)。
seg000-E9A ; *************** S U B R O U T I N E ***************************************
seg000-E9A
seg000-E9A
seg000-E9A sub_DE9A proc near ; CODE XREF: seg000-E70p
seg000 E9A push eax
seg000 E9C push ecx
seg000 E9E push edx
seg000 EA0 push edi
seg000 EA2 push esi
seg000 EA4 push ds
seg000 EA5 push es
seg000 EA6 mov ecx, 0B6h ; '? ;
seg000 EAC push 1
seg000 EAE push large 0FFFFFFFFh
seg000 EB4 push ecx
seg000 EB6 push 0
seg000 EB8 call far ptr 41A5h:485Dh
seg000 EBD add sp, 0Ch
seg000 EC0 shl edx, 10h
seg000 EC4 mov dx, ax
seg000 EC6 or edx, edx
seg000 EC9 stc
seg000 ECA jz short loc_DF16
seg000 ECA
seg000 ECC xor ax, ax
seg000 ECE mov ds, ax
seg000 ED0 mov es, ax
seg000 ED2 mov esi, 0FFFB0000h
seg000 ED8 mov edi, edx
seg000 EDB mov ecx, 0B6h ; '? ;
seg000 EE1 cld
seg000 EE2 rep movs byte ptr es:[edi], byte ptr [esi]
seg000 EE5 mov esi, edx
seg000 EE8 mov ecx, 0B6h ; '? ;
seg000 EEE call far ptr 41A5h:2DB8h
seg000 EF3 jb short loc_DF08
seg000 EF3
seg000 EF5 mov ecx, 0B6h ; '? ;
seg000 EFB mov edi, ebx
seg000 EFE sub edi, ecx
seg000 F01 mov ebx, edi
seg000 F04 rep movs byte ptr es:[edi], byte ptr [esi]
seg000 F07 clc
seg000 F07
seg000 F08
seg000 F08 loc_DF08: ; CODE XREF: sub_DE9A+59j
seg000 F08 pushf
seg000 F09 push edx
seg000 F0B push 2
seg000 F0D call far ptr 41A5h:485Dh
seg000 F12 add sp, 6
seg000 F15 popf
seg000 F15
seg000 F16
seg000 F16 loc_DF16: ; CODE XREF: sub_DE9A+30j
seg000 F16 pop es
seg000 F17 pop ds
seg000 F18 pop esi
seg000 F1A pop edi
seg000 F1C pop edx
seg000 F1E pop ecx
seg000 F20 pop eax
seg000 F22 retn
seg000 F22
seg000 F22 sub_DE9A endp
seg000 F22
seg000 F23
seg000 F23 ; *************** S U B R O U T I N E ***************************************
seg000 F23
seg000 F23
seg000 F23 sub_DF23 proc near ; CODE XREF: seg000 E75p
seg000 F23 push ax
seg000 F24 push edx
seg000 F26 mov ax, 3
seg000 F29 mov dx, 4Ah ; 'J' ;
seg000 F2C shl dx, 8
seg000 F2F call far ptr 0F000h:0E38Bh
seg000 F34 jb short loc_DF5D
seg000 F34
seg000 F36 shl edx, 10h
seg000 F3A mov dx, ax
seg000 F3C cmp edx, 9Ch ; '? ;
seg000 F43 stc
seg000 F44 jnz short loc_DF5D
seg000 F44
seg000 F46 sub ebx, edx
seg000 F49 mov ax, 4Ah ; 'J' ;
seg000 F4C shl ax, 8
seg000 F4F push ebx
seg000 F51 push ax
seg000 F52 push 5
seg000 F54 call far ptr 0F000h-A75h
seg000 F59 add sp, 8
seg000 F5C clc
seg000 F5C
seg000 F5D
seg000 F5D loc_DF5D: ; CODE XREF: sub_DF23+11j
seg000 F5D ; sub_DF23+21j
seg000 F5D pop edx
seg000 F5F pop ax
seg000 F60 retn
seg000 F60
seg000 F60 sub_DF23 endp |
|