【文章标题】: 不修改Bios完成OEM版Vista系统免激活
【文章作者】: 火翼[CCG]
【作者邮箱】: firewings_ccg@yahoo.com.cn
【作者主页】: 无
【作者QQ号】: 网上能查到
【软件名称】: Vista
【软件大小】: 2.4G(32Bit)-3.6G(64Bit)
【下载地址】: 自己搜索下载
【加壳方式】: 无
【保护方式】: SLP 2.0
【编写语言】: C
【使用工具】: IDA,Borland C++ 3.1,Hex Workshop
【操作平台】: Vista
【软件介绍】: 最新的操作系统
【作者声明】: 绕开Bios实现SLP 2.0认证数据的修改
--------------------------------------------------------------------------------
【详细过程】
    微软最新的操作系统Vista的OEM版本使用的SLP 2.0认证方式在验证过程中需要判断ACPI数据中是否存在正确的SLIC Table,之前公开的修改都是使用Bios工具在Bios中加入SLIC Table,这种方法受到很多限制,而且失败的危险性比较大,对ACPI进行具体的分析后,发现其实不用在Bios中完成这种修改,可以在硬盘的主引导扇区中完成这部分修改。
    系统查找ACPI数据时首先需要在物理内存E0000-FFFFF中找到RSD PTR 结构,RSD PTR 结构包含指向RSDT Table的指针,通过这个指针就可以找到保存在内存高地址的ACPI数据,其中我们需要修改的是RSDT Table,需要修改的数据主要包含以下几个步骤:
  1 查找RSD PTR结构体,定位RSDT数据
    2 判断RSDT Table中是否包含指向SLIC Table的指针,如果包括,则直接修改RSDT Table的OEMID和OEM Table ID,如果不包括则需要增加RSDT Table的长度,并在结构体的后面加上指向SLIC Table的指针。
  3 重新计算RSDT Table的校验和。
  4 在SLIC指针指向的位置加入SLIC数据。
  在具体的操作过程中,主要有以下几个必须解决的问题
  1 在主引导扇区中加入自己的引导代码,由于SLIC数据比较大,加上引导代码部分会超过主引导扇区中剩余的空间很多,所以我选择把这些数据和代码保存在主引导扇区后面的未使用扇区中,并在主引导记录中加入读取这些扇区并跳转过去的代码。
  2 访问高位内存,由于ACPI数据保存在内存的高位地址,而这些地址在世模式下要直接访问就必须使用一个在Bios里面也使用到的技巧,实现对32位内存地址的直接访问,此处产考了梁肇新写的一篇文章,文章的链接见参考文献。
  修改后的主引导即如执行流程如下:
  系统把主引导记录加载到0000:7C00处执行->MBR中的初始化部分把MBR复制到0000:0600处并跳转过去->使用一个跳转进入自己添加的代码->读取写入在硬盘的第2和第3扇区中保存的修改代码和SLIC数据到0000:8000-0000:BFFF,然后转去执行->修改ACPI数据,完成后跳回原MBR中完成引导过程。
  修改中还有以下几个问题必须注意:
  1 在MBR中添加代码必须注意各种寄存器的保存和恢复
    2 如果RSDT Table后面没有可用空间,就需要把RSDT Table向前移动,并修改保存在RSD PTR结构中的指针,补充一点,RSD PTR 结构所在的E0000-FFFFF段内存在通常情况下是无法写入的,只有进行一些特别的设置才能进行写入,所以这种修改方式比较麻烦。
  3 修改前一定做好原MBR的保存工作,以备出现问题时恢复
  4 MBR中的分区表部分要使用自己硬盘的数据。
  具体的实现代码暂时先不贴了,如果真的有需要以后再补充。
    先贴一段查找RSDT位置的
