2011年5月10日星期二

BIOS修改入门系列之二:浅析OEM Windows系统激活原理

  Windows XP开始,MS引入了SLP(System Locked Pre-installation,意为系统锁定预安装)技术用于OEM系统的激活。SLP技术限制了某台品牌机在出厂时可以安装和激活的OEM Windows系统,比如使用SLP 1.0技术的品牌机仅能激活OEM Windows XP,无法激活OEM Windows Vista和Windows 7(为行文方便,以后简称XP、Vista和Win7)。
  简单来说,所谓SLP技术就是在BIOS中添加一段或几段字符代码,用以激活相应OEM品牌的Windwos系统,目前SLP分为1.0、2.0和2.1三个版本

  前面已经说了,SLP 1.0可以激活XP,是在BIOS中添加OEM品牌字符串。开机时,XP会比较电脑的BIOS和SLP信息,如两者相符,则无需进行产品激活(已自动激活)。
  由于SLP 1.0技术是将OEM品牌字符串以明文方式添加到BIOS中,非常容易被破解——对于喜欢动手的用户来说,添加一串字符并不是很困难的事;就是不敢直接修改BIOS的用户,也有其他简单的办法,欺骗XP系统蒙混过关。因此发布Vista时,MS将SLP技术升级到了2.0。
  相比SLP 1.0,SLP 2.0由简单的验证字符串,变为验证BIOS中包含的SLP证书,并且在BIOS的ACPI(Advanced Configuration and Power Management Interface,高级配置和电源管理接口)模块中扩展出SLIC(Software Licensing Internal Code,软件许可内部代码)表,用于存放SLP证书公钥(Pubkey)和授权标志(Marker)。SLIC表多保存在SLDT(Software Licensing Description Table,意为软件许可描述表)中,表长374B(字节),后文中大写字母B表示字节。至于最新的Win7系统采用的激活方式为SLP 2.1,与SLP 2.0相比并无太大区别。由于SLP 2.x技术的关键是SLIC表,因此很多时候我们会直接使用SLIC 2.0或SLIC 2.1来替代称呼。
  需要注意的是,SLP 2.1和2.0有着向下兼容的关系(注意没有SLP 1.0什么事情),即SLP 2.1可激活Vista,而SLP 2.0却不能激活Win7。
  由于SLP 1.0是明文方式的OEM品牌字符串,修改起来比较简单,所以不多说,后继文章中的示例一看便会,重点是SLP 2.x。上面说了SLP 2.x扩展出了一个SLIC表,其长度是374B(字节),那么SLIC表的构成如何呢?想要分析SLIC表,首先要获得SLIC表才行。假若恰巧你的电脑是预装了Vista或Win7系统的品牌机(某些未预装任何系统的品牌机其实BIOS中也是包含SLIC表的,有的是SLIC表不完整,有些则根本就是),那你可直接使用工具抓取SLIC表并且保存下来。能够抓取SLIC表的软件有很多,草帽推荐BIOS之家DavidXXW发布的SLIC Toolkit,当前最新版本为3.2虎年贺岁版(点此下载SLIC Toolkit v3.2)。此软件可运行于x86(如xp等32位系统)和x64架构(如win7 64位系统)的电脑,专为检测品牌机OEM系统激活而编写。
  下载解压缩之后,运行SLIC_ToolKit_V3.2.EXE文件,软件会自动检测当前电脑和系统的OEM系统激活信息。注意由于软件会访问系统和内存底层,某些杀毒软件或其他安全防护软件会提示为病毒或恶意软件,请信任此程序或直接关闭防护软件

  软件分为5个界面,点击下部的“基本”、“高级”、“SLP 1.0”、“ACPI”和“内存访问”选项卡切换界面。
  “基本”界面显示的是当前BIOS中的SLIC表内容和版本,如果没有SLIC表会给出提示,按下“保存”可将SLIC表保存至指定位置。
  “高级”界面显示当前系统和BIOS激活的详细信息,内容包括系统版本、系统安装使用的密钥(Key)、证书,以及BIOS品牌和版本等。
  “SLP 1.0”界面显示当前BIOS中包括的SLP 1.0品牌字符串,即可激活的XP OEM品牌。
  “ACPI”界面显示的内容是BIOS的ACPI模块细节。
  最后的“内存访问”界面,可以指定内存偏移地址(16进制),提取和备份BIOS的指定位置。
