FlyTreeView for ASP.NET 3.2 破解攻略
2024-07-10 13:03:54
供稿:網友
近日對目前較為流行的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 的破解工作結束,如果你有興趣的話,還可以為破解后的控件再做一個安裝部署項目。這就不在本文探討的范疇了。