后期资源网|非编软件网|杉宫竹苑|非编插件|高清视频素材|音频素材|非编软件汉化

 找回密码
 立即注册
后期非编系统发布及其详细简介后期非编系统VIP专享下载区影视后期非编模版免费下载区网站注册及其办理VIP业务说明
查看: 712|回复: 0

求知若渴:探究DLL的真相

[复制链接]
发表于 2012-5-10 21:32:28 | 显示全部楼层 |阅读模式
  谁知道DLL里究竟有多少函数,又有谁知道EXE调用了哪个DLL的哪些函数?其实,这个问题并不难解决。分析EXE文件的
工具
DependencyWalker(以下简称Depends,点击
下载
DependencyWalker),今天它就是大家探险的工具,把DLL真相探个通通透透。# s8 Q; `3 ?. Q  B# ~
  1.看看DLL里有多少函数
$ c8 ]! |* w) q$ s7 o; V0 o" I
7 q# L$ `. M5 g+ ?9 q2 N
  第一步:下载并解压Depends,运行其中的depends.exe,(我试过可以选择exescope也可以查看的)然后选择菜单"File→Open"(文件→打开),在文件选择框中选中需要分析的DLL文件并打开,此处选择QQ
目录
下的QQZip.dll。& n' T1 b' }: ]& d9 {6 E
  第二步:在
程序
左侧的树状栏中就列出了这个DLL使用了哪些其他DLL的功能函数(原来DLL中还可以调用其他DLL^O^),而右侧的两个分栏列表分别显示了函数输入及输出表,函数输出表即为该DLL提供给其他EXE或者DLL调用的函数的总列表。
8 U) o- r: A0 p% N' t

) Z2 I! z: h8 I/ Q  第三步:函数输出表的Function栏中即为输出函数的名称(见图1),在QQZip.dll中共发现了2个函数:Unzip、Zip。因此可以判断该DLL在QQ程序中负责压缩和解压缩的任务。
/ s6 A8 Y5 j( h/ G
) v+ b" E( G9 q+ e( l  \( [( A
图1 QQZip.dll中的函数
0 K  I% N3 k9 M+ Z7 E" o- O7 g
- p- {2 ?( n4 [' l+ P) i( o- J8 b
  2.审审EXE究竟用了哪个DLL
) c. W8 ^3 v& A/ Q& {* D, p0 a) `
9 e$ W" k. F  J" q
  还是拿QQ来作为例子,在Depends中打开QQ.exe,这时界面左侧的树状列表中显示的就是QQ.exe调用的DLL列表(见图2),如果展开这些DLL分支,还会发现其他的DLL,这就说明QQ调用的这些DLL文件还有可能(几乎是肯定)再调用别的DLL。这就好比买了一台新的DVD机,可能其中用的机芯是
SONY
的,而这个机芯里的一个小电容又有可能是别的
公司
的,这是同样的道理。
! b  G4 W: p3 F7 A9 i
% {- S( }+ v9 n1 F& _
图2 QQ.exe所调用的dll
) [1 M/ Y+ O  d6 s! Y
- x. n. c  ]. y2 p7 w
  3.用DLL看穿EXE真面目1 j( v  c: m5 ?, G' C$ r8 {
  刚才得到了QQ.exe所使用的DLL列表,其实通过这个列表,还能分析出很多别的信息。比如其中包含MFC42.dll,所以可以判断QQ.exe是采用VC(即VisualC++)编写的,而包含WSOCK32.dll则说明这个程序带有网络通讯功能(废话!QQ如果不能网络通讯还有什么用……)。以下是一个简表,大家在分析别的EXE时可以根据其所使用的DLL来对其功能进行初步判断。
* l5 p/ {& j* o! G& LDLL文件名 可以判断出的EXE信息
6 I# S) A2 K& j

& s8 R& y4 P8 C8 r# O  z* MFC42.dll 使用VC5.0/6.0编写。: @6 o" L* k" h) @
* VBRun*.dll "*"代表数字版本号,使用VB3.0/4.0编写。
7 e$ k) t, `! C+ Z3 J. k% n9 ~: d* MSVBVM50.dll 使用VB5.0编写,在
Windows
98(SE)上自带该DLL。* y  y" e: c5 m; x
* MSVBVM60.dll 使用VB6.0编写,在Windows Me/2000/XP等系统上自带该DLL。
5 N+ L7 v) C7 b7 ]' M+ z8 W
, X8 d( m/ {9 O9 t3 A% q  T
* ADVAPI32.dll 可能会进行
注册
表操作。
3 y% M! k  w8 F6 y# i
# Z, i" g# G3 ~3 x; L3 J: C! V- I
* WSOCK32.dll 具备网络通讯功能。. i+ Y( `1 m3 k  D  B6 u/ `- u4 \( c9 h
* WS2_32.dll 具备网络通讯功能。( l# _" g; {! U6 w7 f! S
* WININET.dll 具备HTTP浏览、下载等功能,典型的例子是浏览器、下载工具。2 u; f$ p# l8 m* G7 y) s% ~* v* g
* WINMM.dll 具备多媒体播放
能力

) P& @, `. O7 R+ g* DDRAW.dll 游戏、高级图像处理工具。
! L. u1 z& P% X3 P

. i% c* d2 \+ E/ |1 y1 e* D3D*.dll 3D游戏,或者
动画
处理工具。

! _0 @! q% r. E; I
 刨根问底
LL的寓言
, m6 n2 R, `) ?1 }/ V& K0 F  DLL引起的故障是很常见的,为什么会引起故障?遇到故障怎么解决?嘘~偷听一下DLL的对话,你就会明白了。7 \7 ^$ ~( y: O; Y2 Y- g% T$ @( t+ i' c% S
  1.从搬运工谈
接口
兼容性
  ]- b3 L% |5 Y4 U2 J* l
  在Windows工地上,有一个名叫EXE的包工头,他手下有很多称为DLL的建筑工人。其中有一个专门负责搬运的DLL(暂且称为"搬运工A"),每次需要搬运水泥时,包工头EXE都只要对他喊一声:"来!搬。"
% m# x0 X2 ~' \6 k5 e3 k7 a* U

  B2 U8 d' n; _" ?" v) u0 D5 G  过了一段时间,搬运工A觉得自己的效率太低,于是从原来的每次搬1袋水泥改成了每次搬3袋水泥。改进了搬运方法后,EXE包工头仍然每次只是喊一声:"来!搬。"却不知搬运工A已经改变了搬运的方法。
' b4 o+ ~! X/ j# L+ l* G, i% q! J$ y& ^, J  _  但又过了一段时间,包工头EXE把搬运工A给辞退了,从别的工地上找来了另一个DLL(暂且称为"搬运工B")。这个搬运工在别的工地的时候,搬运东西特别快,所以包工头EXE决定把搬运工作给"
升级
"一下。但真正开始工作时,包工头才发现出了问题……现在不管叫几遍"来!搬。"这个新来的搬运工B都不知道究竟应该搬什么。% C3 i; [2 K: O
  上面的例子中,搬运工A改进搬运方法,但EXE调用它的方法仍不变,这就是DLL升级的原理,改进了内部的实现方法,但调用接口不变,这样EXE文件不用跟着升级,就能调用新版本的DLL了。而搬运工B的故事说明,不管新版本的DLL效率多高,如果接口(可以理解为DLL中输出的函数名)与原来的不一致,那么EXE就不知道也无法调用它了。
! X: p* w; Q6 ]2 B# C7 N. N  2.登记身份证的DLL
3 R+ G- n4 o: V" H1 N& N  在系统故障中,有很多都是由于DLL文件没有注册造成的,比如WindowsXP的压缩
文件夹
功能出现故障就很有可能是系统目录中的zipfldr.dll没有注册造成的,这类故障的解决方法也大多是运行如下命令:8 c8 u0 |% _  U8 s9 ]/ k
  regsvr32 DLL文件名
- \5 w( p, W  k
' ~. w3 Q5 y! a
很多人不理解为什么要这么做,是不是所有的DLL都能这样做呢?
. @$ a, v9 o6 d/ q
3 _) S3 D, A: F) A
  其实系统中有两种DLL,一种是不需注册即可使用的,另一种则是必须经过系统登录(即注册)才能使用的。就好像一个临时工,和一个记录在员工名单上的长期合同工的区别一样。如何才能区分这两种DLL呢?方法很简单,用刚才的Depends打开这个DLL,同样是看函数输出表,如果其中包含以下两个函数(前者是注册DLL,后者是反注册DLL),那么就一定是需要注册才能使用的DLL了。
