• 直接修改.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语言程序设计

  • 相关阅读:
    Building a Space Station POJ
    Networking POJ
    POJ 1251 Jungle Roads
    CodeForces
    CodeForces
    kuangbin专题 专题一 简单搜索 POJ 1426 Find The Multiple
    The Preliminary Contest for ICPC Asia Shenyang 2019 F. Honk's pool
    The Preliminary Contest for ICPC Asia Shenyang 2019 H. Texas hold'em Poker
    The Preliminary Contest for ICPC Asia Xuzhou 2019 E. XKC's basketball team
    robotparser (File Formats) – Python 中文开发手册
  • 原文地址:https://www.cnblogs.com/JamesLi2015/p/3287977.html
Copyright © 2020-2023  润新知