• C# 注册机功能开发,机器码设计


    前言


     本文将使用一个NuGet公开的组件技术来实现机器码注册码功能开发,提供了一些简单的API,来方便的实现。

    在Visual Studio 中的NuGet管理器中可以下载安装,也可以直接在NuGet控制台输入下面的指令安装:

    Install-Package HslCommunication
    

    NuGet安装教程  http://www.cnblogs.com/dathlin/p/7705014.html

    联系作者及加群方式(激活码在群里发放):http://www.hslcommunication.cn/Cooperation

     

    Summary


     在我开发完成一个软件后,尤其是要发放给别人使用的软件时,为了防止软件被恶意使用,有时候会采用注册机的机制来实现,比如我们会获取一串唯一的机器码,然后进行加密运算,程序在激活前就检测注册码是否正确,正确就启动程序,然后就启动失败,为了防止激活码被破解,通常都需要对程序加一层壳,也即是混淆,这样就能防止99%的开发者来破解注册码,要是真有大神愿意破解你的程序,只能证明你的程序很值钱了,即使大神破解,也免不了查出来要承担相应的法律责任。

    Reference


    CRC组件所有的功能类都在 HslCommunication.BasicFramework 命名空间,所以再使用之前先添加

    using HslCommunication.BasicFramework
    

     

    How to Use


    情景一:程序启动验证注册码,如果注册码存在且正确,窗口继续运行,否则弹出输入注册码窗口,除非输入了正确的注册码,否则窗体退出

    那么我们就需要在Form的Load方法中进行验证操作,先在Form下实例化授权类,然后需要提供一个你自己的从机器码到注册码的生成规则,实质上就是一个加密方法,你也可以参照下面的例子:

    private HslCommunication.BasicFramework.SoftAuthorize softAuthorize = null;
    
            private void FormRegisterTest_Load(object sender, EventArgs e)
            {
                softAuthorize = new HslCommunication.BasicFramework.SoftAuthorize();
                softAuthorize.FileSavePath = Application.StartupPath + @"Authorize.txt"; // 设置存储激活码的文件,该存储是加密的
                softAuthorize.LoadByFile();
    
                // 检测激活码是否正确,没有文件,或激活码错误都算作激活失败
                if (!softAuthorize.IsAuthorizeSuccess(AuthorizeEncrypted))
                {
                    // 显示注册窗口
                    using (HslCommunication.BasicFramework.FormAuthorize form =
                        new HslCommunication.BasicFramework.FormAuthorize(
                            softAuthorize,
                            "请联系XXX获取激活码",
                            AuthorizeEncrypted))
                    {
                        if (form.ShowDialog() != DialogResult.OK)
                        {
                            // 授权失败,退出
                            Close();
                        }
                    }
                }
    
                
    
                textBox1.Text = softAuthorize.GetMachineCodeString(); // 显示出机器码,情景二用
            }
    
    
            /// <summary>
            /// 一个自定义的加密方法,传入一个原始数据,返回一个加密结果
            /// </summary>
            /// <param name="origin"></param>
            /// <returns></returns>
            private string AuthorizeEncrypted(string origin)
            {
                // 此处使用了组件支持的DES对称加密技术
                return HslCommunication.BasicFramework.SoftSecurity.MD5Encrypt(origin, "12345678");
            }
    

    在没有激活过的情况下,运行窗体就会显示注册窗口。

    那么现在我们已经有机器码了,那么注册码怎么来呢?还记得上面的代码有个方法呢?就是AuthorizeEncrypted方法,只要吧这串机器码当作参数传入就可以获取到注册码,就可以填进去激活软件了。如果你填了错误的激活码,或是关闭了注册窗口,这个窗口就会退出。

    在此处我的机器码如上面所示,执行这个方法后的注册码为:B384A9552ACFABF3CF839FB8A7CEAB123A264457BA0C176AE13F412CDD76C338,如果你的窗口为主窗口,那么授权功能已经写完了,假设你把软件分发出去了,拷贝给别人了,别人运行后就会弹出输入注册码,你就叫他把机器码发给你,你在写个窗口计算出注册码发给对方,对方就可以运行软件了。

    情景二:不提供手动申请注册码,直接在软件里写死。每次分发软件都需要对方先提供机器码(你可以做个超级简单的exe,就只有显示机器码的功能),编译号软件再进行分发,这种更难破解。

    但是也牺牲了一定的灵活度,在窗口载入中的代码如下:

            private HslCommunication.BasicFramework.SoftAuthorize softAuthorize = null;
    
            private void FormRegisterTest_Load(object sender, EventArgs e)
            {
                softAuthorize = new HslCommunication.BasicFramework.SoftAuthorize();
                //softAuthorize.FileSavePath = Application.StartupPath + @"Authorize.txt"; // 设置存储激活码的文件,该存储是加密的
                //softAuthorize.LoadByFile();
    
                // 检测激活码是否正确,没有文件,或激活码错误都算作激活失败
                //if (!softAuthorize.IsAuthorizeSuccess(AuthorizeEncrypted))
                //{
                //    // 显示注册窗口
                //    using (HslCommunication.BasicFramework.FormAuthorize form =
                //        new HslCommunication.BasicFramework.FormAuthorize(
                //            softAuthorize,
                //            "请联系XXX获取激活码",
                //            AuthorizeEncrypted))
                //    {
                //        if (form.ShowDialog() != DialogResult.OK)
                //        {
                //            // 授权失败,退出
                //            Close();
                //        }
                //    }
                //}
    
                // 此处示例程序的机器码为:2E4C8EB0EBB8C4551C49AC277
                // 直接进行判断,允不允许运行
                if (!softAuthorize.CheckAuthorize("B384A9552ACFABF3CF839FB8A7CEAB123A264457BA0C176AE13F412CDD76C338", AuthorizeEncrypted))
                {
                    // 检测授权失败
                    Close();
                }
    
    
    
                textBox1.Text = softAuthorize.GetMachineCodeString();
            }
    
    
            /// <summary>
            /// 一个自定义的加密方法,传入一个原始数据,返回一个加密结果
            /// </summary>
            /// <param name="origin"></param>
            /// <returns></returns>
            private string AuthorizeEncrypted(string origin)
            {
                // 此处使用了组件支持的DES对称加密技术
                return HslCommunication.BasicFramework.SoftSecurity.MD5Encrypt(origin, "12345678");
            }
    

      

     目前的激活方式是基于本地的单机激活,如果需要采用联网激活的方式,那么也是非常容易实现的,在程序启动的时候,把机器码通过网络发送给服务器,根据服务器返回的值来判断有没有启动程序的权利。

     在C#下方便的网络交互,请参考如下的文章:

     http://www.cnblogs.com/dathlin/p/7697782.html

  • 相关阅读:
    点击表单提交 却打开了另存为对话框
    js中对象的复制,浅复制(浅拷贝)和深复制(深拷贝)
    html怎么隐藏input标签
    莫名其妙地改变了数组的值,原来是……
    addEventListener 用法
    JavaScript DOM元素常见操作详解【添加、删除、修改等】
    MySQL用户权限验证与管理方法详解
    mysql如何修改root用户的密码
    python案例
    IDEA启动报 Error:java: JDK isn't specified for module 'xxx' 已解决
  • 原文地址:https://www.cnblogs.com/dathlin/p/7832315.html
Copyright © 2020-2023  润新知