• Unity中使用加密狗


    我在淘宝上购买了safenet的超级狗开发套件尝试开发

    针对普通的Desktop Application,safenet提供了最方便的加壳方式进行加密功能。

    只要定制好特定的特征,往狗里烧进去,就可以达到一般加密效果

    然而这一套在Unity上是行不通的。

    这里有一个小故事:

    有一次我开发的项目给软件实施人员拿到现场安装,他告诉我,我们的程序应该要发布32位版本的

    而这之前,我发布的是64位版本,不过这很简单,只要在Build的时候选择32位发布就好了

    当我发布完成后,给对方email过去后。

    他给我打电话了,说:“这是新发布的32位版本吗?为什么exe文件的修改时间并不是今天呢,依然是上一版本的日期呢?我如何确认你给我的是最新32位版本的呢?”

    于是我将发布的目录删除,重新发布,结果还是一样,exe文件的修改日期依然不是今天,如果没有估计错误,那么显示的日期应该是安装Unity那一天。

    这就很有意思了。

    在这里我劝告一下做Unity加密狗加壳方式加密的同学们,千万不要使用该方式加密,这等于关上了门却不上把锁一样。

    只要我右键查看该exe的版本号,得知了该项目由哪一个版本的Unity开发,我再去发布一个空项目出来,将这个exe替换掉

    你们的加壳加密就会被轻松破解,什么去壳反编译什么的,都不需要,破解几乎无成本。

    那么Unity应该怎么加密?使用加密狗软件供应商提供的LicensingAPI做判断。

    由于C#相关的API文档不全面,我联系了对方的技术支持,总算成功了,这里也就抛砖引玉一下。

    使用API做加密验证,步骤如下:

    1.修改.Net 2.0 Subset 为 .Net 2.0

    2.在Unity中导入从开发商下载的DLL,只需要红框标识出来的这一个DLL

    3.将上面的5个DLL填入以下两个文件夹(注意,是5个都要)

    4.在Unity编写相关验证,这里就只判断是否插入狗了,有兴趣的朋友可以查阅相关API文档,做做相关记录,和博主一起分享加密狗的有趣加密方式。

    5.发布!测试!成功!

     

    *6.最后,记得混淆代码,不然还是容易被反编译哦!

    新增:读取数据文件

    public string ReadFile(int fid) {
            Dog _dog = new Dog(DogFeature.Default);
            if (DogStatus.StatusOk == _dog.Login(HVCCode, Scope)) {
                DogFile file = _dog.GetFile(fid);int size = 0;
                file.FileSize(ref size);
                byte[] bytes = new byte[size];
                file.Read(bytes, 0, bytes.Length);
                return System.Text.Encoding.UTF8.GetString(bytes);
            }
            _dog.Logout();
            _dog = null;
            return string.Empty;
        }

     新增:判断特征类型

    public enum FeatureType {
            Perpetual,
            Executions,
            Expiration,
            Trial,
            Unknown
        }
    
    public FeatureType GetFeatureType(int feature) {
            string queryFormat = "<?xml version="1.0" encoding="UTF-8" ?>" +
                                                          "<dogformat root="dog_info">" +
                                                            " <feature>" +
                                                            "  <attribute name="id" />" +
                                                            "  <element name="license" />" +
                                                            " </feature>" +
                                                            "</dogformat>";
            string info = null;
            DogStatus status = Dog.GetInfo(Scope, queryFormat, HVCCode, ref info);
            if(DogStatus.StatusOk == status) {
                XmlDocument doc = new XmlDocument();
                doc.LoadXml(info);
                XmlNodeList list = doc.SelectNodes("//feature");
                foreach(XmlNode node in list) {
                    if (node.Attributes["id"].Value == feature.ToString()) {
                        switch (node.FirstChild.FirstChild.InnerText.ToLower()) {
                            case "executions":
                                return FeatureType.Executions;
                            case "expiration":
                                return FeatureType.Expiration;
                            case "trial":
                                return FeatureType.Trial;
                            case "perpetual":
                                return FeatureType.Perpetual;
                            default:
                                return FeatureType.Unknown;
                        }
                    }
                }
            }
            return FeatureType.Unknown;
        }
  • 相关阅读:
    AtomicInteger
    Android利用ViewPager实现滑动广告板
    modelsim实用教程--前言
    信号的抽取和插值
    FPGA与simulink联合实时环路系列——实验三 按键key
    FPGA与simulink联合实时环路系列——实验二LED
    FPGA与simulink联合实时环路系列——实验一 测试
    FPGA与simulink联合实时环路系列—开篇
    格雷码原理与Verilog实现
    基于FPGA的飞机的小游戏
  • 原文地址:https://www.cnblogs.com/CodeSnippet/p/6933202.html
Copyright © 2020-2023  润新知