做數據庫開發,如果要用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語言程序設計 。

