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

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

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

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. [RN] React Native 键盘管理 在Android TextInput遮盖,上移等问题解决办法

    React Native 键盘管理 在Android TextInput遮盖,上移等问题解决办法 解决办法: 打开android工程,在AndroidManifest.xml中配置如下: <ac ...

  2. [Java] Spring boot 的maven设置阿里云仓库

    Spring boot 的maven设置阿里云仓库 打开根目录下的 pom.xml 文件,在对应为止出加入如下 红色 代码: <build> <plugins> <plu ...

  3. ES5新增的数组方法

    ES5新增:(IE9级以上支持)1.forEach():遍历数组,无返回值,不改变原数组.2.map():遍历数组,返回一个新数组,不改变原数组.3.filter():过滤掉数组中不满足条件的值,返回 ...

  4. 洛谷 P5269 欧稳欧再次学车 题解

    P5269 欧稳欧再次学车 题目背景 请自行脑补一张欧稳欧学车的图 题目描述 欧稳欧学车时经常用一辆橡树车练习.这辆橡树车共有 \(N\) 个挡位,欧稳欧每秒可以把挡位增加或减少 \(1\),初始时( ...

  5. Windows 10下Xilinx ISE需要注意的事项。

    一是安装.可以在Windows 10下安装Xilinx ISE 14.7. 详见:https://www.eevblog.com/forum/xilinx/guide-getting-xilinx-i ...

  6. nginx rewrite规则说明

    格式:rewrite regex replacement [flag] * rewrite配置可以在server.location以及if配置段内生效 * regex是用于匹配URI的正则表达式,其不 ...

  7. CentOS 7 上 安装 jira

    步骤 .安装jdk8 https://www.cnblogs.com/sea-stream/p/10404360.html .安装mysql wget -i -c http://dev.mysql.c ...

  8. exception The absolute uri: [http://java.sun.com/jsp/jstl/core] cannot be resolved in either web.xml or the jar files deployed with this application

        1.情景展示 eclipse,运行web项目时,报错信息如下: The absolute uri: [http://java.sun.com/jsp/jstl/core] cannot be ...

  9. mybatis在sql中的CDATA区

    示例 <if test="startTime != null"> <![CDATA[ AND rra.create_time >= #{startTime} ...

  10. OO助教的退休感想

    深夜失眠+刚赶完火车的胡言乱语,切莫当真,择日修改 一年前,我在学姐的怂恿鼓励下,加上了吴老师的微信,表达了想担任下学期的OO助教的想法.三天后,我到新主楼参加OO助教的面试,其实还是蛮紧张的,毕竟自 ...