6 S& n- L' N8 I+ u9 a

6 {" |  g/ @# B; @. ?( ]2 q9 }  DllRegisterServer
" w) x9 ]6 u. E! L
& Z& s( H  I) D) F' A+ B. T
  DllUnregisterServer/ |3 [' ]3 ?2 T9 [5 c
  而regsvr32这个命令,实际上就是调用DLL中的这两个函数("regsvr32 /uDLL文件名"调用的即为DllUnregisterServer反注册函数)。
& L& |/ ~* C) w4 `

, f# m  `& s7 N' {% q7 i# m7 h( h, y
  3.
插件
DLL的秘密
  K( h' a" d* y' V9 i. I  Winamp、Foobar2000等很多
软件
都具有插件功能,从网上下载一个DLL放在插件目录下就能让程序支持新的功能,这是怎么做到的呢?就拿时下流行的播放软件"千千静听"来举例吧。" P3 M* w) }0 B3 l; Y# q8 E
  "千千静听"的插件目录在该软件
安装
目录下的Addin子目录下,程序的插件目录一般都会以"lugins"、"Addin"来命名。在"千千静听"的插件目录中有许多DLL文件,比如tt_asf.dll、tt_rm.dll等,从文件名中就能看出这些DLL是用来让这个播放器支持各种不同类型的音频文件的。同样,用Depends打开这些文件,你就会发现这些文件的输出函数表中都包括一个同样的函数:ttpGetSoundAddIn(见图4)。
) W) H2 ^# }# u7 P- n5 h8 V) [
图4 千千静听所使用的插件协议

