想要保护程序?加密狗太麻烦,试试这个吧(Unity3D)

简介: 在使用Unity进行软件开发的时候,会遇到实现程序的使用次数限制,以及使用的时间区间限制,说白就是保护程序的一种措施。我们用的方法是,新建注册表,增加键值对,修改键值,完成对程序的使用权限控制。当然还有更加安全的方法,包括获取硬盘编号,还有电子狗加密等等,这些就以后讨论。

一、前言

在使用Unity进行软件开发的时候,会遇到实现程序的使用次数限制,以及使用的时间区间限制,说白就是保护程序的一种措施。我们用的方法是,新建注册表,增加键值对,修改键值,完成对程序的使用权限控制。当然还有更加安全的方法,包括获取硬盘编号,还有电子狗加密等等,这些就以后讨论。


二、时间限制

修改Start()函数里的 minTime和maxTime时间即可。限制时间也可精确到秒,比如:

DateTime minTime = Convert.ToDateTime("2019-4-23 12:22:05");

代码:

using System;
using UnityEngine;
public class SetUserTime : MonoBehaviour
{
    //用户是否超过使用日期
    bool Islate = false;
    // Use this for initialization
    void Start()
    {
        //===(比如8月1日开始计算,到8月8日结束)
        //小于minTime 时间或者大于maxTime时间 ,将不可使用
        DateTime minTime = Convert.ToDateTime("2019-8-1 15:29:00");
        DateTime maxTime = Convert.ToDateTime("2019-8-8 15:29:00");
        if (minTime > DateTime.Now || DateTime.Now > maxTime)
        {
            //不在使用时间内,会直接退出程序
            Islate = true;
        }
        SetPlayUseNumber();
    }
    /// <summary>
    /// 设置用户使用次数
    /// </summary>
    void SetPlayUseNumber()
    {
        //异常捕捉,如果发生异常,比如闪退,限制改为false
        try
        {
            //限制使用时间,如果不在这个区间内,直接退出程序
            if (Islate)
            {
                Invoke("OnExit", 2);//延时退出,可在退出前显示提示消息
            }
        }
        catch
        {
            Islate = false;
        }
    }
    //出处程序
    private void OnExit()
    {
        Application.Quit();
    }
}
复制代码

这里就是使用了时间进行判断,设置这个程序可以使用的

开始时间:DateTime minTime = Convert.ToDateTime("2019-8-1 15:29:00"); 结束时间:DateTime maxTime = Convert.ToDateTime("2019-8-8 15:29:00");

这个脚本挂载到程序启动页,每次启动的时候,程序会先去判断程序是否在有效期。

不在有效期就会自动退出程序。


三、次数限制

SetPlayUseNumber()为限制次数方法,修改键值名就可以重新计算("UseTime")

本脚本是限制时间和次数的搭配使用,可自行修改。

脚本:

using Microsoft.Win32;
using UnityEngine;
public class SetUserTime1 : MonoBehaviour
{
    //最大使用次数
    int MaxUsageCount = 3;
    void Start()
    {
        SetPlayUseNumber();
    }
    /// <summary>
    /// 设置用户使用次数
    /// </summary>
    void SetPlayUseNumber()
    {
        //创建键值对
        RegistryKey RootKey, RegKey;
        //项名为:HKEY_CURRENT_USER\Software
        RootKey = Registry.CurrentUser.OpenSubKey("SOFTWARE", true);
        //打开子项:HKEY_CURRENT_USER\Software\MyRegDataApp
        if ((RegKey = RootKey.OpenSubKey("TestToControlUseTime", true)) == null)
        {
            RootKey.CreateSubKey("TestToControlUseTime");               //不存在,则创建子项
            RegKey = RootKey.OpenSubKey("TestToControlUseTime", true);  //打开键值
            RegKey.SetValue("UseTime7", (object)MaxUsageCount);         //创建键值,存储最大可使用次数
            return;
        }
        //异常捕捉,如果出现程序异常,比如闪退,次数更新为开始设置的最大使用次数
        try
        {
            object usetime = RegKey.GetValue("UseTime7");        //读取键值,可使用次数
            print("还可以使用:" + usetime + "次");
            //使用次数减1
            int newtime = int.Parse(usetime.ToString()) - 1;
            if (newtime < 0)
            {
                //到期退出程序
                RegKey.SetValue("UseTime7", (object)newtime);
                Invoke("OnExit", 2);//延时退出,可在退出前显示提示消息
            }
            else
            {
                RegKey.SetValue("UseTime7", (object)newtime);    //更新键值,可使用次数减1
            }
        }
        catch
        {
            RegKey.SetValue("UseTime7", (object)MaxUsageCount);
            print("更新使用次数");
        }
    }
    /// <summary>
    /// 退出程序
    /// </summary>
    private void OnExit()
    {
        Application.Quit();
    }
}
复制代码

这套方法主要是用到了注册表,Win系统都会有注册表,可以在里面写入数据

每次启动程序,就会先判断注册表中是否有值,值是否大于0

小于0,就让程序自动退出。

但是,这个方法不好的地方是,如果程序代码被破解,就可以找到这个注册表,去修改这个注册表。


四、同时控制时间和次数

