最近在對接一個第三方平台。該平台只提供了Java版本的SDK,C#版本的還處於敬請期待狀態。由於C#可以復用絕大部分代碼,便考慮找一個Java到C#的轉換器,在試用了幾個軟件之後,發現還是Java to C# Converter(下文簡稱Converter)好用一點。然而基本版功能受限(文件夾不能超過1000行代碼,代碼片段不能超過100行),高級版的則要$169。
在經歷過自己寫小程序轉換Java、手寫代碼、利用Converter分批次轉換、查找替換等方式完成C#版本之後。終於按捺不住心中的好奇心,研究了下軟件的破解。
首先看看這個軟件是不是C#寫的,將文件拖入ILSpy,一看之下,果然有驚喜。
internal static bool _g41(List<string> Copyright_Tangible_Software_Solutions_p0) { if (_g22._g24 == _g3.FreeEdition) { if (_g22._m21 != 100) { Copyright_Tangible_Software_Solutions_g810._g844(Copyright_Tangible_Software_Solutions_g810._g843); return false; } if (Copyright_Tangible_Software_Solutions_p0 == null) { return true; } int num = 0; for (int i = 0; i < Copyright_Tangible_Software_Solutions_p0.Count; i++) { if (Copyright_Tangible_Software_Solutions_p0[i].Trim().Length > 0 && !Copyright_Tangible_Software_Solutions_p0[i].TrimStart(new char[0])._g1079("//")) { num++; if (num > _g22._m21) { new _g376(string.Concat(new string[] { "The Free Edition of ", Application.ProductName, " doesn't allow conversion of snippets with more than ", _g22._m21.ToString(), " lines at a time." })); return false; } } } } return true; }
下面還有兩個函數,_g42和_g43形式與此類似,_g42應該是文件夾的許可,_g43不知道是做什麼的。從函數的代碼上看,感覺直接將返回值改成true就好了。不管那麼多,先來試試改寫_g41。
在網站上下了reflexil.for.ILSpy.2.0.AIO(我愣了下才反應過來AIO是All In One的意思),解壓後將裡面的DLL復制到ILSpy目錄下。打開ILSpy(如果ILSpy復制前是打開,則需重啟),在View中點擊Reflexil v2.0,然後在ILSpy中打開Converter的可執行文件,找到_g22類中的_g41函數。如下圖所示:
C#形式的代碼
IL形式的代碼