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

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

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

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. arduino入门笔记

    以 ARDUINO® UNO R3为例 一.将板子与电脑连接 初次使用会自动安装驱动. Arduino Uno通过USB连接到计算机或外部电源自动获取电源,因此此时能看到电源指示灯会亮. 我的L13也 ...

  2. Codeforces Round #552 (Div. 3)-D-Walking Robot-(贪心)

    http://codeforces.com/contest/1154/problem/D 解题: 1.无光的时候优先使用太阳能电池. 2.有光的时候 (1)太阳能电池没满电,让它充,使用普通电池 (2 ...

  3. BZOJ 4411: [Usaco2016 Feb]Load balancing 线段树+二分

    code: #include <bits/stdc++.h> #define N 100060 #define M 1000000 #define lson x<<1 #def ...

  4. bzoj 1260涂色 题解

    题面 区间dp, 我学的也不怎么好. myj说动态规划就是搜索的无限剪枝. 所以是搜了网上的代码, 看了看. 思路就是枚举区间,f数组就是存储从i到j需要的最少次数, 当然一开始他们的值要先设置一个很 ...

  5. 洛谷P2038 无线网络发射器选址

    题目描述 随着智能手机的日益普及,人们对无线网的需求日益增大.某城市决定对城市内的公共场所覆盖无线网. 假设该城市的布局为由严格平行的 \(129\) 条东西向街道和 \(129\) 条南北向街道所形 ...

  6. jmeter(四十五)常用Beanshell脚本

    整理了一批jmeter常用的beanshell脚本供大家参考! 时间戳 import java.text.SimpleDateFormat; import java.util.Calendar; im ...

  7. Couldn't open file /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7 解决办法(转)

    使用yum update 更新的时候出现 “Couldn’t open file /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7” 这样的提示,去CentOS的官网:htt ...

  8. Annotation-based argument resolution 部分2

    HandlerMethodArgumentResolver的抽象實現AbstractNamedValueMethodArgumentResolver下的子类  部分1 RequestParamMapM ...

  9. JDK性能监控命令

    阅读原文 查看虚拟机进程:jps 命令 jps 命令可以列出所有的 Java 进程.如果 jps 不加任何参数,可以列出 Java 程序的进程 ID 以及 Main 函数短名称,如下所示. $ jps ...

  10. 阿里云Maven仓库地址setting配置

    <?xml version="1.0" encoding="UTF-8"?> <settings xmlns="http://mav ...