1. 程式人生 > >.Net,Dll掃盲篇,如何在VS中調試已經編譯好的dll?

.Net,Dll掃盲篇,如何在VS中調試已經編譯好的dll?

技術分享 操作系統 鏈接 作者 怎麽辦 框架 好的 常見 pac

什麽是Dll?

DLL 是一個包含可由多個程序同時使用的代碼和數據的庫。
例如,在 Windows 操作系統中,Comdlg32 DLL 執行與對話框有關的常見函數。因此,每個程序都可以使用該Dll中包含的功能來實現“打開”對話框。這有助於促進代碼重用和內存的有效使用。
通過使用 DLL,程序可以實現模塊化,由相對獨立的組件組成。
通俗來講,一個項目由多個模塊組成。可以在運行時將各個模塊加載到主程序中(如果安裝了相應模塊)。因為模塊是彼此獨立的,所以程序的加載速度更快,而且模塊只在相應的功能被請求時才加載,而更新的話,就只需替換掉當前的DLL就行了.


如何制作Dll?

在以.net的開發為例,在當前編譯環境下,只需要對當前想要制作成dll的項目右鍵重新生成下,然後在該項目對應的文件夾下面找到debug文件夾,裏面就會有一個與當前項目名稱一樣的後綴為dll的文件。

Dll怎麽用?
首先先在項目中引用該dll,然後在用到dll的地方using一下,即可調用其中的類與方法。因為是dll,所以你F12進去一般都是這樣的:

技術分享

可以看到該類既不是抽象類也沒有繼承任何接口和類,但是方法體卻沒有實現,而最上面 有寫xx程序集之類。
你可以通過vs的對象瀏覽器看看裏面都是啥結構,但是你是看不到方法裏面的代碼的,也無法調試。

怎麽查看dll的代碼?

你想了解這些dll中的代碼實現,但是你看不到。但是,你想到的,前人早想到了。那麽我們換個說法,之所以你看不到被編譯好的dll中的代碼,那是因為vs編譯器本身不帶這個功能。
那麽,我們找一款工具來輔助我們來看看這個dll中的代碼。
這個實現過程,叫 反編譯。

那麽,自然,我們要用的就是 反編譯軟件。
當下知名的反編譯軟件有 Il spy,.NET Reflector
這兩個軟件我比較喜歡用IL SPY,因為網上有中文版的。
放圖:

技術分享

如果你想查看特定的dll的話,可以點擊文件選項卡,然後點擊打開,然後找到dll路徑就可以了(.NET Reflector也一樣)。
工具很方便,有很多功能,具體教程,大家自行百度。

怎麽去在vs實際開發項目中調試dll中的代碼?

如果光是看看源碼可不夠,還想在項目中實際調試怎麽辦?那麽我告訴你,只有一個工具可以滿足。
那就是 .NET Reflector的vs插件。
.NET Reflector是個反編譯的軟件,但如果你想即時調試dll的代碼的話,還需再用其vs的插件。
.NET Reflector和.NET Reflector的vs插件是兩個概念,不懂的話請自行百度 什麽是vs插件。
接下來我教大家怎樣安裝並使用這個插件。
首先,點擊工具,點擊擴展和更新

技術分享

然後點擊 聯機,並在最右側的搜索框中 搜索  Reflector

技術分享

最後,選中第一個,點擊安裝即可。
目前最新版本9.2
安裝完成,vs中就會多了個選項卡。

技術分享

給大家介紹下,.NET Reflector Object Browser是 .net反射對象瀏覽器,這個是用來控制.net反射對象瀏覽器 顯示及隱藏的。
.net反射對象瀏覽器長這樣:

技術分享

這個.net反射對象瀏覽器  你可以瀏覽當前.net框架默認的程序集,  你可以一層一層點開,最終點到你想要看的類裏面。

技術分享

但是,這樣做只能看到源碼,並不能調試。

還需要在該dll右鍵,點擊選中Enable Debugging,意思就是將該dll啟動到可調試的狀態。當你點擊該選項的時候,這個插件會把這個dll的代碼給轉成本地的文件,.NET Reflector首先會嘗試定位本機上的PDB文件,如果沒有則會自己創建PDB文件,這才能進行調試。

技術分享

點擊後會出現一個界面,這個界面就是當前狀態改變的過程。

技術分享

成功後是這樣的:

技術分享

直接點Done關閉掉就可以。

接下來我們就可以打斷點調試了!

技術分享

選中斷點,然後按照你喜歡的方式去調試!F5或者附加進程都可以。

為什麽有的代碼無法調試?

有的時候,你即便打了斷點,可發現怎麽也調試不進去。

原因有很多可能,包括條件編譯、編譯器優化結果、目標體系結構等不同,總之,你不能調試

接下來我要放一張.Net Reflector反編譯的代碼,和一張IL SPY反編譯的代碼。

技術分享技術分享

可以發現,同樣的dll,兩個軟件有著不同的反編譯結果。

兩個反編譯軟件對唯獨對該方法的解密出來的代碼有歧義。

所以,要對編譯與反編譯有個最基礎的概念,並不是很神奇的就能把真正的源碼給你給反編譯出來,而是對編譯的算法進行推測,然後逆推的結果再進行軟件的一些處理來達到100%接近源碼的這樣一個程度。

有反編譯,那麽就有防破解加密。

有些代碼,經過加殼混淆,反編譯出來的東西很尷尬。

那麽,關於對dll加密這方面的東西,大家如果有興趣,可以自行百度了解下。

而關於反編譯,除了il spy,.Net Reflector 還有JetBrains dotPeek、Telerik JustDecompile等等,區別就是算法不同反編譯出來的代碼不同、收費、功能等

我剛演示的.Net Reflector,還有很多功能,這裏只做最簡單的入門教程,有興趣請自行了解, 這是人家的網站,http://www.red-gate.com/products/dotnet-development/reflector/

技術分享


作者:小曾
出處:http://www.cnblogs.com/1996V/p/7396913.html 歡迎轉載,但任何轉載必須保留完整文章,在顯要地方顯示署名以及原文鏈接。如您有任何疑問或者授權方面的協商,請給我留言

.Net,Dll掃盲篇,如何在VS中調試已經編譯好的dll?