首页
社区
课程
招聘
[原创]不修改Bios完成OEM版Vista系统免激活
发表于: 2007-3-2 11:10 58910

[原创]不修改Bios完成OEM版Vista系统免激活

2007-3-2 11:10
58910

【文章标题】: 不修改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


[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

上传的附件:
收藏
免费 7
支持
分享
最新回复 (130)
雪    币: 214
活跃值: (40)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
2
厉害,想看代码
2007-3-2 13:03
0
雪    币: 208
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
这个就牛X了
2007-3-2 13:05
0
雪    币: 431
活跃值: (442)
能力值: ( LV12,RANK:530 )
在线值:
发帖
回帖
粉丝
4
这帖得顶。
2007-3-2 13:42
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
这样也行,佩服佩服!
2007-3-2 14:05
0
雪    币: 214
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
期待代码~~~~~~
2007-3-2 15:34
0
雪    币: 488
活跃值: (2749)
能力值: ( LV10,RANK:170 )
在线值:
发帖
回帖
粉丝
7
在某处看到过类似文章了,并且那个作者已经提供软件了~
2007-3-2 17:10
0
雪    币: 2054
活跃值: (282)
能力值: ( LV9,RANK:220 )
在线值:
发帖
回帖
粉丝
8
CCG都是牛人
2007-3-2 19:13
0
雪    币: 615
活跃值: (1222)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
9
疯狂了,不知道MS在SP1如何应对

64Bit 的体积超大,最好用vLite2对想要安装的版本量身定做一下,不要的东西删除。
2007-3-2 19:29
0
雪    币: 203
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
应该不是原创,个人认为擦写BIOS好,一次擦写永久有效,不必担心硬盘主引导记录变更以及更换新的硬盘必须重写。而且目前很多防病毒软件都判断主引导记录变化来检测病毒,除非你的BIOS擦写失败否则没必要修改主引导记录。
这是原文:(2007/2/5)
http://os.yesky.com/windowsvista/480/3067480.shtml
SLP: System Lock Preinstall的简称,翻译成中文就是预安装系统的激活保护措施,它是微软与OEM厂商之间的一种协议,SLP是为了最大限度地保证OEM厂商的利益而又能避免盗版的泛滥……

  在XP/2003系统,OEM采用SLP1.0的验证机制:

  具体表现为:

  1、OEM厂商的出厂机器BIOS里含有该品牌的字符串(STRING)

  2、操作系统里含有对应该品牌的OEMBIOS.*文件

  3、安装序列号为对应该品牌的OEM KEY

  如果上述3个条件具备,则XP/2003系统可以免激活,否则,等同于零售版,必须在30天内激活(比如用COA的KEY激活XP/2003)

  在Vista系统,OEM采用SLP2.0的验证机制:

  具体表现为:

  1、OEM厂商的出厂机器BIOS里含有该品牌的OEM授权证书的数字签名

  2、OEM厂商的出厂机器BIOS里含有该品牌的OEM KEY的数字签名

  3、操作系统里含有对应该品牌的OEM授权证书

  4、安装序列号为对应授权证书版本的OEM KEY

  如果上述4个条件具备,则Vista OEM系统为免激活,否则,等同于零售版,必须在30天内激活(比如用COA的KEY激活Vista)

  Vista 零售版改OEM版本免激活的原理与方法:

  1、重启到纯DOS环境下刷新BIOS:

  AWARD bios类型:采用phoenix的BIOS工具刷新BIOS,并将PUBLICKEY.BIN(公钥数字签名)与SLPMARK.BIN分别刷进bios.(刷新BIOS时要两次重启)

  AMI bios类型:原理同上,工具采用AMI的专版工具.

  2、正常启动,将OEM授权证书复制到Vista系统所在的目录:windowssystem32

  3、以管理员权限将tokens.dat替换成OEM版本的tokens.dat,注意,tokens.dat的版本必须对应回OEM KEY,即HB对应HB,HP对应HP,U版对应U版.

  4、更改安装序列号,将KEY改为对应于toekns.dat版本的OEM KEY.

  5、重启,恭喜你!Vista 零售版已经改成OEM版本,并且免激活了
2007-3-2 19:42
0
雪    币: 435
活跃值: (172)
能力值: ( LV13,RANK:280 )
在线值:
发帖
回帖
粉丝
11
建议楼上的好好看看我的文章和网上其他的文章后再发言
原创性楼上的就更加不用怀疑了
我最早完成不修改bios实现SLP 2.0的时间是2月24日
当时就在远景上发了一个帖子,只是没有具体写过程
http://www.vistafans.com/thread-107150-1-1.html
修改bios和修改主引导记录
楼上的认为哪个风险更大?
况且很多主板并不能修改bios加入SLIC数据。目前我的这种方法还没发现有不支持的主板(包括笔记本主板)
关于主引导扇区的保护的担心就更没什么必要,如果你的系统打开了主引导扇区保护,根本就不可能正常安装XP和Vista
2007-3-2 19:50
0
雪    币: 203
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
判断是不是原创主要是看原理,从原理上说你同别人没有本质区别,只是实现方法的不同而异。(显然如果没有别人的擦写BIOS的成功,你绝对不会有这个方法)你是利用主引导记录的执行来修改BIOS数据区,别人是直接擦写BIOS.据我所知,主引导记录的空间非常有限,修改添加代码很麻烦,你没有把修改后的主引导记录关键代码贴上,根本就不能证明你已经成功实现。你这样蜻蜓点水地点几下也算实现了,那我也就无话可说了。你在其他论坛2月24日的贴根本就不能算什么,因为你只说实现了没有具体方法等于没说。
如果你这个也算原创,那么还有更多的方法,如修改MSdos引导文件等。而且我认为修改引导文件比你修改主引导记录更好。
2007-3-2 20:14
0
雪    币: 435
活跃值: (172)
能力值: ( LV13,RANK:280 )
在线值:
发帖
回帖
粉丝
13
你这么说的话,这个论坛上关于逆向的帖子都不能算是原创了,所有]破解的基本原理都是找到关键判断点
你说的修改ms-dos引导文件的话更说明了你的水平
ms-dos引导文件ms从2000之后就没有用过了
方法我已经说得很详细了,我不贴所有代码一方面是认为没有什么必要,另外也使想少一些麻烦。
反正能看明白的人自然知道我有没有做出来,看不懂的人我就是全贴上了他也不明白
另外说一句,信不信由你,我实现修改bios激活vista的时候,远景也还没有公布修改方法
不喜欢和不懂技术的人讨论技术
说得难听一点,你知道什么是修改bios数据区吗?不要什么事情都想当然
2007-3-2 20:39
0
雪    币: 203
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
你不要做无谓的辩解了,这同逆向的帖子风马牛不相及。你是看了别人的破解后再变通一下而已。逆向起码是自己逆向的。
msdos没有引导文件,不知道是谁不懂?多操作系统启动选单怎么出来的?单操作系统的启动选项怎么实现的?
你以为你水平高?我不是呸你:你绝对没有实现!懂得点皮毛而已。
2007-3-2 20:52
0
雪    币: 435
活跃值: (172)
能力值: ( LV13,RANK:280 )
在线值:
发帖
回帖
粉丝
15
ntldr也算msdos引导文件,长见识
第一次听到有人说我"懂点皮毛"
2007-3-2 20:55
0
雪    币: 184
活跃值: (108)
能力值: ( LV9,RANK:410 )
在线值:
发帖
回帖
粉丝
16
GKend指出的有点伤人了,呵呵。

