本帖最后由 Mouri_Naruto 于 2014-8-7 19:21 编辑
PS:我发这篇文章前思考了很久,因为担心里面的内容(微软的版权问题)而作罢;但我觉得我还是应该向大家科普一下。这篇文章的发表证明我已放弃开发NKMSKit;因为我依旧得不到知己(可以讨论技术的朋友)也觉得开发的太累太累;并且我已在远景找到了技术圈。既然开发的动机没有了,所以也就放弃了
Warning:本文章的写作目的是为了科普,由本文章引起的一切篓子楼主拒绝承担
PS:本文不会提供任何工具的下载,也不会反编译别人的代码(为了照顾远景)。
说到KMS大家都很熟悉:这是微软的一种面向企业的激活机制,一次激活有效期180天;光看看这个机制别人可能觉得这不可能做到永久激活。但是如果你每天都KMS激活的话(企业正版用户系统会自动这么做),那么有效期永远都是180天,也就做到了永久激活;这就是KMS激活工具为什么可以实现永久激活并且为什么要后台运行服务的原因。
我虽然是KMS激活工具NKMSKit(原Mouri_Naruto KMS Activation Tool)的作者;但是我不能做到完全准确的向你们说明KMS工具的制作方法(因为楼主能力有限);我接下来会以按顺序向你们慢慢科普
我在没开发这个工具前,我是一个默默无闻的人(存在感极低,无论二次元还是三次元);偶然我看到了知彼而知己的博客,我十分羡慕也妒忌(为什么他可以开发出来而我就不可以);而且当时他不开源也很让我不爽(我用的软件除了Windows和Office以外大部分应用软件都有可以下载到的源代码)。所以我想写一个开源的KMS激活工具来交到网络上的朋友以减少现实生活中没有朋友的压抑感。一写下去就是1年半。
我经过次次失败的实验,得出了一些结论:KMS激活工具分为KMS服务器,激活判断和激活代码这三部分,最重要的还是激活判断(因为不能覆盖别人已有的永久激活)
首先说说KMS服务器吧,这是我们KMS激活工具的核心,一般是Made in Russia。KMS服务器也可以叫做KMS模拟器;有虚拟机类型和EXE模拟器型,我们为了软件的大小,一般都是采用EXE模拟器(300KB以内吧,比至少100MB的虚拟机要小的多);由于微软的限制逐渐加强我们的服务器也越来越智能: 1.随机激活PID(微软你封了一个PID没用,除非封禁全部;这个功能在KMS V5即Windows8时代实现) 2.按需启动(通过映像劫持进程SppExtComObj.exe来欺骗系统启动KMS服务器) 3.随机KMS服务器IP(通过Hook RpcStringBindingComposeW这个函数来欺骗激活机制,认为这个IP是有效的;这个功能虽然实现,但很多激活工具(反编译他们的代码证明)还是用的单一IP;而我的工具却在2月份就实现了随机IP ^_^ 自恋中)
关于KMS服务器的代码,可以去MDL论坛下载。
再说说最重要的部分——激活判断吧。为什么说是最重要呢,因为这个的质量关系到KMS激活工具的好坏,如果这个部分做的不行的话,轻则无法激活,重则覆盖原有的激活 这个部分最主要是判断系统是否激活,我因为这个问题被绊倒N次,到我开发的激活工具的最后一个版本还没有解决;我得好好努力,如果能搞出来的话,我将来会把那段代码补上来 其次是根据系统的版本来判断安装的密钥,这些你只要调用WMI并且用一堆If语句就够了
激活代码其实最简单了,就是安装密钥,设定KMS服务器地址,激活就行了。代码如下
Windows NT 6.x - cscript %windir%\System32\slmgr.vbs -ipk Windows GVLK密钥
- cscript %windir%\System32\slmgr.vbs -skms KMS服务器地址
- cscript %windir%\System32\slmgr.vbs -ato
复制代码Office 2010 / 2013 - net start osppsvc
- cscript Office安装目录\ospp.vbs /inpkey:Office GVLK密钥
- cscript Office安装目录\ospp.vbs /sethst:KMS服务器地址
- cscript Office安装目录\ospp.vbs /act
复制代码
而KMS激活工具的服务一般也是进行这个步骤;当KMS服务器实现了按需启动的时候,Windows就替我们实现了KMS激活工具的服务(一般是7天激活一次)
KMS激活工具为了方便别人,一般还会加入一些附加功能;但楼主为了做纯粹的激活工具,我只加入了查看激活状态的功能,我觉得应该贴出代码(AutoIT版);为了方便远景的景友们 - Local $WinResult,$OfficeResult14,$OfficeResult15
- $WinResult= GetCommandResult("cscript %windir%\System32\slmgr.vbs -dlv")
- If FindStr($WinResult, " ID") = 1 and FindStr(GetCommandResult("wmic path SoftwareLicensingProduct where (Description like '%%Windows%%') get licensestatus /format:list"), "1") = 1 Then
- $WinResult=$VSWinT & $VSTextY & @CRLF & $WinResult
- Else
- $WinResult=$VSWinT & $VSTextN & @CRLF & $WinResult
- EndIF
- If $OfficeInstalled14 = 1 Then
- $OfficeResult14 = GetCommandResult('cscript "'& $OfficePath14 &'"\ospp.vbs /dstatus')
- Else
- $OfficeResult14 = "你的计算机未安装此产品"
- EndIF
- If $OfficeInstalled15 = 1 Then
- $OfficeResult15 = GetCommandResult('cscript "'& $OfficePath15 &'"\ospp.vbs /dstatus')
- Else
- $OfficeResult15 = "你的计算机未安装此产品"
- EndIF
- #Region ### START Koda GUI section ### Form=
- $ViewStatus = GUICreate("查看激活状态 - NKMSKit", 641, 481)
- $Edit1 = GUICtrlCreateEdit("", 2, 2, 636, 476,0x00200000 + 2048)
- GUICTRLSETDATA($EDIT1, "Windows" & @CRLF, 1)
- GUICTRLSETDATA($EDIT1, "================================================"& @CRLF, 1)
- GUICTRLSETDATA($EDIT1, $WinResult & @CRLF, 1)
- GUICTRLSETDATA($EDIT1, "================================================"& @CRLF & @CRLF, 1)
- GUICTRLSETDATA($EDIT1, "Office 2010" & @CRLF, 1)
- GUICTRLSETDATA($EDIT1, "================================================"& @CRLF, 1)
- GUICTRLSETDATA($EDIT1, $OfficeResult14 & @CRLF, 1)
- GUICTRLSETDATA($EDIT1, "================================================"& @CRLF & @CRLF, 1)
- GUICTRLSETDATA($EDIT1, "Office 2013" & @CRLF, 1)
- GUICTRLSETDATA($EDIT1, "================================================"& @CRLF, 1)
- GUICTRLSETDATA($EDIT1, $OfficeResult15 & @CRLF, 1)
- GUICTRLSETDATA($EDIT1, "================================================"& @CRLF & @CRLF, 1)
- GUISetState(@SW_SHOW)
- #EndRegion ### END Koda GUI section ###
- While 1
- $nMsg = GUIGetMsg()
- Switch $nMsg
- Case -3
- Exit
- EndSwitch
- WEnd
- ;获取命令执行以后的结果到变量
- Func GetCommandResult($CMDLine)
- Local $RName = @TempDir & "\GetResult.txt", $file
- RunWait(@ComSpec & ' /c ' & $CMDLine & ' > ' & $RName, "", @SW_HIDE)
- $file = FileOpen($RName, 0)
- Return FileRead($file)
- FileClose($file)
- EndFunc ;==>GetCommandResult
复制代码
如果你想知道为什么知彼而知己的HEU_KMS_Activator 7.7会有两个非常不稳定的Beta版的话,那我就是罪魁祸首了。因为我写激活工具的时候一直要研究一下别人的激活工具(包括反编译),发现知彼而知己写的代码有很多重复,就在他的博客发了吐槽(“楼主,本人反编译你的激活工具后发现你的工具的代码实在太长了,而且有很多重复的地方,想必楼主你看代码也很辛苦”),结果他说要整理代码造成了悲剧的发生……(O(∩_∩)O哈哈~,自恋的楼主大笑中)
我既然已经放弃了开发NKMSKit,那么我最后还是想感谢一下这些人:
知彼而知己,没有他的开放的HEU_KMS_Activator 3.3的核心代码,我的激活工具是不可能维持到现在的;作为对手,虽然我很讨厌知彼而知己的推广页面;但他还是我敬仰的对象 Microsoft_Mars,我很感谢他对我工具提出的建议并协助我开发(激活工具多语言版日文翻译),NKMSKit的调试人员,它拥有的NKMSKit的内部版本比作为作者的我多多了。我不会忘记我和她讨论激活工具的日日夜夜 荣耀『☆』辉煌,如果没有他当时把我的帖子变为精品贴的话,我估计我就没自信开发了 南木嘉人,如果没有这位大仙的第一次调试的话,我的工具可能就止于1.0
还有我曾经也开发过一些令人强烈吐槽的版本,那就是Lite系列。Lite系列,如果你的电脑没有安装过KMS激活工具的话,那么第一次运行就会开始全自动激活(PS:我的工具没有见不得光的东西,我向来都是100%开源;我当时的设计理念就是:既然你信任我的工具,那么我就要给你最简单的方式;结果楼主被喷了,我觉得这个社会人与人之间缺少信任)
NKMSKit,是我的处女作兼成名作;让我当上了Windows8吧的小吧主(虽然现在的我非常讨厌这个职位,恨不得立马辞职);我也有了一个绰号(八吧写激活工具的小吧);我也得到了别人的尊重,由于我的工具十分良心(我觉得自己写的问心无愧)大小在1M左右也被吧友记住了。(我又在自恋了)
除此以外,感谢全部用过我工具和看到这篇文章的吧友与景友;未来的我,将着重于开发实用工具,欢迎关注我的其他工具。这就是我的经历,我不能保证我能说的足够详细,但我可以保证我告诉了你们KMS激活工具的核心原理。如果想知道详细情况或者想要研究我的工具的人,代码的下载就在这里(我的软件一般开源,这是我的原则)
NKMSKit 1.1 Update Source.zip
(2.41 MB, 下载次数: 825)
感谢cjy__05,否则我就忘记了要写这篇文章了 |