注册 登录
编程论坛 VB6论坛

请问这段是对C盘序列号如何运算

lriong 发布于 2015-03-02 00:41, 506 次点击
小弟才刚开始接触VB,有多地方不懂!恳请指导一下有这以下这段,只知道是读C盘序列号,然后运算,有大家指点下是如何运算,谢谢!

Private Sub Form_Initialize()
 Dim l As Integer, i As Integer, HddIDMid() As String, HddID As String
HddID = GetSerialNumber("C:\")
'Debug.Print HddID

'Debug.Print Val(Mid(HddID, 1, 1))

0 l = Len(Trim(HddID))
ReDim HddIDMid(l)
For i = 1 To l Step 1
    HddIDMid(i) = ChrW(Val(Mid(HddID, i, 1)) + 97)   '单字符解密
'    Debug.Print HddIDMid(i)
   
Next
HddID = ""
For i = l To 1 Step -1
    HddID = Trim(HddIDMid(i)) + Trim(HddID)          '组合后得到密码
Next
'Debug.Print HddID
'Debug.Print IWSH.RegRead("HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\001")
If HddID <> IWSH.RegRead("HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\001") Then ' 只能读ASCII字符,而GetSeting函数可以读非ASCII字符(ASCII码超出255)
    MsgBox "1、此处省略。" & Chr(13) & _
           "2、此处省略。" & Chr(13) & _
           "3、此处省略。" & Chr(13) & Chr(13) & _
4 回复
#2
lianyicq2015-03-02 09:39
回复 楼主 lriong
粗略解释一下:
VB没有getserialnumber函数,通常是自定义函数。此处应该是调用了API的GetVolumeInformation函数,将逻辑C盘的序列号赋值到hddid中(序列号是一串数字)。
单字符解密是将hddid中的每一个字符数字加偏移数97后用chrw函数转码得到。
最后再用Wscript.Shell对象读取注册表中的数据与之比较。
一般认为磁盘在逻辑盘格式化后或重新分区后,逻辑序列号会改变。
网上搜搜有现成的读取物理硬盘序列号的代码。

[ 本帖最后由 lianyicq 于 2015-3-2 10:19 编辑 ]
#3
lriong2015-03-02 14:03
回复 2楼 lianyicq
请问版主,我在运行这个工程文件时,提示这个自定义函数没有定义,我如何才能让它能正常运行呢?
#4
lianyicq2015-03-02 16:59
可以直接调用API函数GetVolumeInformation
Public Declare Function GetVolumeInformation Lib "kernel32" Alias "GetVolumeInformationA" (ByVal lpRootPathName As String, ByVal lpVolumeNameBuffer As String, ByVal nVolumeNameSize As Long, lpVolumeSerialNumber As Long, lpMaximumComponentLength As Long, lpFileSystemFlags As Long, ByVal lpFileSystemNameBuffer As String, ByVal nFileSystemNameSize As Long) As Long
比如获取C盘序列号:
程序代码:
Private Declare Function GetVolumeInformation Lib "kernel32" Alias "GetVolumeInformationA" (ByVal lpRootPathName As String, ByVal lpVolumeNameBuffer As String, ByVal nVolumeNameSize As Long, lpVolumeSerialNumber As Long, lpMaximumComponentLength As Long, lpFileSystemFlags As Long, ByVal lpFileSystemNameBuffer As String, ByVal nFileSystemNameSize As Long) As Long

Private Sub Form_Load()
     Dim DriverName As String
     Dim SerialNum As Long
     Dim Buffer1 As String
     Dim Buffer2 As String
     DriverName = "c:\"
     Buffer1 = String$(255, 0)
     Buffer2 = String$(255, 0)
     GetVolumeInformation DriverName, Buffer1, Len(Buffer1), SerialNum, 0, 0, Buffer2, Len(Buffer2)
     Form1.Caption = SerialNum
End Sub

 
#5
lriong2015-03-07 21:01
十分感谢版主的解答!大致明白了。
1