|
本文由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
seg000E9A push eax
seg000E9C push ecx
seg000E9E push edx
seg000EA0 push edi
seg000EA2 push esi
seg000EA4 push ds
seg000EA5 push es
seg000EA6 mov ecx, 0B6h ; '? ;
seg000EAC push 1
seg000EAE push large 0FFFFFFFFh
seg000EB4 push ecx
seg000EB6 push 0
seg000EB8 call far ptr 41A5h:485Dh
seg000EBD add sp, 0Ch
seg000EC0 shl edx, 10h
seg000EC4 mov dx, ax
seg000EC6 or edx, edx
seg000EC9 stc
seg000ECA jz short loc_DF16
seg000ECA
seg000ECC xor ax, ax
seg000ECE mov ds, ax
seg000ED0 mov es, ax
seg000ED2 mov esi, 0FFFB0000h
seg000ED8 mov edi, edx
seg000EDB mov ecx, 0B6h ; '? ;
seg000EE1 cld
seg000EE2 rep movs byte ptr es:[edi], byte ptr [esi]
seg000EE5 mov esi, edx
seg000EE8 mov ecx, 0B6h ; '? ;
seg000EEE call far ptr 41A5h:2DB8h
seg000EF3 jb short loc_DF08
seg000EF3
seg000EF5 mov ecx, 0B6h ; '? ;
seg000EFB mov edi, ebx
seg000EFE sub edi, ecx
seg000F01 mov ebx, edi
seg000F04 rep movs byte ptr es:[edi], byte ptr [esi]
seg000F07 clc
seg000F07
seg000F08
seg000F08 loc_DF08: ; CODE XREF: sub_DE9A+59j
seg000F08 pushf
seg000F09 push edx
seg000F0B push 2
seg000F0D call far ptr 41A5h:485Dh
seg000F12 add sp, 6
seg000F15 popf
seg000F15
seg000F16
seg000F16 loc_DF16: ; CODE XREF: sub_DE9A+30j
seg000F16 pop es
seg000F17 pop ds
seg000F18 pop esi
seg000F1A pop edi
seg000F1C pop edx
seg000F1E pop ecx
seg000F20 pop eax
seg000F22 retn
seg000F22
seg000F22 sub_DE9A endp
seg000F22
seg000F23
seg000F23 ; *************** S U B R O U T I N E ***************************************
seg000F23
seg000F23
seg000F23 sub_DF23 proc near ; CODE XREF: seg000E75p
seg000F23 push ax
seg000F24 push edx
seg000F26 mov ax, 3
seg000F29 mov dx, 4Ah ; 'J' ;
seg000F2C shl dx, 8
seg000F2F call far ptr 0F000h:0E38Bh
seg000F34 jb short loc_DF5D
seg000F34
seg000F36 shl edx, 10h
seg000F3A mov dx, ax
seg000F3C cmp edx, 9Ch ; '? ;
seg000F43 stc
seg000F44 jnz short loc_DF5D
seg000F44
seg000F46 sub ebx, edx
seg000F49 mov ax, 4Ah ; 'J' ;
seg000F4C shl ax, 8
seg000F4F push ebx
seg000F51 push ax
seg000F52 push 5
seg000F54 call far ptr 0F000h-A75h
seg000F59 add sp, 8
seg000F5C clc
seg000F5C
seg000F5D
seg000F5D loc_DF5D: ; CODE XREF: sub_DF23+11j
seg000F5D ; sub_DF23+21j
seg000F5D pop edx
seg000F5F pop ax
seg000F60 retn
seg000F60
seg000F60 sub_DF23 endp |
|