嗅探器(sniffer)是一种刺探网络中传输数据的工具.为达到这一目的,一般的做法是设置网卡为混杂模式,这样就可以嗅探到所有经过本机网卡的数据(这种一般的sniffer原理不在此阐述).但是这种sniffer有一个缺点,就是它只适用于共享式局域网,对于交换式局域网无效.因为在交换式局域网中,网络中的数据并不会经过每一台主机的网卡,所以对于交换式局域网,就要用另外一种更为主动的方法去嗅探,那就是基于arp欺骗的嗅探. 我们假设有三台主机a,b,c位于同一个交换式局域网中,攻击者处于主机a,而主机b,c正在通信.现在a希望能嗅探到b->c的数据,于是a就可以伪装成c对b做arp欺骗——向b发送伪造的arp应答包,应答包中ip地址为c的ip地址而mac地址为a的mac地址.这个应答包会刷新b的arp缓存,让b认为a就是c,说详细点,就是让b认为c的ip地址映射到的mac地址为主机a的mac地址.这样,b想要发送给c的数据实际上却发送给了a,就达到了嗅探的目的.另外,由于arp缓存是动态更新的,因此,我们要不断的向b发送伪造的arp应答包,以防止b的arp缓存中的ip-mac映射关系被c改回来.(这里涉及到arp欺骗的知识,如果对此有疑惑,请查阅相关资料.)当然,这样嗅探之后,本应接收到数据的c就不能接收到b发送过来的数据了,也就是说,b与c的通信相当于被中断了.因此,我们在嗅探到数据后,还必须将此数据转发给c,这样才能保证b,c的通信不被中断. 以上就是基于arp欺骗的嗅探基本原理,在这种嗅探方法中,嗅探者a实际上是插入到了b->c中,b的数据先发送给了a,然后再由a转发给c,其数据传输关系如下所示: b----->a----->c b<------------c 当然,如果你还想嗅探到c->b的数据,还可以将a插入到c->b中,这样,就能嗅探到b,c间通信的全部数据了. 下面,还是用具体的代码来说明问题.在这个代码中,涉及到了iphlpapi与winpcap的编程,请查阅相关资料:
#pragma comment(lib, "packet.lib")#pragma comment(lib, "ws2_32.lib")#pragma comment(lib,"iphlpapi.lib") 【程序编程相关: 结合ADO、ADOX和MFC的文档/视】
#include "stdafx.h"#include "winsock2.h"#include "packet32.h"#include "wchar.h"#include "stdio.h"#include "iphlpapi.h" 【推荐阅读:结合ADO、ADOX和MFC的文档/视图】
#pragma pack(push, 1) 【扩展信息:线程学习笔记(2)-互斥对象 】
#define ndis_packet_type_directed 0x0001 //直接模式
typedef struct _et_header //以太网头部{ unsigned char eh_dst[6]; unsigned char eh_src[6]; unsigned short eh_type;}et_header;
... 下一页