Private Declare Function RegCloseKey Lib "advapi32.dll" (ByVal hKey As Long) As Long Private Declare Function RegOpenKey Lib "advapi32.dll" Alias "RegOpenKeyA" (ByVal hKey As Long, ByVal lpSubKey As String, phkResult As Long) As Long Private Declare Function RegQueryValueEx Lib "advapi32.dll" Alias "RegQueryValueExA" (ByVal hKey As Long, ByVal lpValueName As String, ByVal lpReserved As Long, lpType As Long, lpData As Any, lpcbData As Long) As Long ' Note that if you declare the lpData parameter as String, you must pass it By Value. Private Const REG_BINARY = 3 Private Const HKEY_LOCAL_MACHINE = &H80000002 Private Const ERROR_SUCCESS = 0&Private Function sGetXPCDKey() As String Dim bDigitalProductID() As Byte Dim bProductKey() As Byte Dim ilByte As Long Dim lDataLen As Long Dim hKey As Long If RegOpenKey(HKEY_LOCAL_MACHINE, "SOFTWARE\MICROSOFT\Windows NT\CurrentVersion", hKey) = ERROR_SUCCESS Then lDataLen = 164 ReDim Preserve bDigitalProductID(lDataLen) If RegQueryValueEx(hKey, "DigitalProductId", 0&, REG_BINARY, bDigitalProductID(0), lDataLen) = ERROR_SUCCESS Then ReDim Preserve bProductKey(14) For ilByte = 52 To 66 bProductKey(ilByte - 52) = bDigitalProductID(ilByte) Next ilByte Else sGetXPCDKey = "无法读取注册信息" Exit Function End If Else sGetXPCDKey = "无法读取注册信息" Exit Function End If Dim bKeyChars(0 To 24) As Byte bKeyChars(0) = Asc("B") bKeyChars(1) = Asc("C") bKeyChars(2) = Asc("D") bKeyChars(3) = Asc("F") bKeyChars(4) = Asc("G") bKeyChars(5) = Asc("H") bKeyChars(6) = Asc("J") bKeyChars(7) = Asc("K") bKeyChars(8) = Asc("M") bKeyChars(9) = Asc("P") bKeyChars(10) = Asc("Q") bKeyChars(11) = Asc("R") bKeyChars(12) = Asc("T") bKeyChars(13) = Asc("V") bKeyChars(14) = Asc("W") bKeyChars(15) = Asc("X") bKeyChars(16) = Asc("Y") bKeyChars(17) = Asc("2") bKeyChars(18) = Asc("3") bKeyChars(19) = Asc("4") bKeyChars(20) = Asc("6") bKeyChars(21) = Asc("7") bKeyChars(22) = Asc("8") bKeyChars(23) = Asc("9") Dim nCur As Integer Dim sCDKey As String Dim ilKeyByte As Long Dim ilBit As Long For ilByte = 24 To 0 Step -1 nCur = 0 For ilKeyByte = 14 To 0 Step -1 nCur = nCur * 256 Xor bProductKey(ilKeyByte) bProductKey(ilKeyByte) = Int(nCur / 24) nCur = nCur Mod 24 Next ilKeyByte sCDKey = Chr(bKeyChars(nCur)) & sCDKey If ilByte Mod 5 = 0 And ilByte <> 0 Then sCDKey = "-" & sCDKey Next ilByte sGetXPCDKey = sCDKey End Function
可以实现,我试过,是在一个国外网站上找到了。国内可能不好找到。。这里不上传文件,如果可以,我传一个示例上来了。我在XP的SP2平台试过,没有问题。建议大家都可以学学。PS: 大家可以结合微软发布的XP/2003系统CDKEY修改脚本做一个属于自己的专用CDKEY修改工具。(KEYFINDER这个软件应该大家有用过吧。其实它修改XP的序列号时只是调用微软提供的脚本而已。可以用UPX -D解压缩该文件,再用WINRAR打开就可以看到了。) 想要看微软的VBS脚本,请查看: http://support.microsoft.com/kb/328874/zh-cn 可以在VB中引用MICROSOFT WMI SCRIPTING V1.2 LIBRARY(有的系统的可能是V1.1的),然后,将微软的脚本改一下就可以了.如下: Dim obj As SWbemObject Dim result On Error Resume Next Err.Clear Dim VOL_PROD_KEY As String VOL_PROD_KEY = UCase(Replace(Trim(Text1.Text), "-", "")) For Each obj In GetObject("winmgmts:{impersonationLevel=impersonate}").InstancesOf("win32_WindowsProductActivation") result = obj.SetProductKey(VOL_PROD_KEY) If Err.Number = 0 Then MsgBox "产品序列号已经成功更新", vbOKOnly + vbInformation, "更新成功" Else MsgBox "对不起,输入的序列号不正确,请重新输入!", vbOKOnly, "更新失败" Err.Clear Exit For End If Next '以上为主要部份的代码,自己引用的时候,可以进一步进行修改。加上错误判断等。注:以上内容引用自微软的脚本,可能对于部份盗版的系统不适用。并请不要用来非法途径。
我用过几个小程序,可以查看XP的安装序列号..像硬件检测工具EVEREST就可以看到..我想序列号肯定是被加密放在某个地方了.听说不是放在注册表中.这个本人真是不得而知.如果有谁知道请告知一二.
Private Declare Function RegOpenKey Lib "advapi32.dll" Alias "RegOpenKeyA" (ByVal hKey As Long, ByVal lpSubKey As String, phkResult As Long) As Long
Private Declare Function RegQueryValueEx Lib "advapi32.dll" Alias "RegQueryValueExA" (ByVal hKey As Long, ByVal lpValueName As String, ByVal lpReserved As Long, lpType As Long, lpData As Any, lpcbData As Long) As Long ' Note that if you declare the lpData parameter as String, you must pass it By Value.
Private Const REG_BINARY = 3
Private Const HKEY_LOCAL_MACHINE = &H80000002
Private Const ERROR_SUCCESS = 0&Private Function sGetXPCDKey() As String
Dim bDigitalProductID() As Byte
Dim bProductKey() As Byte
Dim ilByte As Long
Dim lDataLen As Long
Dim hKey As Long
If RegOpenKey(HKEY_LOCAL_MACHINE, "SOFTWARE\MICROSOFT\Windows NT\CurrentVersion", hKey) = ERROR_SUCCESS Then
lDataLen = 164
ReDim Preserve bDigitalProductID(lDataLen)
If RegQueryValueEx(hKey, "DigitalProductId", 0&, REG_BINARY, bDigitalProductID(0), lDataLen) = ERROR_SUCCESS Then
ReDim Preserve bProductKey(14)
For ilByte = 52 To 66
bProductKey(ilByte - 52) = bDigitalProductID(ilByte)
Next ilByte
Else
sGetXPCDKey = "无法读取注册信息"
Exit Function
End If
Else
sGetXPCDKey = "无法读取注册信息"
Exit Function
End If
Dim bKeyChars(0 To 24) As Byte
bKeyChars(0) = Asc("B")
bKeyChars(1) = Asc("C")
bKeyChars(2) = Asc("D")
bKeyChars(3) = Asc("F")
bKeyChars(4) = Asc("G")
bKeyChars(5) = Asc("H")
bKeyChars(6) = Asc("J")
bKeyChars(7) = Asc("K")
bKeyChars(8) = Asc("M")
bKeyChars(9) = Asc("P")
bKeyChars(10) = Asc("Q")
bKeyChars(11) = Asc("R")
bKeyChars(12) = Asc("T")
bKeyChars(13) = Asc("V")
bKeyChars(14) = Asc("W")
bKeyChars(15) = Asc("X")
bKeyChars(16) = Asc("Y")
bKeyChars(17) = Asc("2")
bKeyChars(18) = Asc("3")
bKeyChars(19) = Asc("4")
bKeyChars(20) = Asc("6")
bKeyChars(21) = Asc("7")
bKeyChars(22) = Asc("8")
bKeyChars(23) = Asc("9")
Dim nCur As Integer
Dim sCDKey As String
Dim ilKeyByte As Long
Dim ilBit As Long For ilByte = 24 To 0 Step -1
nCur = 0
For ilKeyByte = 14 To 0 Step -1
nCur = nCur * 256 Xor bProductKey(ilKeyByte)
bProductKey(ilKeyByte) = Int(nCur / 24)
nCur = nCur Mod 24
Next ilKeyByte
sCDKey = Chr(bKeyChars(nCur)) & sCDKey
If ilByte Mod 5 = 0 And ilByte <> 0 Then sCDKey = "-" & sCDKey
Next ilByte
sGetXPCDKey = sCDKey
End Function
想要看微软的VBS脚本,请查看: http://support.microsoft.com/kb/328874/zh-cn
可以在VB中引用MICROSOFT WMI SCRIPTING V1.2 LIBRARY(有的系统的可能是V1.1的),然后,将微软的脚本改一下就可以了.如下: Dim obj As SWbemObject
Dim result
On Error Resume Next
Err.Clear
Dim VOL_PROD_KEY As String
VOL_PROD_KEY = UCase(Replace(Trim(Text1.Text), "-", ""))
For Each obj In GetObject("winmgmts:{impersonationLevel=impersonate}").InstancesOf("win32_WindowsProductActivation")
result = obj.SetProductKey(VOL_PROD_KEY)
If Err.Number = 0 Then
MsgBox "产品序列号已经成功更新", vbOKOnly + vbInformation, "更新成功"
Else
MsgBox "对不起,输入的序列号不正确,请重新输入!", vbOKOnly, "更新失败"
Err.Clear
Exit For
End If
Next
'以上为主要部份的代码,自己引用的时候,可以进一步进行修改。加上错误判断等。注:以上内容引用自微软的脚本,可能对于部份盗版的系统不适用。并请不要用来非法途径。