zoukankan      html  css  js  c++  java
  • 直接修改.NET程序集 LLBL Gen 2.x-4.x 许可授权方法研究

    做数据库开发,如果要用ORM,LLBL Gen是一款优秀的框架和工具,目前最新版本是4.0。同时也推出了Lite免费版本,与Visual Studio的Express版本一样,

    免费,但是它仅仅只支持10个实体,可满足学习的需要,做项目用则不行。

    借助于MSIL知识和工具.NET Reflector,我可以直接对.NET程序集进行编辑,去掉许可证授权验证窗口,转化为可用的软件。

    请参考下面的.NET代码,它是LLBL Gen应用Xml签名验证许可的关键程序片段:

    public static LicenseInfo Verify(string signedXml, Action<string, string> messageReporterFunc, Action<string, string> errorDisplayFunc,
     DateTime nullDate)
    {
        SignedXml xml = new SignedXml();
        RSACryptoServiceProvider key = new RSACryptoServiceProvider();
        key.FromXmlString("<RSAKeyValue><Modulus>la+31RHN9+rLO3AWuQYtOZeAdN+YzdNUqFi5gZ0DYHXLUkhptBxvVrtFc3Obv
    eiMpdslmFtffBD6fIiYXDQc6xAO4d/9VvYIMK8We9tvZrydXYSakf3GDICd09TkUXk3SLX6aNITsnb4xxPKWHPsv4+PFptRwn99Kh2bN8U
    HNBs=</Modulus><Exponent>AQAB</Exponent></RSAKeyValue>");
        XmlDocument document = new XmlDocument {
            PreserveWhitespace = true
        };
        document.LoadXml(signedXml);
        XmlNodeList elementsByTagName = document.GetElementsByTagName("Signature");
        xml.LoadXml((XmlElement) elementsByTagName[0]);
        if (!xml.CheckSignature(key))
        {
            if (errorDisplayFunc != null)
            {
                errorDisplayFunc("The license file signature is invalid", "Invalid license file");
            }
            return null;
        }
        LicenseInfo info = LicenseInfo.CreateLicenseInfo(document.SelectSingleNode(".//LLBLGenProLicense"));
        if (!info.Expires || (((info.UtcLicenseCreationDateTime <= DateTime.UtcNow) && (info.ExpirationDate >= DateTime.Today)) && (nullDate <= DateTime.Now.ToUniversalTime())))
        {
            return info;
        }
        if (messageReporterFunc != null)
        {
            messageReporterFunc(string.Format("The {0} period has ended as your license has expired.", info.TypeOfLicense.ToString().ToLowerInvariant()), "License expired");
        }
        return null;
    }

    关于Xml Signature,目前流传的方法是替换Xml密匙对,重新签名,这种方法是可行的。但还有别的途径可以做到。

    既然可以申请到官方的试用版,如何判断试用过期,将过期后的处理(抛出异常,或是直接退出)这一段代码处理掉即可。参考上面的代码,过期后,这个方法会返回null,

    如果可以将最后一句return null改成 return info,返回许可文件信息,再结合其它的判断,便可以绕开许可证限制,继续使用该软件。

    image

    在图中,将我标识的部分删除,再另存为.NET 程序集,替换原来的程序集,即可绕开验证机制,继续使用过期的软件。

    因为可以直接修改代码,所以方法千变万化,也可以这样改代码,把上面的相同行的代码改成

    if (info.Expires.....

    这表示,即使过期了,也继续返回该许可文件信息,不抛出异常。

    涉及到代码中要改的地方是brfalse.s改成brtrue.s ,把条件跳转的false改成true,改变流程跳转。

     

    通过学习MSIL语言,可以了解.NET底层的一些处理机制,仅仅是了解层面,大部分时间都在做数据库领域相关的工作,

    在程序设计领域,通过MSIL的学习,我体会到的一点是,代码中要尽量避免box/unbox,另外一项好处,就是这里给大家介绍的,

    做一些额外的工作,不以获取利益为目标,打发平时的业余时间。

    如果想对MSIL语言有多一些的了解,请参考我的文章 代码大全 MSIL语言程序设计

  • 相关阅读:
    Eureka 原理圖
    RabbitMQ 介紹
    rabbitmq-3.5.1-安裝
    MyBatis 基础入门
    CSS
    程序员必会算法-KMP算法
    编程这些年
    排序算法之直接插入排序
    排序算法之选择排序
    排序算法之冒泡排序
  • 原文地址:https://www.cnblogs.com/JamesLi2015/p/3287977.html
Copyright © 2011-2022 走看看