//查找成功后使用ECX返回RSDT的地址,并置AL为1,否则置AL为0
int SearchRSDT()
{
  asm{
    db 0x66
    mov di,0x0000
    db 0x0E
    db 0x00 //mov edi,0x0E000
    }
Search:
  asm{
    db 0x67
    db 0x64
    db 0x66
    mov ax,word ptr[bx]//=MOV EAX,FS: [EDI]
    db 0x66
    cmp ax,'SR'
    db 'D'
    db ' '//66 3D 53 4C 49 43   cmp     eax, 'CILS'
    jz Test56
    db 0x66
    inc di //inc edi
    db 0x66
    cmp di,0xFFFF 
    db 0x0F
    db 0x00  //cmp edi,0xFFFFF
    jbe Search
    xor ax,ax
    db 0x66
    xor cx,cx //xor ecx,ecx
    jmp End
    }
Test56:
  asm{
    db 0x66
    add di,0x04//add edi,4
    db 0x67
    db 0x64
    db 0x66
    mov ax,word ptr[bx]//=MOV EAX,FS:[EDI]
    db 0x66
    cmp ax,'TP'
    db 'R'
    db ' '  //cmp eax,' RTP'
    jnz Search
    db 0x66
    sub di,0x04//sub edi,4
    db 0x66
    add di,0x10//add edi,0x10
    db 0x67
    db 0x64
    db 0x66
    mov ax,word ptr[bx]////=MOV EAX,FS:[EDI]
    db 0x66
    mov cx,ax //mov ecx,eax
    mov ax,1
  }
End:
  return _AX;
}
//主引导扇区中的加载其余扇区代码
seg000:077B                 sti
seg000:077C                 mov     cx, 4
seg000:077F                 pusha
seg000:0780                 mov     ax, 202h
seg000:0783                 mov     cx, 2
seg000:0786                 mov     dx, 80h
seg000:0789                 mov     bx, 800h
seg000:078C                 int     13h ; 读取主引导扇区后面的两个扇区
seg000:078E                 mov     bx, 994h
seg000:0791                 mov     ax, [bx]
seg000:0793                 cmp     ax, 660h;判断读入的内容是否正确
seg000:0796                 jz      short loc_79C
seg000:0798                 popa
seg000:0799                 jmp     locret_620
seg000:079C ; ---------------------------------------------------------------------------
seg000:079C
seg000:079C loc_79C:                                ; CODE XREF: start+696j
seg000:079C                 call    sub_994;调用修改部分
seg000:079F                 popa
seg000:07A0                 jmp     locret_620;返回原引导记录
seg000:07A0 start           endp
//
    完整的分扇区代码我的笔记本里面现在不是最新的,过几天回去了再发吧
    附件是测试时用梁肇新的程序改的一个小工具,运行的时候显示RSDT段,按E则进行修改,注意只能在实模式下运行,只要把修改部分移植进MBR就能用了。
    使用这个方法首先在Virtual PC 2007中安装Vista OEM版并实现免激活。经测试可以在多款使用Award Bios和AMI Bios的主板上正常使用。
    加点其它的,个人认为修改bios法的缺陷如下:
    1 危险性较大(不要说刷Bios很简单,刷不明白的肯定是有的)
    2 很多主板不能通过修改bios方法完成修改(比如没有原生slp 2.0支持的AMI主板,比如ASUS的875板王P4C800,又比如没有原生SLP 2.0支持的大部分笔记本)
    3 修改Bios的方法可能影响原主板的功能(特别是不提供原生SLP 2.0支持的主板)
    如果以上3个问题修改 Bios都能解决,我的这个方法也就没什么意义了。
    本来搞这个东西的目的也就是方便自己用而已,写出来就是混篇精华,不喜欢的人说什么我也没有办法,大家也不要争论了。如果大家对这个方法的某个具体步骤有什么疑问,欢迎提出来,我相信可以给你满意的解答,其它无意义的讨论我就不参与了,希望支持我的XD也不要多做无意义的争论了,请相信:清者自清,谢谢。
    此文章中涉及的代码很多来源于对Award的AMI的Bios源代码的分析和不同主板Bios的逆向,希望能对有相关知识背景的人有所帮助。本人分析Award版的bios比较多,但研究此方法最主要的用途是针对P4C800主板使用的AMIBios,成功后在Award主板上也测试过,可用。    
参考文献:
    Award Bios 6.0源代码
    AMI Bios 源代码
  ACPI规范2.0   http://www.acpi.info/
    在DOS实模式下直接存取4GB内存 梁肇新 http://lw.mumayi.net/htmldata/96/99/2005_10/article_4079_1.html
--------------------------------------------------------------------------------
【版权声明】: 本文原创于看雪技术论坛, 转载请注明作者并保持文章的完整, 谢谢!

                                                       2007年3月2日 10:26:37