FlyTreeView for ASP.NET 3.2 破解攻略
來源:互聯網
上載者:User
asp.net|treeview|攻略|破解 近日對目前較為流行的Asp.Net TreeView 控制項的效能進行了測試。如RadTreeView,FlyTreeView,IEWebControlTreeView等。總體感覺,作為一個獨立產品,FlyTreeView的外觀更為俏麗,效能也最為豐富,可謂精雕細琢。用它遍曆伺服器硬碟,模擬資源管理員目錄的速度是非常快的;它所具有的獨一無二的非同步載入功能,對那些夢想把全部資料都綁定到一個Web樹上,又不想影響用戶端載入速度的程式開發人員來講,FlyTreeView切實能使我們魚肉和熊掌兼得。用過一段時間的IEWebControlTreeView,深感其效能的平平,反應的遲緩,因而一見到FlyTreeView for ASP.NET 3.1 便愛不釋手,FlyTreeView for ASP.NET 3.2 出來以後便立即下載了一個。由於試用期過後必須調整“有線電話”的系統時間才能繼續使用,感覺很不方便,便決定自己動手,延長一下試用期,也藉機學習一下優秀軟體的編製技巧,瞭解一些書本上得不到的知識。
一、環境準備
1、基本環境:Microsoft Visual Studio .NET 200X開發環境和IIS服務。
2、PATH環境:為方便在命令列上使用有關工具,需要確保更新系統的PATH環境變數。以使系統能在任何目錄下都能找到所需的.NET工具。為此,需要將 X:\Program Files\Microsoft Visual Studio .NET 2003 DK\v1.1\Bin和X:\winnt\Microsoft.NET\Framework\v1.1.4322(v1.0.3705)這兩個目錄的完整路徑添加到PATH環境變數字串的末尾,如(圖一):
另外,為確保在任何目錄下都能進入命令列,須對檔案夾的右鍵菜單添加一個進入命令列的快捷選項。其方法見(圖二)。這樣,在資源管理員中當對需要進入命令列的檔案夾右擊滑鼠的時候,就會出現圖三的畫面,選擇“進入命令列”即可,免去了手工鍵入全路徑的繁瑣過程,見(圖三)。 二、工具準備
1、反編譯器:程式碼分析工具我用的是Reflector 4.1.6.0 的試用版,可從 http://www.aisto.com/roeder/dotnet/下載最新版本,Reflector 可以將目標代碼反編譯成IL、C#、VB.NET、 Delphi四種語言,可供你根據自己的語言習慣進行選擇。 Reflector 試用版裝載後如果出現到期問題,可通過調整系統時鐘予以解決,當然,也可以試著用Reflector自己把Reflector的程式碼分析一下將這個問題解決了,但不這樣做也不影響我們的後續工作。將控制項完整的反編譯成破解檔的工具就使用環境中已有的Microsoft免費提供的MSIL反組譯碼器ILDASM。經過第一步的準備,我們已經可以在需要的時候在任何目錄中調用它。
2、組譯工具:使用環境中已有的Microsoft免費提供的MSIL組譯工具ILASM,通過使用 Ilasm.exe 運行我們破解處理過的ILDASM產生的有關檔案以產生最終的破解控制項。同 ILDASM 一樣,經過第一步的準備,我們已經可以在需要的時候在任何目錄中調用它。
3、其他工具:記事本、計算機等,均為系統預設的工具、軟體。 三、破解過程
1、安裝FlyTreeView:運行FlyTreeView_for_ASP_Setup.3.2.exe,並注意安裝過程中選中安裝樣本Web應用程式。如(圖四): 在瀏覽器中瀏覽樣本頁面,控制項未到期時的正常畫面如(圖五):
將系統時鐘向後調整(如一年)後,再次瀏覽上述頁面,則控制項立即拋出異常如下(圖六):
2、控制項分析:
在你喜歡的位置建立一檔案夾,姑且起名為“FlyTreeView破解”,作為我們的工作目錄;將樣本網站bin目錄中的NineRays.Web.UI.WebControls.FlyTreeView.dll拷貝一份到工作目錄;用記事本在我們的工作目錄裡再建立兩個批次檔,以方便後續工作,代碼如下:myildasm.batildasm NineRays.Web.UI.WebControls.FlyTreeView.dll
/output:NineRays.Web.UI.WebControls.FlyTreeView.il myilasm.batilasm /dll /resource:NineRays.Web.UI.WebControls.FlyTreeView.res
/output:NineRays.Web.UI.WebControls.FlyTreeView.dll /key:treekey.snk
NineRays.Web.UI.WebControls.FlyTreeView.il
基本準備就緒後,啟動 Reflector 開啟工作目錄中的NineRays.Web.UI.WebControls.FlyTreeView.dll,如(圖七)
根據以往破解經驗及之前破解FlyTreeView for ASP.NET 3.1 的經曆,Web控制項的試用限制通常是在 New,Render,Init等位置實現。為此,我們直接展開NineRays.Web.UI.WebControls.FlyTreeView中的FlyTreeView類,以(圖六)中拋出的異常資訊“9Rays.Net FlyTreeView for ASP.NET TRIAL license has expired.” 為線索,逐個瀏覽該類中的重點方法與函數的反組譯碼代碼,發現異常是在FlyTreeView類的建構函式New()中拋出的,其進階語言代碼如下:
C#代 碼VB.NET代碼public FlyTreeView()
{
this._designPage = null;
this._clientRuntimePath = "/aspnet_client/ninerays_web_
ui_webcontrols_flytreeview_3_2_83_3/";
this._loadingMessage = "Loading...";
this._expandLevel = 0;
this._childIndent = 0x12;
this._SupportIE55 = false;
this._OldSelectedNodeKeyList = null;
this._RestoreValue = null;
this._DefaultNodeType = null;
this._NodeEventsArgs = new ArrayList();
this._SelectedNode = null;
if (DateTime.Now > Global.TRIAL_EXPIRE_DATE)
{
throw new Exception("9Rays.Net FlyTreeView
for ASP.NET TRIAL license has expired.");
}
this._NodeTypes = new TreeNodeTypeCollection();
this._NodeTypes._FlyTreeView = this;
this.Font.Name = "Tahoma";
this.Font.Size = FontUnit.XSmall;
this.BorderStyle = BorderStyle.None;
this.ClientRuntimePath = "/aspnet_client/ninerays_web_
ui_webcontrols_flytreeview_3_2_83_3/";
}
Public Sub New()
Me._designPage = Nothing
Me._clientRuntimePath = "/aspnet_client/ninerays_web_
ui_webcontrols_flytreeview_3_2_83_3/"
Me._loadingMessage = "Loading..."
Me._expandLevel = 0
Me._childIndent = 18
Me._SupportIE55 = False
Me._OldSelectedNodeKeyList = Nothing
Me._RestoreValue = Nothing
Me._DefaultNodeType = Nothing
Me._NodeEventsArgs = New ArrayList
Me._SelectedNode = Nothing
If (DateTime.Now > Global.TRIAL_EXPIRE_DATE) Then
Throw New Exception("9Rays.Net FlyTreeView
for ASP.NET TRIAL license has expired.")
End If
Me._NodeTypes = New TreeNodeTypeCollection
Me._NodeTypes._FlyTreeView = Me
Me.Font.Name = "Tahoma"
Me.Font.Size = FontUnit.XSmall
Me.BorderStyle = BorderStyle.None
Me.ClientRuntimePath = "/aspnet_client/ninerays_web
_ui_webcontrols_flytreeview_3_2_83_3/"
End Sub 相關截圖見(圖八):
顯然,關鍵代碼是:If (DateTime.Now > Global.TRIAL_EXPIRE_DATE) Then
Throw New Exception("9Rays.Net FlyTreeView for ASP.NET TRIAL license has expired.")
End If Global.TRIAL_EXPIRE_DATE中儲存的應該是控制項試用的期限,我們只要將Global.TRIAL_EXPIRE_DATE中的期限值向後延長一定年限就可以達到破解的要求了,因為我們畢竟不是要做該控制項的註冊機,不需要再做更複雜的分析。為此,我們在點擊(圖八)中藍色加亮的TRIAL_EXPIRE_DATE,轉到靜態全域類Global,瀏覽其相關代碼,我們找到了如下關鍵代碼:
語 言代 碼IL彙編.method private hidebysig specialname rtspecialname static void .cctor() cil managed
{
// Code Size: 18 byte(s)
.maxstack 4
L_0000: ldsflda [mscorlib]System.DateTime NineRays.Web.UI.WebControls.FlyTreeView.Global::TRIAL_EXPIRE_DATE
L_0005: ldc.i4 2004
L_000a: ldc.i4.8
L_000b: ldc.i4.3
L_000c: call instance void [mscorlib]System.DateTime::.ctor(int32, int32, int32)
L_0011: ret
} C#static Global()
{
Global.TRIAL_EXPIRE_DATE = new DateTime(0x7d4, 8, 3);
}VB.NETPrivate Shared Sub New()
Global.TRIAL_EXPIRE_DATE = New DateTime(2004, 8, 3)
End Sub Delphiconstructor Global.Create;
begin
Global.TRIAL_EXPIRE_DATE.Create(2004, 8, 3)
end; 相應的截圖見(圖九):
在以上由Reflector反編譯出的代碼中,以VB.NET和Delphi代碼最為直觀,它使我們一眼就看出該控制項的最後使用到期日為2004年8月3日。(不同時間下載或安裝的FlyTreeView表現在代碼中的到期日可能不同,筆者未特意考證)
下一步的工作就是進入實際破解了。
3、控制項破解:
在工作目錄中雙擊反組譯碼批次檔myildasm.bat,工作目錄中便出現了反組譯碼後得出的NineRays.Web.UI.WebControls.FlyTreeView.il等相關檔案,見下表:
NineRays.Web.UI.WebControls.FlyTreeView.il
NineRays.Web.UI.WebControls.FlyTreeView.Resources.Previews.Iconless.gif
NineRays.Web.UI.WebControls.FlyTreeView.FlyNodeSet.resources
NineRays.Web.UI.WebControls.FlyTreeView.FlyContextMenu.bmp
NineRays.Web.UI.WebControls.FlyTreeView.Resources.Previews.Default.gif
NineRays.Web.UI.WebControls.FlyTreeView.Design.AutoFormatForm.resources
NineRays.Web.UI.WebControls.FlyTreeView.Resources.Previews.MSDN.gif
NineRays.Web.UI.WebControls.FlyTreeView.Resources.Previews.Night.gif
NineRays.Web.UI.WebControls.FlyTreeView.FlyTreeView.bmp
NineRays.Web.UI.WebControls.FlyTreeView.Design.PreNodeTypesButton.resources
NineRays.Web.UI.WebControls.FlyTreeView.Resources.Previews.Office-2003.gif
NineRays.Web.UI.WebControls.FlyTreeView.RelItem.resources
NineRays.Web.UI.WebControls.FlyTreeView.Resources.FlyTreeView.ico
NineRays.Web.UI.WebControls.FlyTreeView.Resources.Previews.Windows-XP-Explorer.gif
NineRays.Web.UI.WebControls.FlyTreeView.FlyNodeSet.bmp
NineRays.Web.UI.WebControls.FlyTreeView.Resources.Previews.Classic-Explorer.gif
NineRays.Web.UI.WebControls.FlyTreeView.res
用記事本開啟NineRays.Web.UI.WebControls.FlyTreeView.il,向後翻一至兩頁可以看到如下代碼,這是用於控制項簽名的公開金鑰,應將其刪除,以避免破解後的控制項的被GAC踢出去且添加不進工具箱。
.publickey = (00 24 00 00 04 80 00 00 94 00 00 00 06 02 00 00 // .$..............
00 24 00 00 52 53 41 31 00 04 00 00 01 00 01 00 // .$..RSA1........
07 20 57 CD EB B7 1A 84 93 4B 53 79 1C 47 F2 FA // . W......KSy.G..
7E AE D6 6A D6 0F 43 77 3C DC 6C 32 89 1D 48 B2 // ~..j..Cw<.l2..H.
B9 1A 9E E9 25 B2 6A 13 D9 2F 84 32 90 E8 97 44 // ....%.j../.2...D
E8 2E A2 29 6C BB DC 5A 31 C5 19 46 B9 23 72 96 // ...)l..Z1..F.#r.
5B D7 3F 0C 0A 2A 10 F3 0E 98 9D 28 31 12 5B 63 // [.?..*.....(1.[c
EE 08 92 7A 7A 63 F4 2E 96 47 36 79 47 FF 8D 32 // ...zzc...G6yG..2
8B FA F4 AF 7C 12 84 3D 0B 55 15 B1 D0 2D C2 7C // ....|..=.U...-.|
C1 29 30 41 FC 8E AF 72 9C 4E 4F C6 0A A2 AA BE ) // .)0A...r.NO..... //應刪除
在記事本中利用尋找功能尋找“0x7d4” (2004年),結合前面Reflector反組譯碼時得到的有關線索,可以確定NineRays.Web.UI.WebControls.FlyTreeView.il中對應Global()的建構函式的IL彙編代碼如下:.method private hidebysig specialname rtspecialname static
void .cctor() cil managed
{
// 代碼大小 18 (0x12)
.maxstack 4
IL_0000: ldsflda valuetype [mscorlib]System.DateTime NineRays.Web.UI.WebControls.FlyTreeView.Global::TRIAL_EXPIRE_DATE
IL_0005: ldc.i4 0x7d4
IL_000a: ldc.i4.8
IL_000b: ldc.i4.3
IL_000c: call instance void [mscorlib]System.DateTime::.ctor(int32,
int32,
int32)
IL_0011: ret
} // end of method Global::.cctor 將上述代碼中的 0x7d4改為我們需要的年份就可以達到我們破解的目的。需要注意的是,新的年份值不可過大,否則可能超出作業系統支援的上限,那就可能出現“萬年蟲”了。這個值改為2050年就已經足夠了,因為人們不可能在四十多年後還在使用這個版本的FlyTreeView,況且到那時,如果微軟還僥倖存在的話,恐怕連DOTNET都不知被它淘汰到哪裡去了。2050對應的十六進位表示為 0x802,修改後儲存NineRays.Web.UI.WebControls.FlyTreeView.il。
接下來就是使用彙編工具ILASM編譯破解後的代碼了。
在編譯之前,我們對也對控制項來個數位簽章。(強式名稱不是必需的,也可以不做,但如果不想做的話請將myilasm.bat中的/key:treekey.snk指令刪除)
要進行數位簽章,首先要使用SN.EXE產生簽名密鑰。在資源管理員中右擊工作目錄“FlyTreeView破解”的檔案夾表徵圖後在快顯功能表中選擇“進入命令列”,然後再DOS視窗鍵入 sn -k treekey.snk 斷行符號。一個新的“隨機金鑰組”便儲存到了工作目錄下的treekey.snk檔案中。
接下來便進入實際編譯過程了。關閉DOS視窗和Reflector等軟體,回到資源管理員,刪除工作目錄中的NineRays.Web.UI.WebControls.FlyTreeView.dll,然後雙擊工作目錄中的批次檔myilasm.bat,等編譯工作結束,就可以看到一個新的NineRays.Web.UI.WebControls.FlyTreeView.dll出現在工作目錄中。
至此,如果之前的工作沒有失誤的話,FlyTreeView控制項的破解工作就結束了。 四、破解後的測試
啟動 Visual Studio .NET 2003,開啟FlyTreeView樣本網站Samples目錄中的樣本項目Samples.csproj,在方案總管中將項目對NineRays.Web.UI.WebControls.FlyTreeView的引用刪除,將對破解後的NineRays.Web.UI.WebControls.FlyTreeView的引用添加進來,並順便將其添加到工具箱中。
重建Samples項目後將系統日期向後調整數年,在瀏覽器中瀏覽樣本網站,你會發現不再拋出異常。
為最後確認破解是否成功,換另外一台機器使用ip地址或網域名稱方式訪問該樣本網站,一切正常。
至此,FlyTreeView for ASP.NET 3.2 的破解工作結束,如果你有興趣的話,還可以為破解後的控制項再做一個安裝部署項目。這就不在本文探討的範疇了。