我们经常用到的是前三个,后面两个对于一般用户来说意义不是很大。如何,SLIC Toolkit的使用还是很简单吧?现在将抓取的SLIC表保存下来,然后使用WinHex、UltraEdit等16进制编辑器打开,便于进行分析和讲解。当然,直接通过SLIC Toolkit的第一个界面也可以进行分析。如果你的电脑本身没有SLIC表,也没关系,可以点此下载各OEM品牌SLIC 2.1文件
  现在来看看SLIC表都有哪些内容。
  SLIC表主要分为三部分,分别是头部(Header)公钥(Pubkey)授权标志(Marker)长度分别为36B(16进制表示为24 hex)、156B(16进制表示为9C hex)和182B(16进制表示为B6 hex),总计长度为374B(16进制表示为176 hex)。方便起见,后文均用小写hex表示16进制数值,如9 hex、A hex等;小写h表示16进制偏移地址,如6 h。三部分划分如下图:

  上图中开头黄色部分为表头(Header),中间白色部分为公钥(Pubkey),最后黄色部分是授权标志(Marker)。一般情况下,对于 SLIC表能够区分出这三个部分就可以了。之所以要分清这三部分,主要是因为在某些具备SLIC表的BIOS中,SLIC是被拆分为2个甚至3个部分,以模块的形式保存在BIOS中。这样一来,如果碰到这样的BIOS也就不会手足无措了。现在草帽简单说一下这三部分的内容。
  1. 表头(Header)部分位于0-23 h,长度是24 hex(十进制数值36)字节。 0-3 h是表名SLIC,长度为4 hex(10进制数值4)B。
    4-7 h是表长,内容为“76 01 00 00”(即176 hex,十进制数值374),everest检测显示10进制数值374。
    8 h表示版本,目前全是“01”。
    9 h是SLIC校验,此地址的值修正整个SLIC表的校验和等于0。
    A-F h是SLIC表的OEM ID,长度为6 hex(十进制数值6)B。everest检测显示文本,如上图为FOUNDR。
    10-17 h是SLIC表的OEM Table ID,长度为8 hex(十进制数值8)B。everest检测显示文本,如上图为FOUNDRPC。
    18-1B h是SLIC表的OEM Revision,everest检测显示16进制数值,如上图为06 06 09 20,everest显示20090606。
    1C-1F h是SLIC表的Creator ID,everest检测显示文本。
    20-23 h是SLIC表的Creator Revision,everest检测显示16进制数值,显示方式和OEM Revision相似。
  2. 公钥(Pubkey)部分,位于24-BF h,长度为9C hex(十进制数值156)B。 同一品牌SLIC表的Pubkey绝大多数都相同,有个别品牌的不同(如东芝的SLIC有此情况)。Pubkey的前8 h一般均为“00 00 00 00 9C 00 00 00”
  3. 授权标志(Marker)部分,位于C0-175 h,长度是B6 hex(十进制数值182)B。 不同SLIC表的Marker部分均不同(和品牌无关),是区分SLIC表异同的唯一地方。其中位于CC-D9 h,长度为E hex(10进制数值14)B的内容必须与SLIC表头(Header)中的OEM ID(长度为6B)、OEM Table ID(长度为8B)一致。
    Marker部分的前8 h一般都是“01 00 00 00 B6 00 00 00”
上面三部分就是SLIC表的全部内容。前面说过,一个SLIC表在BIOS中可能被分成2个或三个部分独立保存于BIOS的不同模块中;其分割一般都是按照构成SLIC表的三部分进行的。因此我们非常有必要知道构成SLIC表的这三部分应如何划分。
  SLIC表的公钥(Pubkey)和授权标志(Marker)的内容是不可更改的,表头(Header)中的OEM Revision、Creator ID和Creator Revision是可自行修改的。如使用16进制编辑软件WinHex将OEM Revision、Creator ID和Creator Revision改为自己喜欢的内容之后,先将SLIC表的9 h处(SLIC校验)的16进制数值改为00,然后计算8位校验和(全选->工具->计算哈希->8位校验和),再用16进制计算器将得到的8位校验和数值取负数,将得数的末两位写在SLIC表的9 h处。最后计算一下8位校验和是否等于0,如等于0则OK。
  由于草帽前段时间有些家事,这篇文断断续续的写到今天才写完。还好家事已了,下篇文章的进度不会这么慢了。目前下文还没想好,期待吧!