& U: F5 A% G' z# ^$ C* [  这就是插件的秘密,各种支持插件功能的程序在发布时,都会同时发布一份插件协议,协议中规定了该程序将要调用的插件DLL中必须包含的函数名称及相关的参数规则,然后第三方的插件程序员在编写这个程序的插件时就根据这个插件的标准来编写DLL的输出函数。
& B' t' d. U( {7 C* y# d, e  ①对于插件tt_asf.dll
; V2 C  Q% m- m, |5 Z# n0 s

1 d: c) U. R& C7 O  ttplayer.exe("千千静听"主程序)对tt_asf.dll说:"我要调用你的ttpGetSoundAddIn函数!"" q4 G4 v2 l7 E/ y7 C7 ~
  tt_asf.dll回答:"OK。"+ ]! C9 [( G( ^, x0 Z
  ②如果把不相关的DLL放进AddIn目录
' \3 T! F; h+ w: k

2 q) j6 M" l# ~$ S7 h  ttplayer.exe对未知DLL说:"我要调用你的ttpGetSoundAddIn函数!"
! l" X7 U- p9 y. R3 B$ c* E3 V  tt_asf.dll回答:"那是什么函数?从来没听说过!"
3 g6 X# j" A! E0 ?2 Q
后期资源网,打造没有广告、免除隐藏回复的全开放式影视技术交流平台。 你的所求就是我们服务的宗旨!!!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|后期资源网

GMT+8, 2024-5-18 17:53 , Processed in 0.112607 second(s), 20 queries .

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表