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

posted @ 2013-08-28 21:14  信息化建设  阅读(2572)  评论(2编辑  收藏  举报