什么是动态链接库?* wXe.zLQ
=>9`qcNW_
一、动态链接库的概念 L fhd02
动态链接库(Dynamic Link Library,缩写为DLL)是一个可以被其它应用程序共享的程序模块,其中封装了一些可以被共享的例程和资源。动态链接库文件的扩展名一般是dll,也有可能是drv、sys和fon,它和可执行文件(exe)非常类似,区别在于DLL中虽然包含了可执行代码却不能单独执行,而应由Windows应用程序直接或间接调用。 YRFM1?*
Dcq^C LPY
动态链接是相对于静态链接而言的。所谓静态链接是指把要调用的函数或者过程链接到可执行文件中,成为可执行文件的一部分。换句话说,函数和过程的代码就在程序的exe文件中,该文件包含了运行时所需的全部代码。当多个程序都调用相同函数时,内存中就会存在这个函数的多个拷贝,这样就浪费了宝贵的内存资源。而动态链接所调用的函数代码并没有被拷贝到应用程序的可执行文件中去,而是仅仅在其中加入了所调用函数的描述信息(往往是一些重定位信息)。仅当应用程序被装入内存开始运行时,在Windows的管理下,才在应用程序与相应的DLL之间建立链接关系。当要执行所调用DLL中的函数时,根据链接产生的重定位信息,Windows才转去执行DLL中相应的函数代码。 eG.?s;J0
YvonZ
一般情况下,如果一个应用程序使用了动态链接库,Win32系统保证内存中只有DLL的一份复制品,这是通过内存映射文件实现的。DLL首先被调入Win32系统的全局堆栈,然后映射到调用这个DLL的进程地址空间。在Win32系统中,每个进程拥有自己的32位线性地址空间,如果一个DLL被多个进程调用,每个进程都会收到该DLL的一份映像。与16位Windows不同,在Win32中DLL可以看作是每个进程自己的代码。 bTJ7RqL
*`[LsG]ZF
二、动态链接库的优点 )9s[-W,e
k#
/_Zd
1. 共享代码、资源和数据 kjH0u$n
rRxqV?>n!
使用DLL的主要目的就是为了共享代码,DLL的代码可以被所有的Windows应用程序共享。 ebf0;1!
Xh5
z8
2. 隐藏实现的细节 5=eGiF;0\
Q/':<QY
DLL中的例程可以被应用程序访问,而应用程序并不知道这些例程的细节。 xGjEEBL
ffd yDUzQ
3. 拓展开发工具如Delphi的功能 x@yF|8
SKGYmleR
由于DLL是与语言无关的,因此可以创建一个DLL,被C++、VB或任何支持动态链接库的语言调用。这样如果一种语言存在不足,就可以通过访问另一种语言创建的DLL来弥补。 vq|W&
)l^w _;
三、动态链接库的实现方法 {=TD^>?
_|3n h;-m
1. Load-time Dynamic Linking :2La,
h<[ o;E
这种用法的前提是在编译之前已经明确知道要调用DLL中的哪几个函数,编译时在目标文件中只保留必要的链接信息,而不含DLL函数的代码;当程序执行时,利用链接信息加载DLL函数代码并在内存中将其链接入调用程序的执行空间中,其主要目的是便于代码共享。 >Py=H+d!j
<S<(wFE@4
2. Run-time Dynamic Linking qvCl
mZ
p\Jz<dkN1
这种方式是指在编译之前并不知道将会调用哪些DLL函数,完全是在运行过程中根据需要决定应调用哪个函数,并用LoadLibrary和GetProcAddress动态获得DLL函数的入口地址。 J*.qiUAgW
VgOj#Z?K
OX!9T.j
e tY9Pq
教你认识动态链接库DLL文件 WSL_Dc
tR1
kn&w
:*1bhk8~
DLL是Dynamic Link Library的缩写,意为动态链接库。在Windows中,许多应用程序并不是一个完整的可执行文件,它们被分割成一些相对独立的动态链接库,即DLL文件,放置于系统中。当我们执行某一个程序时,相应的DLL文件就会被调用。一个应用程序可有多个DLL文件,一个DLL文件也可能被几个应用程序所共用,这样的DLL文件被称为共享DLL文件。DLL文件一般被存放在C:WindowsSystem目录下。 }{s<!b
jlItPdCv
_rOKif?5
1、如何了解某应用程序使用哪些DLL文件 !9B)/Xi
0]&~ddL
右键单击该应用程序并选择快捷菜单中的“快速查看”命令,在随后出现的“快速查看”窗口的“引入表”一栏中你将看到其使用DLL文件的情况。 Ie4}F|#=
&{99Owqg
2、如何知道DLL文件被几个程序使用 U)2\=%8
V#zDYrp
运行Regedit,进入HKEY_LOCAL_MACHINESoftwareMicrosrftWindowsCurrent- 88G Q F
VersionSharedDlls子键查看,其右边窗口中就显示了所有DLL文件及其相关数据,其中数据右边小括号内的数字就说明了被几个程序使用,(2)表示被两个程序使用,(0)则表示无程序使用,可以将其删除。 D{~I
'~2;WF0h
3、如何解决DLL文件丢失的情况 k? X7h2
Ga"t4[=I
有时在卸载文件时会提醒你删除某个DLL文件可能会影响其他应用程序的运行。所以当你卸载软件时,就有可能误删共享的DLL文件。一旦出现了丢失DLL文件的情况,如果你能确定其名称,可以在Sysbckup(系统备份文件夹)中找到该DLL文件,将其复制到System文件夹中。如果这样不行,在电脑启动时又总是出现“***dll文件丢失……”的提示框,你可以在“开始/运行”中运行Msconfig,进入系统配置实用程序对话框以后,单击选择“System.ini”标签,找出提示丢失的DLL文件,使其不被选中,这样开机时就不会出现错误提示了。 .M!HVq47m
d
n3sh<
什么是ARP欺骗 ?* R["_Mff
^8-CUH\
我们先复习一下上面所讲的ARP协议的原理。在实现TCP/IP协议的网络环境下,一个ip包走到哪里,要怎么走是@@路由表定义,但是,当ip包到达该网络后,哪台机器响应这个ip包却是@@该ip包中所包含的硬件mac地址来识别。也就是说,只有机器的硬件mac地址和该ip包中的硬件mac地址相同的机器才会应答这个ip包,因为在网络中,每一台主机都会有发送ip包的时候,所以,在每台主机的内存中,都有一个 arp--> 硬件mac 的转换表。通常是动态的转换表(该arp表可以手工添加静态条目)。也就是说,该对应表会被主机在一定的时间间隔后刷新。这个时间间隔就是ARP高速缓存的超时时间。 Z8Qmj5'[
>zVj+
通常主机在发送一个ip包之前,它要到该转换表中寻找和ip包对应的硬件mac地址,如果没有找到,该主机就发送一个ARP广播包,于是,主机刷新自己的ARP缓存。然后发出该ip包。 0@vSl%I+
r!'\$(m E
了解这些常识后,现在就可以谈在以太网络中如何实现ARP欺骗了,可以看看这样一个例子。 [;%qxAB/_
同一网段的ARP欺骗 pPUKx=d
a~=$9+?w
同一网段的ARP欺骗 gq!|0
1d,;e:=j
图2 同一网段的arp欺骗 %&0_0BU
UoCFj2?C
如图2所示,三台主机 3+rud9T
A: ip地址 192.168.0.1 硬件地址 AA:AA:AA:AA:AA:AA adRvAq]mA
B: ip地址 192.168.0.2 硬件地址 BB:BB:BB:BB:BB:BB ]25 x X
C: ip地址 192.168.0.3 硬件地址 CC:CC:CC:CC:CC:CC 30 bScW<08
LNPwb1)
一个位于主机B的入侵者想非法进入主机A,可是这台主机上安装有防火墙。通过收集资料他知道这台主机A的防火墙只对主机C有信任关系(开放23端口(telnet))。而他必须要使用telnet来进入主机A,这个时候他应该如何处理呢? 4vQ]7`I.f
sz9C':`W
我们这样考虑,入侵者必须让主机A相信主机B就是主机C,如果主机A和主机C之间的信任关系是建立在ip地址之上的。如果单单把主机B的ip地址改的和主机C的一样,那是不能工作的,至少不能可@@地工作。如果你告诉以太网卡设备驱动程序, 自己IP是192.168.0.3,那么这只是一种纯粹的竞争关系,并不能达到目标。我们可以先研究C这台机器如果我们能让这台机器暂时当掉,竞争关系就可以解除,这个还是有可能实现的。在机器C当掉的同时,将机器B的ip地址改为192.168.0.3,这样就可以成功的通过23端口telnet到机器A上面,而成功的绕过防火墙的限制。 eJlTCXeZ|
ED[`Y.;
上面的这种想法在下面的情况下是没有作用的,如果主机A和主机C之间的信任关系是建立在硬件地址的基础上。这个时候还需要用ARP欺骗的手段让主机A把自己的ARP缓存中的关于192.168.0.3映射的硬件地址改为主机B的硬件地址。 1--_E,Su>
Ep)rEq6
我们可以人为的制造一个arp_reply的响应包,发送给想要欺骗的主机,这是可以实现的,因为协议并没有规定必须在接收到arp_echo后才可以发送响应包.这样的工具很多,我们也可以直接用snifferpro抓一个arp响应包,然后进行修改。 v@(Y:\>
6SJ
你可以人为地制造这个包。可以指定ARP包中的源IP、目标IP、源MAC地址、目标MAC地址。 B_$hi=?TTd
这样你就可以通过虚假的ARP响应包来修改主机A上的动态ARP缓存达到欺骗的目的。 &z8I@^<
下面是具体的步骤: \$Lr L
1. 他先研究192.0.0.3这台主机,发现这台主机的漏洞。 k` cz$>
2. 根据发现的漏洞使主机C当掉,暂时停止工作。 nO.RB#I$F
3. 这段时间里,入侵者把自己的ip改成192.0.0.3 ckG`^<
4. 他用工具发一个源ip地址为192.168.0.3源MAC地址为BB:BB:BB:BB:BB:BB的包给主机A,要求主机A更新自己的arp转换表。 9)}Nx>K
5. 主机更新了arp表中关于主机C的ip-->mac对应关系。 vau0Jn%=ck
6. 防火墙失效了,入侵的ip变成合法的mac地址,可以telnet 了。 {N!Xp:(<7_
z]:{ruvH
上面就是一个ARP的欺骗过程,这是在同网段发生的情况,但是,提醒注意的是,在B和C处于不同网段的时候,上面的方法是不起作用的。 PZ06
_
KsZd.Rf=@
不同网段的ARP欺骗 JL.noV3q$
~;>
psNy
不同网段的ARP欺骗 qRC-+k:
oP vk ^H
'@t}8J
不同网段之间的ARP欺骗 JO{Rth
M@%$9N)gd
如图3所示A、C位于同一网段而主机B位于另一网段,三台机器的ip地址和硬件地址如下: KElzYZl8
A: ip地址 192.168.0.1 硬件地址 AA:AA:AA:AA:AA:AA 99)m d
B: ip地址 192.168.1.2 硬件地址 BB:BB:BB:BB:BB:BB %\<SSp^n
C: ip地址 192.168.0.3 硬件地址 CC:CC:CC:CC:CC:CC [Tmpj9!q
/a@gE^TM
在现在的情况下,位于192.168.1网段的主机B如何冒充主机C欺骗主机A呢?显然用上面的办法的话,即使欺骗成功,那么由主机B和主机A之间也无法建立telnet会话,因为路由器不会把主机A发给主机B的包向外转发,路由器会发现地址在192.168.0.这个网段之内。 jG~zpZh
Y_S>S(0
现在就涉及到另外一种欺骗方式―ICMP重定向。把ARP欺骗和ICMP重定向结合在一起就可以基本实现跨网段欺骗的目的。 98O0M#|d
@'XxMO[Z!<
什么是ICMP重定向呢? ~
A?
w&VM