刷BIOS不是好方法,除非编程器大面积普及了,否则,各种“意外”会让大批机器瘫痪。正是因为刷BIOS的高风险,MS才出此恶心招数来
验证,否则,大家齐齐来刷BIOS,MS不是很没有想法了。

火翼的方法能论述到这样的地方,说明在探索中有了大量的实践。
修改MBR这招让我想起了古老的启动型病毒。呵呵
记得以前玩MBR用PCTOOLS 5。0,好遥远的时代啊。
2007-3-2 20:58
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
17
这帖子人家自己写的,也提供了相关代码,这样也不算原创那什么算原创,gkend有点钻牛角尖了
2007-3-2 21:02
0
雪    币: 214
活跃值: (15)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
18
都 是高手。我这个菜鸟是不太懂了。
2007-3-2 21:06
0
雪    币: 203
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
19
最初由 火翼[CCG] 发布
ntldr也算msdos引导文件,长见识
第一次听到有人说我"懂点皮毛"

ntldr不算,只有IO.sys算?第一次听说。
这个家伙先伤人:不喜欢和不懂技术的人讨论技术。
你才不懂技术,不是呸你,随你搞什么,技术大挑战,奉陪到底。你那三脚猫功夫,我不放在眼里。
2007-3-2 21:11
0
雪    币: 615
活跃值: (1222)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
20
最初由 gkend 发布
应该不是原创,个人认为擦写BIOS好,一次擦写永久有效,不必担心硬盘主引导记录变更以及更换新的硬盘必须重写。而且目前很多防病毒软件都判断主引导记录变化来检测病毒,除非你的BIOS擦写失败否则没必要修改主引导记录。
这是原文:(2007/2/5)
http://os.yesky.com/windowsvista/480/3067480.shtml
SLP: System Lock Preinstall的简称,翻译成中文就是预安装系统的激活保护措施,它是微软与OEM厂商之间的一种协议,SLP是为了最大限度地保证OEM厂商的利益而又能避免盗版的泛滥……

