Dependency Walker 使用說明_第1頁
Dependency Walker 使用說明_第2頁
Dependency Walker 使用說明_第3頁
Dependency Walker 使用說明_第4頁
Dependency Walker 使用說明_第5頁
全文預(yù)覽已結(jié)束

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

1、在Windows世界中,有無數(shù)塊活動(dòng)的大陸,它們都有一個(gè)共同的名字動(dòng)態(tài)鏈接庫?,F(xiàn)在就讓我們走進(jìn)這些神奇的活動(dòng)大陸,找出它們隱藏已久的秘密吧! 初窺門徑:Windows的基石隨便打開一個(gè)系統(tǒng)目錄,一眼望去就能看到很多擴(kuò)展名DLL的文件,這些就是經(jīng)常說的“動(dòng)態(tài)鏈接庫”,DLL是Dynamic Link Library(即“動(dòng)態(tài)鏈接庫”)的縮寫。從Microsoft公司推出首個(gè)版本的Windows以來,動(dòng)態(tài)鏈接庫就一直是這個(gè)操作系統(tǒng)的基礎(chǔ)。 1.看看DLL里有什么 與其用晦澀的專業(yè)術(shù)語來解決DLL是什么,不如先來看看DLL里有什么。DLL和EXE文件一樣,其中包含的也是程序的二進(jìn)制執(zhí)行代碼和程序所需

2、的資源(比如圖標(biāo)、對(duì)話框、字符串等),可是為什么要把代碼放在DLL里面,而不是做成EXE呢?其實(shí)DLL中的代碼是以API函數(shù)形式出現(xiàn)的,通俗地說,DLL中包含的程序代碼都被做成了一個(gè)個(gè)小模塊,應(yīng)用程序通過按下所需DLL中特定的按鈕,來調(diào)用DLL中這個(gè)按鈕所代表的功能。在使用“記事本”等程序時(shí),如果要保存文件或打開文件,就會(huì)彈出通用文件對(duì)話框,讓我們選擇文件位置。你可知道,這就是調(diào)用了系統(tǒng)底層DLL中的通用對(duì)話框界面。 2.系統(tǒng)中幾個(gè)重要的DLL Windows中有3個(gè)非常重要的底層DLL:Kernel32.dll、User32.dll、GDI32.dll。其中Kernel32.dll顧名思義就

3、是內(nèi)核相關(guān)的功能,主要包含用于管理內(nèi)存、進(jìn)程和線程的函數(shù);而User32.dll中包含的則是用于執(zhí)行用戶界面任務(wù)的函數(shù),比如把用戶的鼠標(biāo)點(diǎn)擊操作傳遞給窗口,以便窗口根據(jù)用戶的點(diǎn)擊來執(zhí)行預(yù)定的事件;GDI32.dll的名稱用了縮寫,全稱是Graphical Device Interface(圖形設(shè)備接口),包含用于畫圖和顯示文本的函數(shù),比如要顯示一個(gè)程序窗口,就調(diào)用了其中的函數(shù)來畫這個(gè)窗口。 3.為什么要用DLL 剛才在談到這個(gè)問題的時(shí)候,我們只是解釋了DLL將程序代碼封裝成函數(shù)的原理。為什么封裝成函數(shù),就能成為系統(tǒng)中大量使用DLL的理由呢? 擴(kuò)展應(yīng)用程序 由于DLL能被應(yīng)用程序動(dòng)態(tài)載入內(nèi)存。所

4、以,應(yīng)用程序可以在需要時(shí)才將DLL載入到內(nèi)存中,這讓程序的可維護(hù)性變得很高。比如QQ的視頻功能需要升級(jí),那么負(fù)責(zé)編寫QQ的程序員不必將QQ所有代碼都重寫,只需將視頻功能相關(guān)的DLL文件重寫即可。 便于程序員合作 這個(gè)和我們最終用戶關(guān)系不大,僅供了解。我們都知道編程工具有很多,比如VB、VC、Delphi等,如果好幾個(gè)人合作來編寫一個(gè)大的程序,那么可能有的人用VB,有的人用VC,每人負(fù)責(zé)的部分所使用的編程語言都不同,究竟放在哪個(gè)編譯器中進(jìn)行編譯呢?這就好比一群來自各個(gè)國家的人在共同編寫一篇文章,如果他們所使用的語言都不同,寫出來的文章怎么可能湊到一起呢?而有了DLL后,可以讓VC程序員寫一個(gè)DL

5、L,然后VB程序員在程序中調(diào)用,無需為怎么將它們都編譯為一個(gè)單獨(dú)的EXE而發(fā)愁了。 節(jié)省內(nèi)存 如果多個(gè)應(yīng)用程序調(diào)用的是同一個(gè)動(dòng)態(tài)鏈接庫,那么這個(gè)DLL文件不會(huì)被重復(fù)多次裝入內(nèi)存中,而是由這些應(yīng)用程序共享同一個(gè)已載入內(nèi)存的DLL。就好比一個(gè)辦公室中,很少會(huì)為每一個(gè)員工配置一臺(tái)飲水機(jī)的,而是在一個(gè)公共位置放上一個(gè)飲水機(jī),所有需要喝水的職員都可以共用這臺(tái)飲水機(jī),降低了成本又節(jié)約了空間。 共享程序資源 包括剛才提到過的通用文件對(duì)話框在內(nèi),DLL文件提供了應(yīng)用程序間共享資源的可能。資源可以是程序?qū)υ捒?、字符串、圖標(biāo),或者聲音文件等。 解決應(yīng)用程序本地化問題 在下載了某個(gè)程序的漢化包后,打開漢化說明,經(jīng)常

6、可以看到用下載包中的DLL文件覆蓋掉程序原來的DLL,漢化就完成了。這些程序都是將執(zhí)行代碼和應(yīng)用程序界面分開編寫了,所以漢化者只需簡單地將其中和程序界面相關(guān)的DLL漢化并發(fā)布即可。 求知若渴:探究DLL的真相 誰知道DLL里究竟有多少函數(shù),又有誰知道EXE調(diào)用了哪個(gè)DLL的哪些函數(shù)?其實(shí),這個(gè)問題并不難解決。還記不記得本刊2004年第6期的無間盜IV盜亦有盜中介紹的分析EXE文件的工具Dependency Walker(以下簡稱Depends)今天我們要用它當(dāng)探險(xiǎn)工具,把DLL真相探個(gè)通通透透。 1.看看DLL里有多少函數(shù) 第一步:下載并解壓Depends,運(yùn)行其中的depends.exe,然

7、后選擇菜單“FileOpen”(文件打開),在文件選擇框中選中需要分析的DLL文件并打開,此處選擇QQ目錄下的QQZip.dll。 第二步:在程序左側(cè)的樹狀欄中就列出了這個(gè)DLL使用了哪些其他DLL的功能函數(shù)(原來DLL中還可以調(diào)用其他DLLO),而右側(cè)的兩個(gè)分欄列表分別顯示了函數(shù)輸入及輸出表,函數(shù)輸出表即為該DLL提供給其他EXE或者DLL調(diào)用的函數(shù)的總列表。 第三步:函數(shù)輸出表的Function欄中即為輸出函數(shù)的名稱(見圖1),在QQZip.dll中共發(fā)現(xiàn)了2個(gè)函數(shù):Unzip、Zip。因此可以判斷該DLL在QQ程序中負(fù)責(zé)壓縮和解壓縮的任務(wù)。 2.審審EXE究竟用了哪個(gè)DLL 還是拿QQ來

8、作為例子,在Depends中打開QQ.exe,這時(shí)界面左側(cè)的樹狀列表中顯示的就是QQ.exe調(diào)用的DLL列表(見圖2),如果展開這些DLL分支,還會(huì)發(fā)現(xiàn)其他的DLL,這就說明QQ調(diào)用的這些DLL文件還有可能(幾乎是肯定)再調(diào)用別的DLL。這就好比買了一臺(tái)新的DVD機(jī),可能其中用的機(jī)芯是SONY的,而這個(gè)機(jī)芯里的一個(gè)小電容又有可能是別的公司的,這是同樣的道理。 3.用DLL看穿EXE真面目 剛才得到了QQ.exe所使用的DLL列表,其實(shí)通過這個(gè)列表,還能分析出很多別的信息。比如其中包含MFC42.dll,所以可以判斷QQ.exe是采用VC(即Visual C+)編寫的,而包含WSOCK32.dl

9、l則說明這個(gè)程序帶有網(wǎng)絡(luò)通訊功能(廢話!QQ如果不能網(wǎng)絡(luò)通訊還有什么用)。以下是一個(gè)簡表,大家在分析別的EXE時(shí)可以根據(jù)其所使用的DLL來對(duì)其功能進(jìn)行初步判斷。 DLL文件名 可以判斷出的EXE信息 MFC42.dll 使用VC5.0/6.0編寫。 VBRun*.dll “*”代表數(shù)字版本號(hào),使用VB3.0/4.0編寫。 MSVBVM50.dll 使用VB5.0編寫,在Windows 98(SE)上自帶該DLL。 MSVBVM60.dll 使用VB6.0編寫,在Windows Me/2000/XP等系統(tǒng)上自帶該DLL。 ADVAPI32.dll 可能會(huì)進(jìn)行注冊(cè)表操作。 WSOCK32.dll

10、具備網(wǎng)絡(luò)通訊功能。 WS2_32.dll 具備網(wǎng)絡(luò)通訊功能。 WININET.dll 具備HTTP瀏覽、下載等功能,典型的例子是瀏覽器、下載工具。 WINMM.dll 具備多媒體播放能力。 DDRAW.dll 游戲、高級(jí)圖像處理工具。 D3D*.dll 3D游戲,或者動(dòng)畫處理工具。 4.DLL是個(gè)大寶庫 除供應(yīng)用程序調(diào)用函數(shù)的DLL外,還有另一種用來保存資源的DLL,比如QQ目錄下的QQRes.dll,用Depends打開后發(fā)現(xiàn)沒有任何輸出函數(shù),難道是一個(gè)雞肋DLL?可是改用資源工具Resource Hacker(下載地址: 刨根問底:DLL的寓言 DLL引起的故障是很常見的,為什么會(huì)引起故障

11、?遇到故障怎么解決?噓偷聽一下DLL的對(duì)話,你就會(huì)明白了。 1.從搬運(yùn)工談接口兼容性 在Windows工地上,有一個(gè)名叫EXE的包工頭,他手下有很多稱為DLL的建筑工人。其中有一個(gè)專門負(fù)責(zé)搬運(yùn)的DLL(暫且稱為“搬運(yùn)工A”),每次需要搬運(yùn)水泥時(shí),包工頭EXE都只要對(duì)他喊一聲:“來!搬?!?過了一段時(shí)間,搬運(yùn)工A覺得自己的效率太低,于是從原來的每次搬1袋水泥改成了每次搬3袋水泥。改進(jìn)了搬運(yùn)方法后,EXE包工頭仍然每次只是喊一聲:“來!搬?!眳s不知搬運(yùn)工A已經(jīng)改變了搬運(yùn)的方法。 但又過了一段時(shí)間,包工頭EXE把搬運(yùn)工A給辭退了,從別的工地上找來了另一個(gè)DLL(暫且稱為“搬運(yùn)工B”)。這個(gè)搬運(yùn)工在別

12、的工地的時(shí)候,搬運(yùn)東西特別快,所以包工頭EXE決定把搬運(yùn)工作給“升級(jí)”一下。但真正開始工作時(shí),包工頭才發(fā)現(xiàn)出了問題現(xiàn)在不管叫幾遍“來!搬?!边@個(gè)新來的搬運(yùn)工B都不知道究竟應(yīng)該搬什么。 上面的例子中,搬運(yùn)工A改進(jìn)搬運(yùn)方法,但EXE調(diào)用它的方法仍不變,這就是DLL升級(jí)的原理,改進(jìn)了內(nèi)部的實(shí)現(xiàn)方法,但調(diào)用接口不變,這樣EXE文件不用跟著升級(jí),就能調(diào)用新版本的DLL了。而搬運(yùn)工B的故事告訴我們,不管新版本的DLL效率多高,如果接口(可以理解為DLL中輸出的函數(shù)名)與原來的不一致,那么EXE就不知道也無法調(diào)用它了。 2.登記身份證的DLL 在系統(tǒng)故障中,有很多都是由于DLL文件沒有注冊(cè)造成的,比如Win

13、dows XP的壓縮文件夾功能出現(xiàn)故障就很有可能是系統(tǒng)目錄中的zipfldr.dll沒有注冊(cè)造成的,這類故障的解決方法也大多是運(yùn)行如下命令: regsvr32 DLL文件名 很多人不理解為什么要這么做,是不是所有的DLL都能這樣做呢? 其實(shí)系統(tǒng)中有兩種DLL,一種是不需注冊(cè)即可使用的,另一種則是必須經(jīng)過系統(tǒng)登錄(即注冊(cè))才能使用的。就好像一個(gè)臨時(shí)工,和一個(gè)記錄在員工名單上的長期合同工的區(qū)別一樣。如何才能區(qū)分這兩種DLL呢?方法很簡單,用剛才的Depends打開這個(gè)DLL,同樣是看函數(shù)輸出表,如果其中包含以下兩個(gè)函數(shù)(前者是注冊(cè)DLL,后者是反注冊(cè)DLL),那么就一定是需要注冊(cè)才能使用的DLL了

14、。 DllRegisterServer DllUnregisterServer 而regsvr32這個(gè)命令,實(shí)際上就是調(diào)用DLL中的這兩個(gè)函數(shù)(“regsvr32 /u DLL文件名”調(diào)用的即為DllUnregisterServer反注冊(cè)函數(shù))。 3.插件DLL的秘密 Winamp、Foobar 2000等很多軟件都具有插件功能,從網(wǎng)上下載一個(gè)DLL放在插件目錄下就能讓程序支持新的功能,這是怎么做到的呢?就拿時(shí)下流行的播放軟件“千千靜聽”來舉例吧。 “千千靜聽”的插件目錄在該軟件安裝目錄下的Addin子目錄下,程序的插件目錄一般都會(huì)以“Plugins”、“Addin”來命名。在“千千靜聽”的插件目錄中有許多DLL文件,比如tt_asf.dll、tt_rm.dll等,從文件名中就能看出這些DLL是用來讓這個(gè)播放器支持各種不同類型的音頻文件的。同樣,用Depends打開這些文件,你就會(huì)發(fā)現(xiàn)這些文件的輸出函數(shù)表中都包括一個(gè)同樣的函數(shù):ttpGetSoundAddIn(見圖4)。 這就是插件的秘密,各種支持插件功能的程序在發(fā)布時(shí),都會(huì)同時(shí)發(fā)布一份插件協(xié)議,協(xié)議中規(guī)定了該程序?qū)⒁{(diào)用的插件DLL中必須包含的函數(shù)名稱及相關(guān)的參數(shù)規(guī)則,然后第三方的插件

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論