对于密码破译方面笔者不太懂,之前对于各种序列号的激活也有些臆测,自己根据想法做了个序列号验证的小框架,以后做的工具也可以用之保护一下下。。。

主要思路是:用户打开小工具后,系统检测是否已激活,如果未激活,系统给出一个随机数字码(每次重新打开之后会变化),用户根据随机码向提供者索要对应激活码用于激活

关于是否激活的判断:笔者这里做法是,正常激活后会在注册表里写对应值,如果检测到这个值就不会再次提醒用户激活

1、随机码的生成,根据随机数Rnd来生成满足条件的一串数字,直接上代码

Sub SetRanId()
    Randomize
    Dim RanId As Long

SetRndId:
    RanId = Rnd * 100000000 + _
                   Rnd * 10000000 + _
                   Rnd * 1000000 + _
                   Rnd * 100000 + _
                   Rnd * 10000 + _
                   Rnd * 1000 + _
                   Rnd * 100 + _
                   Rnd * 10
    If RanId < 10000000 Or RanId > 99999999 Then GoTo SetRndId
    FrmCheckId.TextBox1.Value = RanId

End Sub

效果如下图:

2、对应激活序列号的校验

其实这里笔者做的只是依据随机码,通过一组规则生成序列号,直接上代码,可以看出校验规则其实我已经做了封装,在这个类中:MyMethod.KUSY

'序列号设置
Sub CheckTheId()
    On Error GoTo Err_CheckId
    Dim rId As Long
    Dim sId As String
    Dim MyFnc
    
    rId = CLng(FrmCheckId.TextBox1.Value)
    sId = FrmCheckId.TextBox2.Value
    Set MyFnc = CreateObject("MyMethod.KUSY")
    
    If Len(sId) >= 8 Then
        If MyFnc.CheckId(sId, rId) Then
            MsgBox "已激活!", vbInformation
            idFlg = True
            Call MyFnc.RegChk(idFlg, RegFlg)
            Unload FrmCheckId
        End If
    End If
    
    Set MyFnc = Nothing
    Exit Sub
Err_CheckId:
    MsgBox Err.Description, vbCritical
    
End Sub

3、关于封装类KUSY的方法也贴了出来

(1)检查注册表是否已有键值,如果没有,写入设定好的键值,如果有,返回True,说明工具已激活,不再进行序列号的激活处理

