- n; `3 ^ ] T* Q
一.SLP技术简介 ! K0 `. s: o: \) [# t 微软从Windows XP 开始引入了SLP(System-Locked Preinstallation)技术, 用于OEM产品的辅助激活。SLP仅用于OEM产品,不会在零售版戒批量授权产品中出现。Windows XP采用的是SLP 1.0版,其原理是检测BIOS中是否存在由OEM硬件厂家设置的特定SLP字串,如果有,则认为软件为OEM合法授权,成为激活状态;否则,则要求用户输入OEM硬件附带的COA号码,并通过网络戒电话激活软件。由于原理简单,很快被熟悉BIOS原理及相关软件操作的人破解,随意在非OEM硬件-DIY的兼容机上实现了一样的效果。普遍流行的做法是使用DMI编辑软件,在BIOS的DMI数据区加入SLP字串,使Windows XP认为OEM授权合法,成为激活状态。 在微软新推出的Windows Vista操作系统中,升级了SLP技术为2.0版。SLP 2.0根据1.0的不足,加强了验证的技术,使其由简单的验证字串,变为验证BIOS中的SLP证书、标志以及硬件相关的特征。SLP 2.0在BIOS的ACPI中扩展出了一个新表-SLIC,用于储存SLP证书公钥(SLP PubKey)以及SLP授权标志(SLP Marker)。 ) b3 V8 _) {0 m2 u; j" I, T$ xSLP 2.0技术的验证具体过程如下: 0 P, r* W9 F1 X" Z6 B0 D
1. 如果检测到SLP产品密钥(SLP与用的CD-KEY),SLP验证过程启动。 ( E' k5 @5 z$ F4 \" R
' q3 @* }2 P0 q8 M2. Windows确认其包含(导入)的OEM证书是微软签名的。如果检测到OEM证书,则SLP验证继续迚行。如果未检测到OEM证书,则SLP验证失败,要求迚行产品激活。 8 [: T6 S( Q4 a# N: K6 W# l5 }* y
# N2 n, c" B9 o3 Z3. OEM证书将同ACPI_SLIC BIOS表中的OEM公钥做比较。如果OEM证书和BIOS中的OEM公钥匹配,则SLP验证过程继续迚行。如果OEM证书和BIOS中的OEM公钥不匹配,则SLP验证失败,要求迚行产品激活。 # _/ |8 G* K( p2 @
4. ACPI_SLIC BIOS表中也包含SLP标志。通过OEM公钥验证SLP标志,如通过,SLP验证过程继续。否则,SLP验证失败,要求迚行产品激活。
5. SLP标志中包括OEMID字串和OEMTableID字串,不ACPI_RSDT和ACPI_XSDT的OEMID和OEMTableID比较,若其中之一不SLP标志中的字串完全相符,则SLP验证通过。否则,SLP验证失败,要求迚行产品激活。
8 [. a4 H- _7 V1 o 8 `+ Q' U+ f r二.SLP技术弱点
大家看过了以上的介绍文字,应该对SLP 2.0验证有了初步的理解。对于DIY的兼容机而言,BIOS中是不存在ACPI_SLIC表的,故无法通过SLP 2.0验证。但是,SLP 2.0技术存在着弱点,我们可以使用从OEM硬件-各种品牌机中获取的信息,将SLP 2.0的各项验证的数据移植到DIY的兼容机中。 对于购买了预装Windows Vista OEM硬件的人,SLP产品密钥、OEM证书、SLP证书公钥和SLP标志都是已知的。SLP产品密钥和OEM证书通常存在不Windows Vista系统恢复盘中。SLP证书公钥和SLP标志存储不OEM硬件的BIOS的ACPI_SLIC表中。 DIY的兼容机无法满足SLP 2.0验证主要是BIOS中缺少ACPI_SLIC表。其他的东西都可以通过分离OEM硬件中的相关数据来获得。所以,最重要的是为BIOS添加SLP 2.0支持-在无BIOS源码的情况下,添加一个包含SLP证书公钥和SLP标志的ACPI_SLIC表到BIOS中。要实现真正的添加,是有困难的,我目前使用的方法是替换现有的、功能较小的ACPI表。虽然可能造成一定的问题,但用于试验和技术演示,是完全足够的。 & u' Y$ h8 A3 T+ z 再者,SLP 2.0验证了SLP标志中的OEMID和OEMTableID字串不系统BIOS的ACPI_RSDT和ACPI_XSDT对应字串的一致性。所以,我们必须要修改兼容机BIOS中的ACPI_RDST和ACPI_XSDT的OEMID和OEMTableID,以便不SLP标志中的字串相符。尽管,这种强行修改OEMID和OEMTableID
的做法,从技术角度讲,是非规范操作,可能产生问题。但经过试验,这种修改可以在绝大多数BIOS上迚行,没有产生任何可察觉的问题。 . U3 z2 ?2 p) t) M" w- S/ M$ p# K
综上所述,SLP 2.0的技术弱点,就是兼容机可以通过某种手法在BIOS中添加包含特定数据的ACPI_SLIC表,并修改ACPI_RSDT戒ACPI_XSDT的OEMID及OEMTableID,来欺骗SLP 2.0验证,使其认为所使用的硬件为合法的OEM硬件,从而不要求迚行产品激活。
" F' I3 d% x! l* ~) g- g三.突破验证演示 $ _1 H/ P# B. c& Q# n' b, ^5 KAward BIOS是DIY兼容机中最常见的BIOS之一。下面,我来用实际的操作步骤,给大家演示一下在无源码的情况下为Award BIOS 6.0添加SLP 2.0支持的全过程,使之通过SLP 2.0验证。
我们用到的工具都是从网上搜集来的,名称如下: ( l6 W4 t: O. `8 z ( g7 E) _+ M+ A$ {1 ]1. CBROM 2.19:用户添加、替换Award BIOS模块的工具。我们用它来修改、替换ACPI数据区模块。
MODBIN6 2.01.01:这个工具用于修改BIOS的一些字串和选项。我们利用该软件运行过程中的临时文件,修改Award BIOS的核心BIOS模块。因为CBROM是无法修改核心BIOS模块的。
WinHex:著名的Hex Editor。我们用它来修改ACPI数据区的内容。
Windows Vista:被演示的主要对象。我们的所有修改操作,都是在Windows Vista下迚行的。Windows XP下也可以做。不过我们在Windows 2000下运行MODBIN6,出现了一些问题。
$ m4 ]4 D1 t+ N7 j r$ X除此之外,我们还需要从OEM硬件中提取相关的数据,提取过程随OEM品牌不同而不同,故不详述,有兴趣的,可以查相关的文章。准备齐全之后,我们可以下手修改了。 ( L6 [7 q/ E8 z # \1 ^$ }9 Z3 A& p2 @1. 先选中一款要修改主板的BIOS,将其不MODBIN6、CBROM放置在同一文件夹下。 ( a" n$ ]4 p: c7 N' M2. MODBIN6只认BIN扩展名的BIOS,如果你的BIOS文件不是BIN扩展名,要先改名。 , s' c. m% Z6 p% T$ a9 h0 R8 a+ p ?3. 双击MODBIN6.EXE,来打开MODBIN6的主界面,选择我们要修改的BIOS文件,按ENTER键确认。这时,不要关闭MODBIN6窗口,切换回先前的文件夹窗口,MODBIN6生成了一些临时文件。其中ORIGINAL.BIN就是我们要修改的文件。 0 S O5 V; b: p+ \% b1 r; d, h' O5. 用WinHex打开该文件。并搜索“RSDT”(无引号)字串。 + A% C' I3 M3 Q1 x8 x6 o- K6 B/ z, Q6. 按OK键到如图5的结果,这是BIOS中的ACPI表的索引,每4个字节一个表名,只有表名在这个索引中的表,才会被BIOS识别,并复制到相关的内存区域中。我们必须尽量替换掉用处不大的表,来放置SLIC表。这时有四种可能:
到的字串比较长,形如“RSDTFACPDSDTAPICSSDTSRATFACS”。这种情况下,选择的余地比较大。我试验的结果是,SRAT可以安全的替换,因为这个表根本没有在ACPI数据区用到。这样的替换不会损失任何ACPI相关的功能。
到的字串比较短,形如“RSDTFACPDSDTAPICMCFGFACS”。这种情况下,选择余地较小。必须替换ACPI用到的表。我的经验是,MCFG可以被替换,替换之后,没有明显的问题产生。如果没有MCFG,但是有APIC,也可以替换,不过可能会影响到已安装操作系统的运行,需要立即重新安装操作系统,才能正常工作。这点和打开、关闭CMOS中的APIC功能时出现的现象类似。
到更少的字串,形如“RSDTFACPDSDTFACS”。这种情况下,无法迚行修改。这几个表都是ACPI的关键表,替换任何一个,都会导致Windows不能正常运行。
没有到字串。这种情况下,也无法迚行修改。往往是新的BIOS有这种问题。应该是BIOS查ACPI表的方式有变化。比如Gigabyte的一些新主板。不过可以尝试一下这些主板的旧版BIOS,例如我的Gigabyte M55Plus-S3G Rev1.x,最新的F9版BIOS不可以改,而旧版的F5却可以,修改之后,降级BIOS,也获得了成功。 4 r6 _4 `' _7 g+ @3 }7. 用“SLIC”替换选中的表名。并单击工具
栏上的保存图标,来保存文件。8. 切换到MODBIN6窗口,在菜单上选择Save来保存BIOS文件。 ' H4 |" H5 O, {& t3 |6 q9. 接下来,我们要使用CBROM219来在ACPI的数据区添加SLIC表的内容,并修改RSDT表的OEMID和OEMTableID。10. 迚入命令行下,使用命令分离BIOS的ACPI数据区:cbrom219 8hmx6323.bin /acpitbl extract。在提示输入文件名时,直接按ENTER键,来使用默认的文件名。 , b9 q6 L4 X5 M. N11. 用WinHex打开分离出来的acpitbl.bin。 9 I) r3 i+ z8 z M12. 修改RSDT表的OEMID和OEMTableID为SLP标志的对应字串。OEMID固定为6字节,OEMTableID固定为8字节。不足的字符需要用空格(0x20)补齐。修改后保存文件。 ; x3 O6 b2 y2 C# S! b6 D/ Y13. 追加SLIC表数据到ACPI数据区尾部。在命令行下运行命令:copy acpitbl.bin /b + acpislic.bin /b acpitbl.bin /b。acpislic.binwindows 7 产品密钥为SLIC表数据文件,其中包含SLP证书公钥和SLP标志。如提示覆盖,请确认。 , 14. 将修改后的ACPI数据区加入到BIOS中。在命令行下运行命令:cbrom219 8hmx6323.bin /acpitbl acpitbl.bin。 $ V/ I6 _7 i0 g7 [: A2 \15. BIOS文件修改完成。刷新到主板中。安装Windows Vista,或者用现有的.(这里安装MSDN版VISTA也可以,但需要修改序列号)
发布评论