最近的項目裡,需要使用一個第三控制項,用來實現對xml資料的編輯功能。幾經周折終於從國外網上找到了一個叫RichWinFormSuite的控制項包,下載安裝之後就開始使用,簡單學習了一下開發範例和Demo,發現功能很豐富,介面效果也不錯,開發挺簡單,這個組件也挺小,只有1M不到的一個dll檔案。唯一的不爽是運行起來的時候會彈出許可視窗,需要點擊關閉之後才能繼續運行。
在國內網站上搜尋了一下,基本上沒有關於這個軟體的介紹,更沒有破解版,只好向搞安全方面的同學請教,希望能破解掉。
根據和同學和討論,以及從網上找的資料,找到了一個破解.net程式的方法:先將.net程式(exe或者dll)通過反射工具Reflector的FildDisassembler外掛程式將dll輸出成原始碼,然後自己組織和重新編譯。
用Reflector開啟dll之後,卻發現有些不一樣,類名和函數名變成了帶有很多數位字串,和本來的名稱變得面目全非。
這肯定是通過混淆器處理之後的dll,既然函數名和類名都變了,那通過Reflector輸出的原始碼也全是數字和字母,重新編譯了也沒用,只好找個別的思路和方法。
後來想到另一個思路:先將.net程式(exe或者dll)反編譯成IL語言,找到它彈出對話方塊的執行代碼,然後修改成其它命令,直接讓許可視窗不彈出來,再將修改後的IL代碼重新編譯成dll檔案。
為了驗證這思路的正確性,我寫先一個小程式,在程式啟動時彈出一個普通表單,編譯運行正常。
然後使用.net framework提供的工具包的ILDasm命令,輸出該檔案的IL代碼,命令如下:
ildasm /output=c:\temp\test.il ILTest.exe
執行之後,會在C盤temp目錄下產生一個test.il檔案和一個test.res檔案,以及其它資源圖片也會輸出在同一檔案夾。
使用文字編輯器找到執行的語句,然後替換成nop命令,以使程式執行空操作,儲存檔案,使用ILAsm重新編譯成exe檔案,命令如下:
ilasm /exe /resource=c:\temp\test.res c:\temp\test.il /output=c:\mytest.exe
注意:第一個參數/exe是編譯後的程式類型。
編譯之後再運行,果然不再快顯視窗了,頓時喜上心頭,感覺到離成功不遠了。
立即使用按剛才的步驟來破解這個下載的dll,輸出成IL語言代碼之後,為了確定快顯視窗的代碼位置,直接先搜尋許可視窗中提示資訊,找到該字串所在的方法之後,覺得讀IL代碼太麻煩,函數名又都是數字,就利用Reflector的Analyze分析功能,找到該函數的"Used By",發現是在一個類名為xb08f1495afd18c6f的建構函式中被調用,於是就確定了快顯視窗的代碼位置,將該行代碼直接替換成nop命令。
再重新編譯成dll之後加入項目中使用,發現無法把該控制項拖到設計器上,使用代碼調用能編譯通過,卻在運行時彈出了異常資訊:
“未能負載檔案或程式集“RichWinFormSuite, Version=4.0.2.36, Culture=neutral, PublicKeyToken=a730077342cbf1ce”或它的某一個依賴項。強式名稱驗證失敗。 (異常來自 HRESULT:0x8013141A)”。
於是從網上找了資料,下載了一個snRemove的工具來,按照網上的說明進行操作,先將原始的dll檔案去除強式名稱,然後再複製剛才的IL代碼修改過程,完畢,重新加到項目引用中,卻總是依舊。網上有人說這個工具去掉的強式名稱在windows2003上會失效,而我用的正是這個作業系統。
後來又在網上搜尋了一些關於強式名稱破解方面的資料,但暫時還沒有找到方法。我嘗試過索性將IL語言中的.publickey程式碼片段直接刪除,然後在啟動並執行時候居然報出一個異常:公用語言運行庫檢測到無效的程式。
哈哈,看來強式名稱還是強呢,雖然.net的反編譯省事很多,但是這破解並不像傳說中那麼簡單啊。