zoukankan      html  css  js  c++  java
  • 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;
        }
  • 相关阅读:
    教你如何开发一个完败Miracast的投屏新功能
    深度评测--安卓免费的银行卡识别SDK,华为 HMS MLKit 和Card IO哪个好?
    别让算法和数据结构拖你职业生涯的后腿
    接入卡片类快服务你必须知道的事情
    手机智眼——智慧视觉
    解放双手的革命——智慧语音
    Android | 超简单集成HMS ML Kit实现最大脸微笑抓拍
    快服务常见TOP3审核雷区,再不过审就要崩溃啦!
    图标新纪元——服务直达
    集成机器学习服务上架华为应用市场指南
  • 原文地址:https://www.cnblogs.com/CodeSnippet/p/6933202.html
Copyright © 2011-2022 走看看