一次.NET項目反編譯的實戰經驗(WinForm)


    最近由於業務需求,需要對一個老項目進行功能調整。但是項目的源代碼已經找不到了。所以只能嘗試對項目行進反編譯。

一、反編譯工具的選擇

    提到.NET的反編譯,第一個想到的就是大名鼎鼎的Reflector。使用之后發現效果並不好,對不認識的類就各種亂碼且還不支持多項目導出(可能是我不會用吧),再加上他還是需要付費的,暫時就只能戰略性的放棄掉了。查找度娘,ILSpy和dnSpy這兩款免費的軟件進入了我的視線。先試用ILSpy,直接提示我要安裝Framework 4.6.2,可是我就一個2.0的項目用這么高版本的反編譯,我怕效果不好,就選擇了暫時性的放棄。最后使用了dnSpy,反編譯出來的效果比Reflector好。

二、艱辛的編譯過程

    不管使用哪一款反編譯工具,反編譯出來的代碼想要完全沒有錯誤是不太可能,這里就以dnSpy生成出來的代碼為例,來說明一下常見問題及解決方案:

    1、缺失引用,最典型的就是缺少了System和System.Xml的引用,需要手動添加

    2、foreach循環內會再申明一個重名變量,手動刪除即可

    3、base.AutoScaleMode=AutoScaleMode.Font報錯,給AutoScaleMode加上全命名空間System.Windows.Forms.AutoScaleMode.Font

    4、變量“manager”未聲明或從未賦值。ComponentResourceManager類實例化的變量名只能是resources

三、修復資源文件

    其實在這一步之前,項目可以編譯成功且不影響到正常使用,只是在開發的時候看不到任何資源數據。

    反編譯過來的文件里面有很多.resource的文件,那些就是編譯過后的資源文件,這些文件可以正常編譯不影響正常使用,但是這些文件在開發時是沒有用的,所以在VS里面看來就是一片白的,我們需要把.resource文件轉換成我們熟悉的.resx文件。

    可以用VS自帶的工具resgen.exe轉(我沒用,具體方法可以在網上查);還可以使用ConvertResource批量轉換,不過這個工具轉出來的文件要把里面metadata改成data才行;轉出來.resx之后,把.resource文件刪掉,將.resx包含進項目就好了。

四、后記

    1、反編譯出來的代碼和本身的源代碼在結構上可能存在差異,尤其是WebServices。

    2、現在的反編譯工具還做不到一點錯都沒有,看着那幾百上千個錯誤,很容易讓人放棄,一定要擺平心態來處理錯誤。

    3、dnSpy是一個很強大的反編譯工具,可以直接斷點調試和修改並再編譯。如果不放心反編譯出來的代碼,完全是可以在原程序上修改再編譯。

    4、dnSpy可以放在服務器端,能在緊急的時候繞過源代碼修復BUG。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM