Dependency Walker使用说明

 

在Windows世界中,有无数块活动的大陆,它们都有一个共同的名字——动态连接库。如今就让咱们走进这些神奇的活动大陆,找出它们隐藏已久的秘密吧! 


初窥门径:Windows的基石

随便打开一个系统目录,一眼望去就能看到不少扩展名DLL的文件,这些就是常常说的“动态连接库”,DLL是Dynamic Link Library(即“动态连接库”)的缩写。从Microsoft公司推出首个版本的Windows以来,动态连接库就一直是这个操做系统的基础。

1.看看DLL里有什么

与其用晦涩的专业术语来解决DLL是什么,不如先来看看DLL里有什么。DLL和EXE文件同样,其中包含的也是程序的二进制执行代码和程序所需的资源(好比图标、对话框、字符串等),但是为何要把代码放在DLL里面,而不是作成EXE呢?其实DLL中的代码是以API函数形式出现的,通俗地说,DLL中包含的程序代码都被作成了一个个小模块,应用程序经过按下所需DLL中特定的按钮,来调用DLL中这个按钮所表明的功能。在使用“记事本”等程序时,若是要保存文件或打开文件,就会弹出通用文件对话框,让咱们选择文件位置。你可知道,这就是调用了系统底层DLL中的通用对话框界面。

2.系统中几个重要的DLL

Windows中有3个很是重要的底层DLL:Kernel32.dll、User32.dll、GDI32.dll。其中Kernel32.dll顾名思义就是内核相关的功能,主要包含用于管理内存、进程和线程的函数;而User32.dll中包含的则是用于执行用户界面任务的函数,好比把用户的鼠标点击操做传递给窗口,以便窗口根据用户的点击来执行预约的事件;GDI32.dll的名称用了缩写,全称是Graphical Device Interface(图形设备接口),包含用于画图和显示文本的函数,好比要显示一个程序窗口,就调用了其中的函数来画这个窗口。

3.为何要用DLL

刚才在谈到这个问题的时候,咱们只是解释了DLL将程序代码封装成函数的原理。为何封装成函数,就能成为系统中大量使用DLL的理由呢?

①扩展应用程序

因为DLL能被应用程序动态载入内存。因此,应用程序能够在须要时才将DLL载入到内存中,这让程序的可维护性变得很高。好比QQ的视频功能须要升级,那么负责编写QQ的程序员没必要将QQ全部代码都重写,只需将视频功能相关的DLL文件重写便可。

②便于程序员合做

这个和咱们最终用户关系不大,仅供了解。咱们都知道编程工具备不少,好比VB、VC、Delphi等,若是好几我的合做来编写一个大的程序,那么可能有的人用VB,有的人用VC,每人负责的部分所使用的编程语言都不一样,究竟放在哪一个编译器中进行编译呢?这就比如一群来自各个国家的人在共同编写一篇文章,若是他们所使用的语言都不一样,写出来的文章怎么可能凑到一块儿呢?而有了DLL后,可让VC程序员写一个DLL,而后VB程序员在程序中调用,无需为怎么将它们都编译为一个单独的EXE而发愁了。

③节省内存

若是多个应用程序调用的是同一个动态连接库,那么这个DLL文件不会被重复屡次装入内存中,而是由这些应用程序共享同一个已载入内存的DLL。就比如一个办公室中,不多会为每个员工配置一台饮水机的,而是在一个公共位置放上一个饮水机,全部须要喝水的职员均可以共用这台饮水机,下降了成本又节约了空间。

④共享程序资源

包括刚才提到过的通用文件对话框在内,DLL文件提供了应用程序间共享资源的可能。资源能够是程序对话框、字符串、图标,或者声音文件等。

⑤解决应用程序本地化问题

在下载了某个程序的汉化包后,打开汉化说明,常常能够看到用下载包中的DLL文件覆盖掉程序原来的DLL,汉化就完成了。这些程序都是将执行代码和应用程序界面分开编写了,因此汉化者只需简单地将其中和程序界面相关的DLL汉化并发布便可。

求知若渴:探究DLL的真相
谁知道DLL里究竟有多少函数,又有谁知道EXE调用了哪一个DLL的哪些函数?其实,这个问题并不难解决。还记不记得本刊2004年第6期的《无间盗IV——盗亦有盗》中介绍的分析EXE文件的工具Dependency Walker(如下简称Depends)今天咱们要用它当探险工具,把DLL真相探个统统透透。
1.看看DLL里有多少函数
第一步:下载并解压Depends,运行其中的depends.exe,而后选择菜单“File→Open”(文件→打开),在文件选择框中选中须要分析的DLL文件并打开,此处选择QQ目录下的QQZip.dll。
第二步:在程序左侧的树状栏中就列出了这个DLL使用了哪些其余DLL的功能函数(原来DLL中还能够调用其余DLL^O^),而右侧的两个分栏列表分别显示了函数输入及输出表,函数输出表即为该DLL提供给其余EXE或者DLL调用的函数的总列表。
第三步:函数输出表的Function栏中即为输出函数的名称(见图1),在QQZip.dll中共发现了2个函数:Unzip、Zip。所以能够判断该DLL在QQ程序中负责压缩和解压缩的任务。

2.审审EXE究竟用了哪一个DLL
仍是拿QQ来做为例子,在Depends中打开QQ.exe,这时界面左侧的树状列表中显示的就是QQ.exe调用的DLL列表(见图2),若是展开这些DLL分支,还会发现其余的DLL,这就说明QQ调用的这些DLL文件还有可能(几乎是确定)再调用别的DLL。这就比如买了一台新的DVD机,可能其中用的机芯是SONY的,而这个机芯里的一个小电容又有多是别的公司的,这是一样的道理。


3.用DLL看穿EXE真面目
刚才获得了QQ.exe所使用的DLL列表,其实经过这个列表,还能分析出不少别的信息。好比其中包含MFC42.dll,因此能够判断QQ.exe是采用VC(即Visual C++)编写的,而包含WSOCK32.dll则说明这个程序带有网络通信功能(废话!QQ若是不能网络通信还有什么用……)。如下是一个简表,你们在分析别的EXE时能够根据其所使用的DLL来对其功能进行初步判断。
DLL文件名 能够判断出的EXE信息
MFC42.dll 使用VC5.0/6.0编写。
VBRun*.dll “*”表明数字版本号,使用VB3.0/4.0编写。
MSVBVM50.dll 使用VB5.0编写,在Windows 98(SE)上自带该DLL。
MSVBVM60.dll 使用VB6.0编写,在Windows Me/2000/XP等系统上自带该DLL。
ADVAPI32.dll 可能会进行注册表操做。
WSOCK32.dll 具有网络通信功能。
WS2_32.dll 具有网络通信功能。
WININET.dll 具有HTTP浏览、下载等功能,典型的例子是浏览器、下载工具。
WINMM.dll 具有多媒体播放能力。
DDRAW.dll 游戏、高级图像处理工具。
D3D*.dll 3D游戏,或者动画处理工具。
4.DLL是个大宝库
除供应用程序调用函数的DLL外,还有另外一种用来保存资源的DLL,好比QQ目录下的QQRes.dll,用Depends打开后发现没有任何输出函数,难道是一个鸡肋DLL?但是改用资源工具Resource Hacker(下载地址:http://www.mydown.com/soft/42/42058.html)打开这个DLL后,就发现原来其中保存了这么多QQ的资源,包括图标、音乐、图片、字符串、对话框……(见图3)


刨根问底:DLL的寓言
DLL引发的故障是很常见的,为何会引发故障?遇到故障怎么解决?嘘~偷听一下DLL的对话,你就会明白了。
1.从搬运工谈接口兼容性
在Windows工地上,有一个名叫EXE的包工头,他手下有不少称为DLL的建筑工人。其中有一个专门负责搬运的DLL(暂且称为“搬运工A”),每次须要搬运水泥时,包工头EXE都只要对他喊一声:“来!搬。”
过了一段时间,搬运工A以为本身的效率过低,因而从原来的每次搬1袋水泥改为了每次搬3袋水泥。改进了搬运方法后,EXE包工头仍然每次只是喊一声:“来!搬。”殊不知搬运工A已经改变了搬运的方法。
但又过了一段时间,包工头EXE把搬运工A给辞退了,从别的工地上找来了另外一个DLL(暂且称为“搬运工B”)。这个搬运工在别的工地的时候,搬运东西特别快,因此包工头EXE决定把搬运工做给“升级”一下。但真正开始工做时,包工头才发现出了问题……如今无论叫几遍“来!搬。”这个新来的搬运工B都不知道究竟应该搬什么。
上面的例子中,搬运工A改进搬运方法,但EXE调用它的方法仍不变,这就是DLL升级的原理,改进了内部的实现方法,但调用接口不变,这样EXE文件不用跟着升级,就能调用新版本的DLL了。而搬运工B的故事告诉咱们,无论新版本的DLL效率多高,若是接口(能够理解为DLL中输出的函数名)与原来的不一致,那么EXE就不知道也没法调用它了。
2.登记×××的DLL
在系统故障中,有不少都是因为DLL文件没有注册形成的,好比Windows XP的压缩文件夹功能出现故障就颇有多是系统目录中的zipfldr.dll没有注册形成的,这类故障的解决方法也大可能是运行以下命令:
regsvr32 DLL文件名
不少人不理解为何要这么作,是否是全部的DLL都能这样作呢?
其实系统中有两种DLL,一种是不需注册便可使用的,另外一种则是必须通过系统登陆(即注册)才能使用的。就好像一个临时工,和一个记录在员工名单上的长期合同工的区别同样。如何才能区分这两种DLL呢?方法很简单,用刚才的Depends打开这个DLL,一样是看函数输出表,若是其中包含如下两个函数(前者是注册DLL,后者是反注册DLL),那么就必定是须要注册才能使用的DLL了。
DllRegisterServer
DllUnregisterServer
而regsvr32这个命令,实际上就是调用DLL中的这两个函数(“regsvr32 /u DLL文件名”调用的即为DllUnregisterServer反注册函数)。
3.插件DLL的秘密
Winamp、Foobar 2000等不少软件都具备插件功能,从网上下载一个DLL放在插件目录下就能让程序支持新的功能,这是怎么作到的呢?就拿时下流行的播放软件“千千静听”来举例吧。
“千千静听”的插件目录在该软件安装目录下的Addin子目录下,程序的插件目录通常都会以“Plugins”、“Addin”来命名。在“千千静听”的插件目录中有许多DLL文件,好比tt_asf.dll、tt_rm.dll等,从文件名中就能看出这些DLL是用来让这个播放器支持各类不一样类型的音频文件的。一样,用Depends打开这些文件,你就会发现这些文件的输出函数表中都包括一个一样的函数:ttpGetSoundAddIn(见图4)。

这就是插件的秘密,各类支持插件功能的程序在发布时,都会同时发布一份插件协议,协议中规定了该程序将要调用的插件DLL中必须包含的函数名称及相关的参数规则,而后第三方的插件程序员在编写这个程序的插件时就根据这个插件的标准来编写DLL的输出函数。
①对于插件tt_asf.dll
ttplayer.exe(“千千静听”主程序)对tt_asf.dll说:“我要调用你的ttpGetSoundAddIn函数!”
tt_asf.dll回答:“OK。”
②若是把不相关的DLL放进AddIn目录
ttplayer.exe对未知DLL说:“我要调用你的ttpGetSoundAddIn函数!”
tt_asf.dll回答:“那是什么函数?历来没据说过!”html

相关文章
相关标签/搜索