'注册表检查以及设置
Function RegChk(ByVal idFlg As Boolean, ByRef RegFlg As Boolean) As Boolean
    On Error GoTo Err_RegChk
    Dim s As String
    
    RegChk = False
    Set WSH = CreateObject("WSCRIPT.SHELL")
    s = WSH.RegRead(RegPK & PjName & "\" & RegX & "\" & KeyName)
    
Err_RegChk:
    If s = KeyVal Then
        RegFlg = True
        RegChk = True
    Else
        RegFlg = False
        RegChk = False
    End If
    
    If RegFlg = False And idFlg = True Then
        WSH.RegWrite RegPK & PjName & "\" & RegX & "\" & KeyName, KeyVal
        RegChk = True
    End If

End Function

(2)序列号生成规则,如下,可以看到笔者随意设置了一组规则,这个就是需要填写的激活码了

'序列号取得
Function GetMyId(ByVal rId As Long) As String
    Dim id(1 To 8) As Long
    Dim flg As String
    Dim result As String
    
    For i = 1 To 8
        id(i) = Mid(CStr(rId), i, 1)
        Select Case i
            Case 1
                id(i) = id(i) * 10 Mod 9
            Case 2
                id(i) = id(i) * 10 Mod 7
            Case 3
                id(i) = id(i) * id(i)
                If id(i) > 10 Then id(i) = (id(i) - 10) Mod 9
            Case 4
                If id(i) > id(i - 1) Then id(i) = id(i) - id(i - 1)
            Case 5
                id(i) = id(i) * 8 Mod 9
            Case 6
                id(i) = id(i) * 20 Mod 9
            Case 7
                If id(i) > 5 Then
                        id(i) = id(i) / 2
                Else
                        id(i) = id(i) + 1
                End If
            Case 8
                id(i) = Left(CStr(id(i) * 9), 1)
        End Select
    Next
    
    If id(3) + id(5) > 3 Then flg = "k"
    If id(3) + id(5) > 8 Then flg = "u"
    If id(3) + id(5) > 13 Then flg = "s"
    If id(3) + id(5) > 17 Then flg = "y"
    
    For Each s In id
        result = result & s
    Next
    
    'result = Replace(Join(id, " "), " ", "")
    GetMyId = result & flg
    
End Function

(3)校验用户输入函数,直接返回布尔值,为什么要写这个而不是直接在vba代码中判断用户输入的序列号是否等于规则生成的呢?因为如果不用下面这个函数,用户直接在vbe中debug就可以获取到规则生成的序列号了

Function CheckId(ByVal sId As String, ByVal rId As Long) As Boolean
    If sId = GetMyId(rId) Then
        CheckId = True
    Else
        CheckId = False
    End If
    
End Function

4、对于序列号生成规则的代码,可以独立出来,用于生成序列号值,把这个值给用户来激活

如下图:

(1)管理员

(2)用户

5、其他的工具以后就可以使用这个序列号验证框架了,使用方法如下

(1)打开时加载dll文件,关闭时移除

Private Sub Workbook_Open()
    On Error GoTo Err_WorkOpen
    Application.Visible = False
    
    'Dll加载
    If Dir(ThisWorkbook.Path & "\MyMethod.dll") <> "" Then
        Shell "Regsvr32 /s " & Chr(34) & ThisWorkbook.Path & "\MyMethod.dll" & Chr(34)
    Else
        MsgBox "DLL文件不存在,请确认!", vbCritical
        Exit Sub
    End If
    
    FrmCheckId.Show
    Application.Visible = True
    Exit Sub
Err_WorkOpen:
    MsgBox Err.Description, vbCritical
End Sub

Private Sub Workbook_BeforeClose(Cancel As Boolean)
    Shell "Regsvr32 /s /u " & Chr(34) & ThisWorkbook.Path & "\MyMethod.dll" & Chr(34)
End Sub

(2)工具中添加UserForm

初始化时调用KUSY.RegChk,代码如下:

Private Sub UserForm_Initialize()
    On Error GoTo Err_Init
    Dim idFlg As Boolean
    Dim Myfnc
    
    HideFlg = False
    Set Myfnc = CreateObject("MyMethod.KUSY")
    
    '检查注册表
    If Myfnc.RegChk(idFlg, RegFlg) = True Then
        HideFlg = True
        GoTo EndFrm
    End If

With FrmCheckId
        .Caption = "序列号验证--V1.1"
        .BackColor = ColorConstants.vbWhite
        .BorderStyle = fmBorderStyleNone
        .Width = 200
        .Height = 120
    End With
    
    TextBox1.Enabled = False
    
    Call SetRanId
    Set Myfnc = Nothing
EndFrm:
    Exit Sub
Err_Init:
    MsgBox Err.Description, vbCritical
End Sub

 

vba实现工具的序列号验证框架的更多相关文章

  1. jQuery验证框架 .

          目录视图 摘要视图 订阅 “程序人生”中国软件开发者职业生涯调查     CSDN社区“三八节”特别活动      开发者职业生涯调查之未来 jQuery验证框架 分类: JQuery 2 ...

  2. SpringMVC 使用验证框架 Bean Validation(上)

    SpringMVC 使用验证框架 Bean Validation(上) 对于任何一个应用而言在客户端做的数据有效性验证都不是安全有效的,这时候就要求我们在开发的时候在服务端也对数据的有效性进行验证. ...

  3. .NET领域驱动设计—初尝(一:疑问、模式、原则、工具、过程、框架、实践)

     .NET领域驱动设计—初尝(一:疑问.模式.原则.工具.过程.框架.实践) 2013-04-07 17:35:27 标签:.NET DDD 驱动设计 原创作品,允许转载,转载时请务必以超链接形式标明 ...

  4. java bean 属性验证框架 valid

    项目介绍 java 开发中,参数校验是非常常见的需求. 但是 hibernate-validator 在使用过程中,依然会存在一些问题. 特性 支持 fluent-validation 支持 jsr- ...

  5. jQuery Validate验证框架详解

    转自:http://www.cnblogs.com/linjiqin/p/3431835.html jQuery校验官网地址:http://bassistance.de/jquery-plugins/ ...

  6. strus2验证框架

    为什么要用验证框架? 当验证规划比较复杂时,Action类的代码江边的非常繁琐,假如我们要对电话号码进行验证,是非常麻烦的. 验证框架的优点 Struts2中内置了一个验证框架,将常用的验证规则进行了 ...

  7. 【积累】validate验证框架的使用

    validate验证框架的使用:用验证框架可以很方便的验证前端页面输入的内容可以自定义验证方法 内容:0:环境搭建 1:基础用法 2:自定义用法 0:基本环境的搭建 0.1:下载js文件 0.2:引入 ...

  8. Struts2验证框架实例

    今天写了个Struts验证框架的实例,总算把验证框架弄清楚了. 上一篇Struts实例的action没有继承ActionSupport类,虽然也可以实现action的功能,但是却不能应用Struts提 ...

  9. struts2 的验证框架validation如何返回json数据 以方便ajax交互

    struts2 的验证框架validation简单,好用,但是input只能输出到jsp页面通过struts2的标签<s:fielderror  />才能取出,(EL应该也可以). 如果使 ...

随机推荐

  1. runloop是一个系统架构、是一个系统

    信号与系统的系统: 事件源.派发系统.事件传播链.事件处理函数: 等组成的整体: 强调的重点是联系与结合.

  2. DiaryDayBayDayDiary

    Every day, an email reminder will be sent to you, along with a random copy of your previous diary. Y ...

  3. round.606.div2

    A. Happy Birthday, Polycarp! 这个题意我确实没有看懂. 沃日,我懂了,我感觉我似乎都能切掉这题. B. Make Them Odd 这个我也能看懂.

  4. 【题解】洛谷 P1449 后缀表达式

    目录 题目 思路 \(Code\) 题目 P1449 后缀表达式 思路 栈.题目说的不是很清楚,没说包含什么操作.除法用整数除法就行. 先string读入字符串,然后从前往后看如果是个数字就入栈,如果 ...

  5. Program terminated with signal 6, Aborted. (最后发现是数组越界导致)

    外网崩溃现象: 1.多台物理机中的多个进程消失,而且都是场景进程. 2.core文件都很小,看了 ulimit -a 和 cat proc/pid/limits  (都很正常.看这个是为了以后core ...

  6. Hash总结

    算法介绍 这个没什么好说的,就是一段比较简单的代码,具体的话要看题目. 自然溢出 这个是比较好用而且容易被卡的一种Hash方式. 用\(2^{64}\)当模数然后做\(Hash\),常数比较小. 单模 ...

  7. module 'torch' has no attribute 'gesv'

    新版torch不支持gesv,使用solve函数. Kt, _ = torch.gesv(P.mm(H.t()).t(), S) 改成 Kt, _ = torch.solve(P.mm(H.t()). ...

  8. Appium入门脚本

    没有用框架的代码实现登录功能: import time from selenium import webdriver # 创建字典 desired_caps = {} desired_caps['pl ...

  9. [原创]Android Monkey测试工具使用介绍

    [原创]Android Monkey测试工具使用介绍 1 Android Monkey介绍 Monkey是Android中的一个命令行工具,可以运行在模拟器里或实际设备中.它向系统发送伪随机的用户事件 ...

  10. 高并发&高可用系统的常见应对策略 秒杀等-(阿里)

    对于一个需要处理高并发的系统而言,可以从多个层面去解决这个问题. 1.数据库系统:数据库系统可以采取集群策略以保证某台数据库服务器的宕机不会影响整个系统,并且通过负载均衡策略来降低每一台数据库服务器的 ...