熱點推薦:
您现在的位置: 電腦知識網 >> 電腦常識 >> 正文

Windows系統的活動大陸:細看DLL文件

2013-11-11 14:03:34  來源: 電腦常識 

  在Windows世界中有無數塊活動的大陸它們都有一個共同的名字——動態鏈接庫現在就走進這些神奇的活動大陸找出它們隱藏已久的秘密吧!

  初窺門徑Windows的基石

  隨便打開一個系統目錄一眼望去就能看到很多擴展名DLL的文件這些就是經常說的動態鏈接庫DLL是Dynamic Link Library(即動態鏈接庫)的縮寫從Microsoft公司推出首個版本的Windows以來動態鏈接庫就一直是這個操作系統的基礎

  看看DLL裡有什麼

  與其用晦澀的專業術語來解決DLL是什麼不如先來看看DLL裡有什麼DLL和EXE文件一樣其中包含的也是程序的二進制執行代碼和程序所需的資源(比如圖標對話框字符串等)可是為什麼要把代碼放在DLL裡面而不是做成EXE呢?其實DLL中的代碼是以API函數形式出現的通俗地說DLL中包含的程序代碼都被做成了一個個小模塊應用程序通過按下所需DLL中特定的按鈕來調用DLL中這個按鈕所代表的功能在使用記事本等程序時如果要保存文件或打開文件就會彈出通用文件對話框選擇文件位置你可知道這就是調用了系統底層DLL中的通用對話框界面

  系統中幾個重要的DLL

  Windows中有個非常重要的底層DLL:KerneldllUserdllGDIdll其中Kerneldll顧名思義就是內核相關的功能主要包含用於管理內存進程和線程的函數;而Userdll中包含的則是用於執行用戶界面任務的函數比如把用戶的鼠標點擊操作傳遞給窗口以便窗口根據用戶的點擊來執行預定的事件;GDIdll的名稱用了縮寫全稱是Graphical Device Interface(圖形設備接口)包含用於畫圖和顯示文本的函數比如要顯示一個程序窗口就調用了其中的函數來畫這個窗口

  為什麼要用DLL

  剛才在談到這個問題的時候只解釋了DLL將程序代碼封裝成函數的原理為什麼封裝成函數就能成為系統中大量使用DLL的理由呢?

  ①擴展應用程序

  由於DLL能被應用程序動態載入內存所以應用程序可以在需要時才將DLL載入到內存中這讓程序的可維護性變得很高比如QQ的視頻功能需要升級那麼負責編寫QQ的程序員不必將QQ所有代碼都重寫只需將視頻功能相關的DLL文件重寫即可

  ②便於程序員合作

  這個和最終用戶關系不大僅供了解大家都知道編程工具有很多比如VBVCDelphi等如果好幾個人合作來編寫一個大的程序那麼可能有的人用VB有的人用VC每人負責的部分所使用的編程語言都不同究竟放在哪個編譯器中進行編譯呢?這就好比一群來自各個國家的人在共同編寫一篇文章如果他們所使用的語言都不同寫出來的文章怎麼可能湊到一起呢?而有了DLL後可以讓VC程序員寫一個DLL然後VB程序員在程序中調用無需為怎麼將它們都編譯為一個單獨的EXE而發愁了

  ③節省內存

  如果多個應用程序調用的是同一個動態鏈接庫那麼這個DLL文件不會被重復多次裝入內存中而是由這些應用程序共享同一個已載入內存的DLL就好比一個辦公室中很少會為每一個員工配置一台飲水機的而是在一個公共位置放上一個飲水機所有需要喝水的職員都可以共用這台飲水機降低了成本又節約了空間

  ④共享程序資源

  包括剛才提到過的通用文件對話框在內DLL文件提供了應用程序間共享資源的可能資源可以是程序對話框字符串圖標或者聲音文件等

  ⑤解決應用程序本地化問題

  在下載了某個程序的漢化包後打開漢化說明經常可以看到用下載包中的DLL文件覆蓋掉程序原來的DLL漢化就完成了這些程序都是將執行代碼和應用程序界面分開編寫了所以漢化者只需簡單地將其中和程序界面相關的DLL漢化並發布即可

  求知若渴:探究DLL的真相

  誰知道DLL裡究竟有多少函數又有誰知道EXE調用了哪個DLL的哪些函數?其實這個問題並不難解決分析EXE文件的工具Dependency Walker(以下簡稱Depends)今天它就是大家探險的工具把DLL真相探個通通透透

  看看DLL裡有多少函數

  第一步:下載並解壓Depends運行其中的dependsexe然後選擇菜單File→Open(文件→打開)在文件選擇框中選中需要分析的DLL文件並打開此處選擇QQ目錄下的QQZipdll

  第二步:在程序左側的樹狀欄中就列出了這個DLL使用了哪些其他DLL的功能函數(原來DLL中還可以調用其他DLL^O^)而右側的兩個分欄列表分別顯示了函數輸入及輸出表函數輸出表即為該DLL提供給其他EXE或者DLL調用的函數的總列表

  第三步:函數輸出表的Function欄中即為輸出函數的名稱(見圖在QQZipdll中共發現了個函數:UnzipZip因此可以判斷該DLL在QQ程序中負責壓縮和解壓縮的任務

  圖 QQZipdll中的函數

  審審EXE究竟用了哪個DLL

  還是拿QQ來作為例子在Depends中打開QQexe這時界面左側的樹狀列表中顯示的就是QQexe調用的DLL列表(見圖如果展開這些DLL分支還會發現其他的DLL這就說明QQ調用的這些DLL文件還有可能(幾乎是肯定)再調用別的DLL這就好比買了一台新的DVD機可能其中用的機芯是SONY的而這個機芯裡的一個小電容又有可能是別的公司的這是同樣的道理

  圖 QQexe所調用的dll

  用DLL看穿EXE真面目

  剛才得到了QQexe所使用的DLL列表其實通過這個列表還能分析出很多別的信息比如其中包含MFCdll所以可以判斷QQexe是采用VC(即Visual C++)編寫的而包含WSOCKdll則說明這個程序帶有網絡通訊功能(廢話!QQ如果不能網絡通訊還有什麼用……)以下是一個簡表大家在分析別的EXE時可以根據其所使用的DLL來對其功能進行初步判斷

  DLL文件名 可以判斷出的EXE信息

  MFCdll 使用VC/編寫
  VBRun*dll *代表數字版本號使用VB/編寫
  MSVBVMdll 使用VB編寫在Windows (SE)上自帶該DLL
  MSVBVMdll 使用VB編寫在Windows Me//XP等系統上自帶該DLL
  ADVAPIdll 可能會進行注冊表操作
  WSOCKdll 具備網絡通訊功能
  WS_dll 具備網絡通訊功能
  WININETdll 具備HTTP浏覽下載等功能典型的例子是浏覽器下載工具
  WINMMdll 具備多媒體播放能力
  DDRAWdll 游戲高級圖像處理工具
  DD*dll D游戲或者動畫處理工具
  DLL是個大寶庫

  除供應用程序調用函數的DLL外還有另一種用來保存資源的DLL比如QQ目錄下的QQResdll用Depends打開後發現沒有任何輸出函數難道是一個雞肋DLL?可是改用資源工具Resource Hacker(下載地址:)打開這個DLL後就發現原來其中保存了這麼多QQ的資源包括圖標音樂圖片字符串對話框……(見圖

  圖 dll文件中包含的其他資源

  刨根問底:DLL的寓言

  DLL引起的故障是很常見的為什麼會引起故障?遇到故障怎麼解決?噓~偷聽一下DLL的對話你就會明白了

  從搬運工談接口兼容性

  在Windows工地上有一個名叫EXE的包工頭他手下有很多稱為DLL的建築工人其中有一個專門負責搬運的DLL(暫且稱為搬運工A)每次需要搬運水泥時包工頭EXE都只要對他喊一聲:來!搬

  過了一段時間搬運工A覺得自己的效率太低於是從原來的每次搬袋水泥改成了每次搬袋水泥改進了搬運方法後EXE包工頭仍然每次只是喊一聲:來!搬卻不知搬運工A已經改變了搬運的方法

  但又過了一段時間包工頭EXE把搬運工A給辭退了從別的工地上找來了另一個DLL(暫且稱為搬運工B)這個搬運工在別的工地的時候搬運東西特別快所以包工頭EXE決定把搬運工作給升級一下但真正開始工作時包工頭才發現出了問題……現在不管叫幾遍來!搬這個新來的搬運工B都不知道究竟應該搬什麼

  上面的例子中搬運工A改進搬運方法但EXE調用它的方法仍不變這就是DLL升級的原理改進了內部的實現方法但調用接口不變這樣EXE文件不用跟著升級就能調用新版本的DLL了而搬運工B的故事說明不管新版本的DLL效率多高如果接口(可以理解為DLL中輸出的函數名)與原來的不一致那麼EXE就不知道也無法調用它了

  登記身份證的DLL

  在系統故障中有很多都是由於DLL文件沒有注冊造成的比如Windows XP的壓縮文件夾功能出現故障就很有可能是系統目錄中的zipfldrdll沒有注冊造成的這類故障的解決方法也大多是運行如下命令:

  regsvr DLL文件名

  很多人不理解為什麼要這麼做是不是所有的DLL都能這樣做呢?

  其實系統中有兩種DLL一種是不需注冊即可使用的另一種則是必須經過系統登錄(即注冊)才能使用的就好像一個臨時工和一個記錄在員工名單上的長期合同工的區別一樣如何才能區分這兩種DLL呢?方法很簡單用剛才的Depends打開這個DLL同樣是看函數輸出表如果其中包含以下兩個函數(前者是注冊DLL後者是反注冊DLL)那麼就一定是需要注冊才能使用的DLL了

  DllRegisterServer

  DllUnregisterServer

  而regsvr這個命令實際上就是調用DLL中的這兩個函數(regsvr /u DLL文件名調用的即為DllUnregisterServer反注冊函數)

  插件DLL的秘密

  WinampFoobar 等很多軟件都具有插件功能從網上下載一個DLL放在插件目錄下就能讓程序支持新的功能這是怎麼做到的呢?就拿時下流行的播放軟件千千靜聽來舉例吧

  千千靜聽的插件目錄在該軟件安裝目錄下的Addin子目錄下程序的插件目錄一般都會以PluginsAddin來命名千千靜聽的插件目錄中有許多DLL文件比如tt_asfdlltt_rmdll等從文件名中就能看出這些DLL是用來讓這個播放器支持各種不同類型的音頻文件的同樣用Depends打開這些文件你就會發現這些文件的輸出函數表中都包括一個同樣的函數:ttpGetSoundAddIn(見圖

  圖 千千靜聽所使用的插件協議

  這就是插件的秘密各種支持插件功能的程序在發布時都會同時發布一份插件協議協議中規定了該程序將要調用的插件DLL中必須包含的函數名稱及相關的參數規則然後第三方的插件程序員在編寫這個程序的插件時就根據這個插件的標准來編寫DLL的輸出函數

  ①對於插件tt_asfdll

  ttplayerexe(千千靜聽主程序)對tt_asfdll說:我要調用你的ttpGetSoundAddIn函數!

  tt_asfdll回答:OK

  ②如果把不相關的DLL放進AddIn目錄

  ttplayerexe對未知DLL說:我要調用你的ttpGetSoundAddIn函數!

  tt_asfdll回答:那是什麼函數?從來沒聽說過!


From:http://tw.wingwit.com/Article/Common/201311/5059.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.