using Microsoft.Win32;
using System;
using UnityEngine;
public class SetUserTime2 : MonoBehaviour
{
    //最大使用次数
    int MaxUsageCount = 3;
    //用户是否超过使用日期
    bool Islate = false;
    void Start()
    {
        //===(比如8月1日开始计算,到8月8日结束)
        //小于minTime 时间或者大于maxTime时间 ,将不可使用
        DateTime minTime = Convert.ToDateTime("2019-8-1 15:29:00");
        DateTime maxTime = Convert.ToDateTime("2019-8-8 15:29:00");
        if (minTime > DateTime.Now || DateTime.Now > maxTime)
        {
            //不在使用时间内,会直接退出程序
            Islate = true;
        }
        SetPlayUseNumber();
    }
    /// <summary>
    /// 设置用户使用次数
    /// </summary>
    void SetPlayUseNumber()
    {
        //创建键值对
        RegistryKey RootKey, RegKey;
        //项名为:HKEY_CURRENT_USER\Software
        RootKey = Registry.CurrentUser.OpenSubKey("SOFTWARE", true);
        //打开子项:HKEY_CURRENT_USER\Software\MyRegDataApp
        if ((RegKey = RootKey.OpenSubKey("TestToControlUseTime", true)) == null)
        {
            RootKey.CreateSubKey("TestToControlUseTime");               //不存在,则创建子项
            RegKey = RootKey.OpenSubKey("TestToControlUseTime", true);  //打开键值
            RegKey.SetValue("UseTime7", (object)MaxUsageCount);         //创建键值,存储最大可使用次数
            return;
        }
        //异常捕捉,如果出现程序异常,比如闪退,次数更新为开始设置的最大使用次数
        try
        {
            object usetime = RegKey.GetValue("UseTime7");        //读取键值,可使用次数
            print("还可以使用:" + usetime + "次");
            //使用次数减1
            int newtime = int.Parse(usetime.ToString()) - 1;
            if (newtime < 0 || Islate)
            {
                //到期退出程序
                RegKey.SetValue("UseTime7", (object)newtime);
                Invoke("OnExit", 2);//延时退出,可在退出前显示提示消息
            }
            else
            {
                RegKey.SetValue("UseTime7", (object)newtime);    //更新键值,可使用次数减1
            }
        }
        catch
        {
            RegKey.SetValue("UseTime7", (object)MaxUsageCount);
            Islate = false;
            print("更新使用次数");
        }
    }
    /// <summary>
    /// 退出程序
    /// </summary>
    private void OnExit()
    {
        Application.Quit();
    }
}
复制代码

这套方法,就吸取了时间和次数的优点,改善了缺点,就算你修改了注册表。

还会有时间进行判断。

但是,也可以进行修改本地电脑的时候进行破解。

最优的方式,还是根据电脑的硬盘码然后生成唯一标示发给服务器,服务器然后就设置开始时间结束时间,这样每次进入程序的时候,会先判断时间。



相关文章
关于 qml程序在目标机上开发时运行出现不断闪屏现象的 解决方法
关于 qml程序在目标机上开发时运行出现不断闪屏现象的 解决方法
关于 qml程序在目标机上开发时运行出现不断闪屏现象的 解决方法
|
XML 存储 前端开发
想要制作沙盒游戏?那么这一款插件你一定不能错过(Unity3D)
今天给大家介绍一款简单而又强大的多人沙盒游戏开发插件VOXL。 VOXL是一款简单且易于理解的多重体素沙盒游戏,使用Unity的UNET网络系统开发。 由于服务器和客户端是一体的,所以我们不用再费心搭建服务器,会大大提高我们的开发效率。 VOXL目前只包含大约2500行干净、优雅和易于理解的源代码。
|
3月前
|
移动开发 JavaScript C#
总有一个是你想要的分享31个游戏源代码
该资源分享了31款游戏源代码,包括C#版植物大战僵尸、HTML5版五子棋等,均经过亲测可运行。下载链接中还包含13款游戏源码,适合游戏开发者和爱好者学习参考。作者辛苦整理,希望得到您的点赞与关注作为支持。
125 1
|
7月前
|
SQL 定位技术 Android开发
分享119个Android手机应用源代码总有一个是你想要的
分享119个Android手机应用源代码总有一个是你想要的
382 2
|
7月前
|
移动开发 JavaScript C#
分享53戏源代码总有一个是你想要的(亲测每一个均可用)
分享53戏源代码总有一个是你想要的(亲测每一个均可用)
125 0
|
7月前
|
移动开发 JavaScript C#
分享31个游戏源代码总有一个是你想要的
分享31个游戏源代码总有一个是你想要的
200 0
|
7月前
|
定位技术 开发工具 Python
基于Python开发的玛丽大冒险小游戏(源码+可执行程序exe文件+程序配置说明书+程序使用说明书)
基于Python开发的玛丽大冒险小游戏(源码+可执行程序exe文件+程序配置说明书+程序使用说明书)
104 0
|
Shell Linux Windows
忘掉Iterm2,试试这款跨平台终端工具
Mac用户最多的用的就是Iterm2了,windows之前因为丑陋的终端也开发了新的终端工具,很神奇的是,很长一段时间里,都没有一款真正好用的能跨平台的终端工具,直到我发现了hyper。无论Windows、Mac、Debian、Fedora还是其他Linux系统,hyper都能支持。
忘掉Iterm2,试试这款跨平台终端工具
运行主程序后无法显示图形化界面的原因及其解决方法(拼图小游戏)
在定义完GameJFrame、LoginJFrame和RegisterJFrame方法后,如果要调用该方法内的成员变量,要使用this关键字,而不是像在测试类中新建对象后直接调用新的对象,这样的话由于我们调用的方法是不含参数的,如果new了一个对象会被放到堆内存中,数据也在堆内存中,所以无法访问到
242 0
运行主程序后无法显示图形化界面的原因及其解决方法(拼图小游戏)
|
IDE 测试技术 开发工具
AirtestIDE这个隐藏的小助手,还没用过你就亏啦!
AirtestIDE这个隐藏的小助手,还没用过你就亏啦!
263 0