直接修改.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,返回许可文件信息,再结合其它的判断,便可以绕开许可证限制,继续使用该软件。
在图中,将我标识的部分删除,再另存为.NET 程序集,替换原来的程序集,即可绕开验证机制,继续使用过期的软件。
因为可以直接修改代码,所以方法千变万化,也可以这样改代码,把上面的相同行的代码改成
if (info.Expires.....
这表示,即使过期了,也继续返回该许可文件信息,不抛出异常。
涉及到代码中要改的地方是brfalse.s改成brtrue.s ,把条件跳转的false改成true,改变流程跳转。
通过学习MSIL语言,可以了解.NET底层的一些处理机制,仅仅是了解层面,大部分时间都在做数据库领域相关的工作,
在程序设计领域,通过MSIL的学习,我体会到的一点是,代码中要尽量避免box/unbox,另外一项好处,就是这里给大家介绍的,
做一些额外的工作,不以获取利益为目标,打发平时的业余时间。
如果想对MSIL语言有多一些的了解,请参考我的文章 代码大全 MSIL语言程序设计 。