........


gkend 应该理解火翼写这篇文章的用意。

2007-3-2 21:16
0
雪    币: 203
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
21
最初由 hnhuqiong 发布
GKend指出的有点伤人了,呵呵。

刷BIOS不是好方法,除非编程器大面积普及了,否则,各种“意外”会让大批机器瘫痪。正是因为刷BIOS的高风险,MS才出此恶心招数来
验证,否则,大家齐齐来刷BIOS,MS不是很没有想法了。

........

擦写BIOS不需要编程器,大部分兼容机主板都自带擦写程序。只要把bin写进去即可。而且不必担心失败,它可以先备份,如果失败可以用备份的恢复。
2007-3-2 21:18
0
雪    币: 184
活跃值: (108)
能力值: ( LV9,RANK:410 )
在线值:
发帖
回帖
粉丝
22
最初由 gkend 发布
擦写BIOS不需要编程器,大部分兼容机主板都自带擦写程序。只要把bin写进去即可。


看样子你有急了,刷BIOS都知道如何刷,刷失败了??不用编程器你怎么救回来???我本意就是编程器很容易找到,失败了编程器上救回来就好了。否则刷失败了又没有编程器救真要命的。

而且刷BIOS有几个很麻烦的事情,首先BIOS的E2PROM容量要和OEM的机器相同,我知道现在有的BIOS是1M有的是2M,其二,你得找到对应主板的修改好的BIOS,
自我修改BIOS不是这个方法普及的方式,而火翼的方式只要公布程序就可以了。
其三,你去看看www.rebios.net就知道,刷BIOS没有编程器作后盾,那只是爱好者的游戏。

我个人支持火翼的方式,可升级,可变化,失败挽救简单。
修改MBR作为很成熟的技术,在DOS不可重入中断的时代是非常普及的,并不复杂
2007-3-2 21:30
0
雪    币: 3689
活跃值: (4247)
能力值: (RANK:215 )
在线值:
发帖
回帖
粉丝
23
最初由 gkend 发布
擦写BIOS不需要编程器,大部分兼容机主板都自带擦写程序。只要把bin写进去即可。而且不必担心失败,它可以先备份,如果失败可以用备份的恢复。


实在看不下去了,你这不是扯淡吗?

BIOS写坏了,启动不了,不用编程器写用什么写?

你要是牛B,多写点有用的东西给大家学习学习,没事就知道在这里乱放屁,纯粹一SB。
2007-3-2 21:31
0
雪    币: 267
活跃值: (16)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
24
最初由 china 发布
实在看不下去了,你这不是扯淡吗?

BIOS写坏了,启动不了,不用编程器写用什么写?

你要是牛B,多写点有用的东西给大家学习学习,没事就知道在这里乱放屁,纯粹一SB。

不要这么说,bootblock没坏,部分bios就有恢复的方法
2007-3-2 21:34
0
雪    币: 615
活跃值: (1222)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
25
最初由 hnhuqiong 发布
你去看看www.rebios.net就知道,刷BIOS没有编程器作后盾,那只是爱好者的游戏。
........


去看了一下,那个东西原来就是编程器,长见识了,学习!
2007-3-2 21:37
0
游客
登录 | 注册 方可回帖
返回
//