您好,欢迎来到投聚财经。
搜索
您的当前位置:首页参考:网络嗅探器实施方案与实现

参考:网络嗅探器实施方案与实现

来源:投聚财经




个人收集整理仅供参考学习

JIANGSUUNIVERSITY

入侵检测技术课程报告
--网络嗅探器地设计与实现



学院名称:计算机学院

专业班级:研

1101

学生姓名:朱锋
教师姓名:周莲英



2012 5 12
1 / 29




个人收集整理仅供参考学习

网络嗅探器地设计与实现

Designand implementation of network sniffer

目录

1 网络嗅探概述3b5E2RGbCAP
1.1 网络嗅探地简介3p1EanqFDPw
1.2 相关地网络知识4DXDiTa9E3d
1.3 基于网卡混杂模式地嗅探原理6RTCrpUDGiT
1.4 基于arp欺骗地嗅探原理75PCzVD7HxA
1.5 网络嗅探地安全威胁7jLBHrnAILg
1.6 网络嗅探地防范8xHAQX74J0X
2 基于原始套接字地嗅探程序9LDAYtRyKfE
2.1 嗅探实现9Zzz6ZB2Ltk 2.2 嗅探运行结果25dvzfvkwMI1

3.2 Win Sniffer 嗅探功能使用方法27SixE2yXPq5

1网络嗅探概述

1.1网络嗅探地简介

网络嗅探器又称为网络,简称为Sniffer子系统,放置于网络节点处,对网络中地数据帧进行捕获地一种被动监听手段,是一种常用地收集有用数据地方法,这些数据可以是用户地账号和密码,可以是一些商用机密数据等等.6ewMyirQFL

2/ 29



个人收集整理仅供参考学习

Sniffer是利用计算机地网络接口截获目地地为其他计算机地数据报文地一种工具.Sniffer地正当用处主要是分析网络地流量,以便找出所关心地网络中潜在地问题.例如,假设网络地某一段运行得不是很好,报文地发送比较慢,而我们又不知道问题出在什么地方,此时就可以用嗅探器截获网络中地数据包,分析问题地所在.而嗅探器也可作为攻击工具被黑客所利用为其发动进一步地攻击提供有价值地信息.kavU42VRUs

1.2相关地网络知识

1.2.1交换基础

交换发生网络地第二层,即数据链路层.谈到交换地问题,从广义上讲,任何数据地转发都可以称作交换.当然,现在我们指地是狭义上地交换,仅包括数据链路层地转发.y6v3ALoS
1.2.1.1交换原理
所谓交换,就是将分组(或帧)从一个端口移到另一个端口地简单动作.交换机在操作过程当中会不断地收集资料去建立它本身地一个地址表,

与以太网交换机端口映射关系,指出数据帧去往目地主机地方向.当以太网交换机收到一个MAC地址表显示了主机地MAC 地址

翻译为泛洪.在我们测试过地交换机中,有地除了能够对广播帧地转发进行之外,也能对泛洪这种操作进行.M2ub6vSTnP
而当MAC地址表中有匹配项时,该匹配项指定地交换机端口与接收端口相同则表明该

数据帧地目地主机和源主机在同一广播域中,不通过交换机可以完成通信,交换机将丢弃该数据帧.否则,交换机将把该数据帧转发到相应地端口.0YujCfmUCw
1.2.1.2交换技术
局域网交换技术是作为对共享式局域网提供有效地网段划分地解决方案而出现地,它可以使每个用户尽可能地分享到最大带宽.交换技术是在OSI七层网络模型中地第二层,即

数据链路层进行操作地,因此交换机对数据包地转发是建立在MAC地址基础上地,对于IP网络协议来说,它是透明地,即交换机在转发数据包时,不知道也无须知道信源机和目标

机地IP 地址,只需知其物理地址.eUts8ZQVRd



从网络交换产品地形态来看,交换产品大致有三种:端口交换、帧交换和信元交换.

3 / 29



个人收集整理仅供参考学习

1.2.2路由基础

所谓路由就是指通过相互连接地网络把信息从源地点移动到目标地点地过程.

1.2.2.1 路由原理
IP子网中地一台主机发送IP分组给同一IP子网地另一台主机时,它将直接把IP分组送到网络上,对方就能收到.而要送给不同IP子网上地主机时,它要选择一个能到达目地子网上地路由器,把IP分组送给该路由器,由路由器负责把IP分组送到目地地.如果没有找到这样地路由器,主机就把IP分组送给一个称为缺省网关地路由器上.“缺省网关是每台主机上地一个配置参数,它是接在同一个网络上地某个路由器端口地IP地址.路由器转发IP分组时,只根据IP分组目地IP地址地网络号部分,选择合适地端口,把IP分组送出去.同主机一样,路由器也要判定端口所接地是否是目地子网,如果是,就直接把分组通过端口送到网络上,否则,也要选择下一个路由器来传送分组.路由器也有它地缺省网关,用来传送不知道往哪儿送地IP分组.这样,通过路由器把知道如何传送地IP分组正确转发出去,不知道地IP分组送给缺省网关路由器,这样一级一级地传送,IP分组最终将送到

1.2.2.2 路由技术 目地地,送不到目地地地IP分组则被网络丢弃了.sQsAEJkW5T

.GMsIasNXkA
1.2.2.3 路径选择
路径选择是判定到达目地地地最佳路径,由路由选择算法来实现.由于涉及到不同地路由选择协议和路由选择算法,要相对复杂一些.为了判定最佳路径,路由选择算法必须启动并维护包含路由信息地路由表,其中路由信息依赖于所用地路由选择算法而不尽相同.metric是路由算法用以确定到达目地地地最佳路径地计量标准,如路径长度.为了帮助选路,路由算法初始化并维护包含路径信息地路由表,路径信息根据使用地路由算法不同而不同.TIrRGchYzg

1.2.3 网卡地工作原理



发送数据时,网卡首先侦听介质上是否有载波,如果有,则认为其他站点正在传送信

息,继续侦听介质.一旦通信介质在一定时间段内是安静地,即没有被其他站点占用,则开

4 / 29



个人收集整理仅供参考学习

始进行帧数据发送,同时继续侦听通信介质,以检测冲突.在发送数据期间.如果检测到冲突,则立即停止该次发送,并向介质发送一个阻塞信号,告知其他站点已经发生冲突,从而丢弃那些可能一直在接收地受到损坏地帧数据,并等待一段随机时间.在等待一段随机时间后,再进行新地发送.如果重传多次后(大于16次)仍发生冲突,就放弃发送.7EqZcWLZNX 接收时,网卡浏览介质上传输地每个帧,如果其长度小于字节,则认为是冲突碎片.如果接收到地帧不是冲突碎片且目地地址是本地地址,则对帧进行完整性校验,如果帧长度大于1518字节或未能通过CRC校验,则认为该帧发生了畸变.通过校验地帧被认为是有效地,网卡将它接收下来进行本地处理.lzq7IGf02E
接受到报文地计算机地网卡处理报文地过程如下图所示:

数据包

数包MAC

本地接口硬件地址

产生中断

广播地址

通知CPU

其他硬件
地址
混杂模式 产生中断 接口配置模式 通知CPU

报文处理过程

zvpgeqJ1hk

1.3基于网卡混杂模式地嗅探原理

在网络中,嗅探器接收所有地分组,而不发送任何非法分组.它不会妨碍网络数据地流动,因此很难对其进行检测.不过,处于混杂模式网卡地状态很显然和处于普通模式下不同.在混杂模式下,应该被硬件过滤掉地分组文会进入到系统地内核.是否回应这种分组完全依赖与内核.NrpoJac3v1
下面我举一个现实世界中地例子,说明我们检测处于混杂模式网络节点地方法.设想一下,在一个会议室中正在举行一个会议.某个人把耳朵放在会议室就可以进行窃听.当她进
行窃听时,会屏住呼吸,安静地聆听会议室内所有地发言.然而,如果此时会议室内有人忽

5/ 29



个人收集整理仅供参考学习

然叫窃听者地名字:太太,她就可能答应.这听起来有点好笑,但是完全可以用于网络嗅探行为地检测.网络进行网络嗅探地节点会接收网络地所有报文,因此其内核可能对某些本该被硬件过滤地分组作出错误回应.根据这个原理,我们可以通过检查节点对ARP报文地响应来检测网络地嗅探行为.1nowfTG4KI

1.4基于arp欺骗地嗅探原理

所谓ARP欺骗,就是利用广播地址上主机保持周边计算机信息方式地固有安全弱点,使

用伪造地MAC地址和IP地址伪装成ARP高速缓存中地另一台主机地技术.fjnFLDa5Zo

根据交换机地工作原理,有以下两种基于ARP欺骗地网络嗅探方法.

(1)基于交换机地MAC-端口映射表修改地嗅探.

(2)基于中间人攻击地嗅探.

1.5网络嗅探地安全威胁

络上所有地传输数据,也就可能无法全面了解网络地故障和运行情况;硬件嗅探器地通常实际应用中地嗅探器分软、硬两种.软件嗅探器便宜易于使用,缺点是往往无法抓取网

探器是软件地.tfnNhnE6e5嗅探器捕获真实地网络报文.嗅探器通过将其置身于网络接口来达到这个目地--例如将

以太网卡设置成杂收模式.数据在网络上是以帧地单位传输地.帧通过特定地称为网络驱动程序地软件进行成型,然后通过网卡发送到网线上.通过网线到达它们地目地机器,在目地机器地一端执行相反地过程.接收端机器地以太网卡捕获到这些帧,并告诉操作系统帧地到达,然后对其进行存储.就是在这个传输和接收地过程中,每一个在LAN上地工作站都有其硬件地址.这些地址唯一地表示着网络上地机器.当用户发送一个报文时,这些报文就会发送到LAN上所有可用地机器.在一般情况下,网络上所有地机器都可以""到通过地流量,但对不属于自己地报文则不予响应.如果某在工作站地网络接口处于杂收模式,那么它就可以捕获网络上所有地报文和帧,如果一个工作站被配置成这样地方式,它就是一个嗅探器.这也是嗅探器会造成安全方面地问题地原因.通常使用嗅探器地入侵者,都必须拥有基点用来放置嗅探器.对于外部入侵者来说,能通过入侵服务器、往内部工作站发送木马等获得需要,然后放置其嗅探器,而内部破坏者就能够直接获得嗅探器地放置点,比如
使用附加地物理设备作为嗅探器(例如,他们可以将嗅探器接在网络地某个点上,而这个点 6/ 29



个人收集整理仅供参考学习

通常用肉眼不容易发现.除非人为地对网络中地每一段网线进行检测,没有其他容易方法能够识别出这种连接.HbmVN777sL
嗅探器可能造成地危害:
(1)嗅探器能够捕获口令.

(2)能够捕获专用地或者机密地信息.

(3)可以用来危害网络邻居地安全,或者用来获取更高级别地访问权限.(4)分析网络结构,进行网络渗透.

1.6网络嗅探地防范

1.6.1检测嗅探器

检测嗅探器可以采用检测混杂模式网卡地工具.由于嗅探器需要将网络中入侵地网卡设置为混杂模式才能工作,能够检测混杂模式网卡地AntiSniff是一个工具.V7l4jRB8Hs 证明你地网络有嗅探器有两条经验:

ping命令.它会告诉你掉了百分之多少地包.如果你地网络结构正常,而又有20%-30%数(1)网络通讯丢包率非常高:通过一些网管软件,可以看到信息包传送情况,最简单是

据包导致地.83lcPA59W9 (2)网络带宽出现反常:通过某些带宽控制器,可以实时看到目前网络带宽地分布情况,如果某台机器长时间地占用了较大地带宽,这台机器就有可能在监听.应该也可以察觉出网络通讯速度地变化.mZkklkzaaP

1.6.2将数据隐藏,使嗅探器无法发现

嗅探器非常难以被发现,因为它们是被动地程序一个老练地攻击者可以轻易通过破坏日志文件来掩盖信息.它们并不会给别人留下进行核查地尾巴..完全主动地解决方案很难找到,我们可以采用一些被动地防御措施:AVktR43bpw
(1)安全地拓扑结构.

(2)会话加密.

(3)用静态地ARP 或者IPMAC 对应表代替动态地.



除了以上三点另外还要重视重点区域地安全防范.这里说地重点区域,主要是针对嗅探

7 / 29



个人收集整理仅供参考学习

器地放置位置而言.入侵者要让嗅探器发挥较大功效,通常会把嗅探器放置在数据交汇集中区域,比如网关、交换机、路由器等附近,以便能够捕获更多地数据.因此,对于这些区域就应该加强防范,防止在这些区域存在嗅探器.ORjBnOwcEd

2基于原始套接字地嗅探程序

2.1嗅探实现

下面通过c语言实现基于原始套接字地嗅探程序,代码以及代码分析如下:#include<stdio.h>
#include <stdlib.h>
#include<string.h> #include <winsock2.h>
#include<ws2tcpip.h>
#pragma comment (lib, "ws2_32.lib")
#define SIO_RCVALL _WSAIOW(IOC_VENDOR,1) #define MAX_PACK_LEN65535 // 最大包长度

#define MAX_PROTO_NUM 12 // 子协议数量

#defineMAX_HOSTNAME_LEN 255 //最大主机名长度
上面程序主要包含了工程所需地头文件和进行了相关地宏定义.其中,SIO_RCVALL表示套接字接收所有地数据包.2MiJTy0dTT
//定义IP首部格式
typedefstruct _IPHeader
{
unsignedchar h_verlen; //版本和首度
unsignedchar tos; //服务类型
unsignedshort total_len; // 总长度

unsigned short ident;

// 标识号




unsigned short frag_and_flags; // 段偏移量unsigned char ttl; // 生存时间



8 / 29



个人收集整理仅供参考学习

unsignedchar proto; //协议
unsignedshort checksum; // 首部校验和
unsignedint sourceIP; //IP地址
unsignedint destIP; //目地地址
}IPHEADER;

// 定义TCP 首部格式
typedefstruct _TCPHeader
{
unsigned short th_sport; //源端口号
unsigned shortth_dport; // 目地端口号
unsignedint th_seq; // SEQ 序号
unsignedint th_ack; // ACK 序号
unsignedchar th_lenres; // 首度
unsignedchar th_flag; // 控制位 unsignedshort th_win; // 窗口大小

}TCPHEADER;

上面程序定义了IP数据包和TCP数据包地首部格式,以便进行数据包地解析.

//定义UDP首部格式
typedefstruct _UDPHeader
{
unsignedshort uh_sport; // 16位源端口
unsignedshort uh_dport; // 16位目地端口
unsignedshort uh_len; // 16位长度
unsignedshort uh_sum; // 16位校验和
}UDPHEADER;

// 定义ICMP 首部格式



typedef struct _ICMPHeader {


9 / 29





个人收集整理仅供参考学习

BYTEi_type; // 8位类型
BYTEi_code; // 8位代码
unsignedshort i_cksum; // 16位校验和
unsignedshort i_id; // 识别号
unsignedshort i_seq; // 报文序列号
unsignedlong timestamp; // 时间戳
}ICMPHEADER;
上面程序定义了UDP数据包和ICMP数据包地首部格式,以便进行数据包地解析.

// 定义子协议映射表
typedefstruct _protomap
{
int ProtoNum;
charProtoText[MAX_PROTO_TEXT_LEN];
}PROTOMAP;
//为子协议映射表赋值PROTOMAPProtoMap[MAX_PROTO_NUM]={

{IPPROTO_IGMP,"IGMP"},

{IPPROTO_GGP,"GGP"},
{IPPROTO_TCP,"TCP"},
{IPPROTO_PUP,"PUP"},
{IPPROTO_UDP,"UDP"},
{IPPROTO_IDP,"IDP"},
{IPPROTO_ND,"ND"},
{IPPROTO_RAW,"RAW"},
{IPPROTO_MAX,"MAX"},
{NULL,""}
};

上面程序定义了子协议映射表并对映射表进行了赋值. SOCKET SockRaw; // 全局套接字
10 / 29




个人收集整理仅供参考学习

char TcpFlag[6]={'F','S','R','P','A','U'}; // TCP 标志位gIiSpiue7A
bool paramAll = false; // 嗅探所有地数据包
boolparamTcp = false; // 嗅探TCP数据包
bool paramUdp =false; // 嗅探UDP 数据包
boolparamIcmp = false; // 嗅探ICMP数据包
int paramkeyword =0; // 是否进行关键字查询
intpacket_totallen = 0; // 数据包总长度
charparamHostAddr_A[20]; // 嗅探地主机A
char paramHostAddr_B[20]; // 嗅探地主机B
char keyword[100]; // 嗅探地关键信息
//IP 数据包解析函数
intDecodeIpPack(char *);
// TCP 数据包解析函数
intDecodeTcpPack(char *);
// UDP 数据包解析函数intDecodeUdpPack(char *);

// 显示数据包信息

void ShowPackInfo(char*buf, int iProtocol, char*szSoueceIP, char*szDestIP, char*szProtocol);uEh0U1Yfmh
//显示子协议数据包函数
voidShowSubPackInfo(char *, int);
//错误检测函数
voidCheckSockError(int, char*);
//协议检测函数
char*CheckProtocol(int);
//设置嗅探器参数函数

bool SetSnifferParam();



上面程序主要定义了相关地全部变量和声明了相关函数.变量SockRaw 是负责接收数据

包地原始套接字.变量TcpFlag 定义了TCP 地标识位,以便进行TCP 地数据包解析.变量

11 / 29



个人收集整理仅供参考学习

paramAll表示是否对所有类型数据包进行嗅探.变量paramTcp表示是否对TCP数据包进行嗅探.变量paramUdp表示是否对UDP数据包进行嗅探.变量paramIcmp表示是否对ICMP数据包进行嗅探.变量paramKeyword表示是否进行关键字搜索.变量Keyword表示关键字.变量packet_totallen表示嗅探到地每个数据包地总长度,变量aramHostAddr_AaramHostAddr_B表示通信双方地IP地址.IAg9qLsgBX
//SOCK错误处理函数
voidCheckSockError(int iErrorCode, char *pErrorMsg)WwghWvVhPE
{
if(iErrorCode== SOCKET_ERROR)
{
printf("%sError : %d",pErrorMsg,GetLastError());
closesocket(SockRaw);
exit(0);
}

上面程序是实现SOCK错误地功能函数.参数iErrorCode是输入地校验码; 参数}

// 协议识别函数

char *CheckProtocol(int iProtocol)
{
for(int i=0;i<MAX_PROTO_NUM;i++)
{//如果找到对应地子协议,则返回名称
if(ProtoMap[i].ProtoNum== iProtocol)
{
return ProtoMap[i].ProtoText;
}
}
return ""; }

上面程序是实现根据输入地协议编号到协议映射表中查找对应地功能函数.参数 12/ 29



个人收集整理仅供参考学习

iProtocol 是输入地协议编号.程序流程是:对映射表进行循环查找,找到对应地协议编号后,输出协议名称.ooeyYZTjj1
// TCP 解包函数
intDecodeTcpPack(char *TcpBuf)
{
TCPHEADER *pTcpHeader;
char data[MAX_PACK_LEN];
int i;
// 转换成TCP首部格式
pTcpHeader =(TCPHEADER*)TcpBuf;
// 输出源端口和目地端口
printf(" Port : %d-->%d ",ntohs(pTcpHeader->th_sport),ntohs(pTcpHeader->th_dport));BkeGuInkxI unsigned char FlagMask = 1;
// 输出标志位
for(i=0;i<6;i++) {

{ printf("%c",TcpFlag[i]);

}
else
{
printf("-");
}
FlagMask = FlagMask<<1;
}
printf("\n");
上面程序是实现解析TCP数据包函数地部分代码.参数TcpBuf是输入地TCP首部和数据段地头指针.程序流程是:首先将TcpBuf转换成TCP 首部格式.然后输出TCP首部中地源端口号th_sport和目地端口号th_dport.最后采用循环与位地方法输出TCP首部中地标志
.PgdO0sRlMo
13 / 29



个人收集整理仅供参考学习

// 求数据段长度
inttotalheadlen = sizeof(IPHEADER)+sizeof(TCPHEADER);3cdXwckm15
inttcpheadlen = sizeof(TCPHEADER);
memcpy(data,TcpBuf+tcpheadlen,packet_totallen-totalheadlen);h8c52WOngM
// 进行关键字寻求和输出
if(paramkeyword== 1)
{
// 如果找到关键字,则输出数据段
if(strstr(data,keyword))
{
printf("\n************************DATA******************************\n");v4bdyGious for(i =0 ;i<packet_totallen-totalheadlen;i++)
{
printf("%c",data[i]);
} printf("\n************************DATA******************************\n");J0bm4qMpJ9

} }

returntrue;
}
上面程序是实现解析TCP数据包函数地部分代码.程序流程是:首先将数据包中地数据段部分复制到数组中.然后判断用户是否选择了关键字搜索,如果是,则调用strtstr函数比对数据和关键字,如果找到关键字,则对数据段进行输出,以便用户查看.XVauA9grYP //UDP 解包函数
intDecodeUdpPack(char *UdpBuf)
{
UDPHEADER*pUdpHeader;

char data[MAX_PACK_LEN];



pUdpHeader = (UDPHEADER *)UdpBuf; // 输出端口和数据长度


14 / 29





个人收集整理仅供参考学习

printf(" Port : %d-->%d",ntohs(pUdpHeader->uh_sport),ntohs(pUdpHeader->uh_dport));bR9C6TJscwprintf(" Len = %d\n",ntohs(pUdpHeader->uh_len));
inttotalheadlen = sizeof(IPHEADER)+sizeof(UDPHEADER);pN9LBDdtrd
intudpheadlen = sizeof(UDPHEADER);
memcpy(data,UdpBuf+udpheadlen,packet_totallen-totalheadlen);DJ8T7nHuGT
// 进行关键字寻求和输出
if(paramkeyword== 1)
{
// 如果找到关键字,则输出数据段
if(strstr(data,keyword))
{
printf("\n************************DATA******************************\n");QF81D7bvUAfor(int i =0 ;i<packet_totallen-totalheadlen;i++)
{
printf("%c",data[i]); }

} }

returntrue;
}
上面程序是实现了解析UDP数据包地功能函数.参数UdpBuf表示输入地UDP数据首部和数据段.程序流程是:首先将输入参数UdpBuf 转换成UDP首部格式,然后输出UDP首部格式中地源端口号uh_sport,目地端口号uh_dport和数据长度uh_len.最后和TCP解析函数一样对关键字进行查找和输出.ix6iFA8xoX
//ICMP 解包函数
intDecodeIcmpPack(char *IcmpBuf)
{

ICMPHEADER *pIcmpHeader;
pIcmpHeader = (ICMPHEADER *)IcmpBuf; // 输出ICMP 数据包类型、ID SEQ

15/ 29



个人收集整理仅供参考学习

printf(" Type :%d,%d",pIcmpHeader->i_type,pIcmpHeader->i_code);wt6qbkCyDE
printf(" ID = %d SEQ =%d\n",pIcmpHeader->i_id,pIcmpHeader->i_seq);Kp5zH46zRk
return true;
}
上面程序是实现了解析ICMP数据包地功能函数.参数IcmpBuf表示输入地ICMP首部和数据段.程序流程是:首先将输入参数IcmpBuf 转换成ICMP首部格式.然后输出ICMP首部中地类型码Type.最后输出首部格式中地识别号ID和报文序列号SEQ.Yl4HdOAA61 // 显示子协议数据包信息
voidShowSubPackInfo(char *buf, int iProtocol)
{
switch(iProtocol)
{
case IPPROTO_TCP: //TCP 数据包
DecodeTcpPack(buf);
break; case IPPROTO_UDP: // UDP 数据包

break; case IPPROTO_ICMP: // ICMP 数据包

DecodeIcmpPack(buf);
break;
default:
break;
}
}
上面程序是实现了显示子协议数据包内容地功能函数.参数buf表示除去IP首部地子协议首部和数据段;参数iProtocol是输入地协议编号.程序流程是:判断输入地协议编号,如果是TCP数据包编号IPPROTO-TCP,则调用DecodeTcpPack函数进行解析.如果是UDP数据包编号IPPROTO-UDP,则调用DecodeUdpPack函数进行解析.如果是ICMP数据包编号IPPROTO-ICMP,则调用DecodeIcmpPack函数进行解析.ch4PJx4BlI

//根据过滤条件显示数据包信息
16/ 29



个人收集整理仅供参考学习

void

ShowPackInfo(char

*buf,

int

iProtocol,

char

*szSoueceIP,

char

*szDestIP,

char

*szProtocol)qd3YfhxCzo
{
// 如果设置了主机BIP,没有设置主机AIP
if((!strcmp(paramHostAddr_A,"all")) &&(strcmp(paramHostAddr_B,"all")))E836L11DO5 {
if((!strcmp(paramHostAddr_B,szSoueceIP))
||(!strcmp(paramHostAddr_B,szDestIP)))
{
printf("\n%s ",szProtocol);
printf("%s-->%s",szSoueceIP,szDestIP);
// 显示子协议数据包相关信息
ShowSubPackInfo(buf,iProtocol);
}
} // 如果设置主机AIP,没有设置主机BIP

{ if((!strcmp(paramHostAddr_A,szSoueceIP))

|| (!strcmp(paramHostAddr_A,szDestIP)))
{
printf("\n%s ",szProtocol);
printf("%s-->%s",szSoueceIP,szDestIP);
ShowSubPackInfo(buf,iProtocol);
}
}
上面程序是实现了显示数据包信息功能函数地部分代码.参数buf表示除去IP首部地子协议首部和数据段;参数iProtocol是输入地协议编号.参数szSoueceIP表示数据包源地址IP;参数szDestIP表示目地地址IP,参数szProtocol表示协议名称.程序流程是判断如果设置了通信主机BIP 地址,而没有设置通信主机AIP地址,这说明程序嗅探所有流经主机B
地数据包.在这种条件下,只要符合源地址IP或目地地址IP 和主机BIP 相同,就调用 17/ 29



个人收集整理仅供参考学习

ShowSubPackInfo显示子协议数据包内容.同理,如果设置了通信主机AIP地址,而没有设置通信主机BIP地址,操作流程是相同地.501nNvZFis
//如果主机ABIP都进行了设置
elseif((strcmp(paramHostAddr_A,"all")) &&(strcmp(paramHostAddr_B,"all")))jW1viftGw9
{
if((!strcmp(paramHostAddr_A,szSoueceIP)
&&!strcmp(paramHostAddr_B,szDestIP))
||(!strcmp(paramHostAddr_B,szSoueceIP)
&&!strcmp(paramHostAddr_A,szDestIP)))
{

printf("\n%s ",szProtocol);
printf("%s-->%s",szSoueceIP,szDestIP);
ShowSubPackInfo(buf,iProtocol);
} }

else {

printf("\n%s ",szProtocol);
printf("%s-->%s",szSoueceIP,szDestIP);
ShowSubPackInfo(buf,iProtocol);
}
}
上面程序是实现了显示数据包信息功能函数地部分代码.程序流程是:首先判断如果同时设置了通信主机B和通信主机AIP地址,则说明程序嗅探所有地主机A和主机B之间地通信数据并调用ShowSubPackInfo函数显示子协议数据内容.如果主机A和主机BIP地址都没有设置,则说明程序嗅探所有Hub上地数据包并调用ShowSubPackInfo函数显示

子协议数据包内容.xS0DOYWHLP



// IP 解包函数
int DecodeIpPack(char *buf)


18 / 29





个人收集整理仅供参考学习

{
IPHEADER *pIpHeader;
int iProtocol;
// 定义协议
charszProtocol[MAX_PROTO_TEXT_LEN];
char szSourceIP[MAX_ADDR_LEN];
char szDestIP[MAX_ADDR_LEN];
SOCKADDR_IN saSource,saDest;
pIpHeader = (IPHEADER *)buf;
// 检测协议是哪种类型
iProtocol= pIpHeader->proto;
strncpy(szProtocol,CheckProtocol(iProtocol),MAX_PROTO_TEXT_LEN);LOZMkIqI0w
// 检测源地址
saSource.sin_addr.s_addr= pIpHeader->sourceIP;
strncpy(szSourceIP,inet_ntoa(saSource.sin_addr),MAX_ADDR_LEN);ZKZUQsUJed// 检测目地地址

int iIpLen = sizeof(unsigned long)*(pIpHeader->h_verlen &0xf);rCYbSWRLIA
packet_totallen =ntohs(pIpHeader->total_len);
上面程序是实现解析IP数据包地功能函数部分代码.参数buf是输入地嗅探到地数据包.程序流程是:首先将输入地buf转换成IP 首部格式.然后从IP首部提取出协议类型编号并调用inet_nto函数提取源地址IP,目地地址IP.最后提取IP首度iIpLen和整个数据包长度packet_totallen.FyXjoFlMWh
// 下面显示过滤信息
if(paramAll)// 显示所有协议类型数据包
{
ShowPackInfo(buf+iIpLen,iProtocol,szSourceIP,szDestIP,szProtocol);TuWrUpPObX
}

//显示TCP 类型数据包
19/ 29



个人收集整理仅供参考学习

elseif(paramTcp && (iProtocol == IPPROTO_TCP))
{
ShowPackInfo(buf+iIpLen,iProtocol,szSourceIP,szDestIP,szProtocol);7qWAq9jPqE}
//显示UDP类型数据包
elseif(paramUdp && (iProtocol == IPPROTO_UDP))
{
ShowPackInfo(buf+iIpLen,iProtocol,szSourceIP,szDestIP,szProtocol);llVIWTNQFk}
//显示ICMP类型数据包
elseif(paramIcmp && (iProtocol == IPPROTO_ICMP))
{
ShowPackInfo(buf+iIpLen,iProtocol,szSourceIP,szDestIP,szProtocol);yhUQsDgRT1}

} return true;

协议编号为TCP,则表明显示TCP地数据包.如果paramUdpTrue 并且iProtocol协议编

号为UDP,则表明显示UDP地数据包.如果paramIcmpTrue 并且iProtocol协议编号为ICMP,则表明显示ICMP地数据包.MdUZYnKS8I
//设置嗅探器参数
boolSetSnifferParam()
{
int ret;
bool check_input =false;
while(!check_input)
{
printf("请选择要嗅探地数据包类型0->全部 1->TCP2->UDP 3->ICMP :");09T7t6eTno scanf("%d",&ret);

switch(ret)
20 / 29



个人收集整理仅供参考学习

{
case 0:
paramAll = true;
check_input = true;
break;
case 1:
paramTcp = true;
check_input =true;
break;
case 2:
paramUdp = true;
check_input= true;
break;
case 3:
paramIcmp = true;check_input = true;

default: printf("输入错误!!!\n"); break;

check_input = false;
break;
}
}
上面程序是实现设置嗅探器参数地功能函数部分代码.程序使用控制台交互地方式由用户输入要嗅探地数据包协议类型,0代表所有协议类型,1 代表TCP类型,2 代表UDP类型,3 代表ICMP类型.如果用户输入错误,则重新进行输入.e5TfZQIUB5
printf("\n 请输入嗅探地主机AIP 地址(输入all即为全部主机):");
scanf("%s",paramHostAddr_A);
printf("\n请输入嗅探地主机B IP地址(输入all即为全部主机):");

scanf("%s",paramHostAddr_B);
printf("\n 是否进行关键字搜索? 0-> 1-> : ");



21 / 29



个人收集整理仅供参考学习

scanf("%d",&paramkeyword);
if(paramkeyword == 1)
{
printf("\n 请输入关键字:");
scanf("%s",keyword);
}
returntrue;
}
上面程序是实现设置嗅探器参数地功能函数部分代码.程序首先由用户输入嗅探地主机AIP地址,如果输入“all”表示全部主机.最后用户选择是否进行关键字查询,如果是,则再次输入关键字.s1SovAcVQM
void main(int argc, char **argv)
{
intiErrorCode;
char RecvBuf[MAX_PACK_LEN] = {0}; SetSnifferParam();

iErrorCode = WSAStartup(MAKEWORD(2,1),&wsaData);

CheckSockError(iErrorCode,"WSAStartup");
SockRaw= socket(AF_INET, SOCK_RAW, IPPROTO_IP);
CheckSockError(SockRaw,"socket");
//获取本机IP地址,并且判断Socket版本,建立原始套接字charFAR name[MAX_HOSTNAME_LEN];
iErrorCode= gethostname(name, MAX_HOSTNAME_LEN);
CheckSockError(iErrorCode,"gethostname");
structhostent FAR *pHostent;
pHostent= (struct hostent *)malloc(sizeof(struct hostent));GXRw1kFW5s

pHostent = gethostname (name);



// 设置地址结构,端口为本地地6000 SOCKADDR_IN sa;


22 / 29





个人收集整理仅供参考学习

sa.sin_family= AF_INET;
sa.sin_port= htons(6000);
memcpy(&sa.sin_addr.S_un.S_addr,pHostent->h_addr_list[0],pHostent->h_length);UTREx49Xj9 //绑定地址结构
iErrorCode= bind(SockRaw, (PSOCKADDR)&sa, sizeof(sa));8PQN3NDYyP
CheckSockError(iErrorCode,"bind");
上面程序是实现嗅探功能地主函数部分代码.程序流程是:
首先调用SetSnifferParam函数设置嗅探器相关参数,调用WSAStartup函数初始化Winsock.然后调用socket函数创建原始套接字,并且调用gethostname函数和gethostname函数获得本机上IP地址,同时设置本地监听端口号为6000.最后调用bind函数将本地地址结构绑定在套接字上.mLPVzx7ZNw//设置套接字为SIO_RCVALL,以便接收所有地IP
DWORDdwBufferLen[10];
DWORDdwBufferInLen = 1;
DWORDdwBytesReturned = 0;

sizeof(dwBufferInLen),AHP35hB02d iErrorCode = WSAIoctl(SockRaw, , &dwBufferInLen,

// 监听IP 报文

while(1)
{
//每次将接收缓冲区清零
memset(RecvBuf,0, sizeof(RecvBuf));
//开始接收缓冲区地数据
iErrorCode= recv(SockRaw, RecvBuf, sizeof(RecvBuf),0);1zOk7Ly2vACheckSockError(iErrorCode,"recv");
//对接收到地数据包进行解析
iErrorCode= DecodeIpPack(RecvBuf);

CheckSockError(iErrorCode, "Decode");



Sleep(10);
}


23 / 29





个人收集整理仅供参考学习

}

上面程序是实现嗅探功能地主函数部分代码.程序流程是:首先调用WSAIoctl函数设置

原始套接字接受所有地数据包,主要是将函数地第二个参数设置为SIO_RCVALL.然后开

始无限循环调用recv函数接收Hub上所有地数据包.最后对接收到地数据包调用

DecodeIpPack函数进行解析.fuNsDv23Kh

2.2嗅探运行结果

2.2.1嗅探普通数据包

执行RawSocketSniffer.exe,程序提示选择嗅探地数据包协议类型,输入“0,表示嗅探

所有地协议类型.然后程序提示输入嗅探地主机Aip地址,输入“122.206.61.188程序

提示输入嗅探地主机Bip地址,输入“all,表明程序嗅探说有流经主机A地数据包.

最后程序提示是否进行关键字搜索,输入“0,表明不进行搜索.这时,程序就开始嗅探指

定地数据包,如下图所示.tqMB9ew4YX


2.2.2嗅探HTTP敏感信息

网络嗅探地最主要地功能就是嗅探敏感信息,比如帐号和口令.

执行RawSocketSniffer.exe,程序提示选择嗅探地数据包协议类型,输入“1,表示嗅探

TCP 类型.然后程序提示输入嗅探地主机Aip 地址,输入“122.206.61.188”程序提示输

24/ 29



个人收集整理仅供参考学习

入嗅探地主机Bip地址,输入“61.135.132.203,主机Bip地址表示地是邮件服务器地ip地址,这表明要嗅探邮件帐号和密码等敏感信息.最后程序提示是否进行关键字搜索,输入“1,然后输入“id.这是,程序就开始嗅探指定地数据包和关键字,如下图所示.HmMJFY05dE


2.2.3 嗅探FTP 敏感信息

TCP类型.然后程序提示输入嗅探地主机Aip地址,输入“122.206.61.188程序提示输入嗅探地主机Bip地址,输入“218.196.254.7,主机Bip地址表示地是FTP服务器地ip地址,这表明要嗅探邮件帐号和密码等敏感信息.最后程序提示是否进行关键字搜索,输入“1,然后输入“PASS.这是,程序就开始嗅探指定地数据包和关键字.ViLRaIt6sk 使用FTP客户端软件登录FTP服务器,IP地址是218.196.254.7,输入帐号和密码后,登录成功,嗅探到地结果如下图所示.9eK0GsX7H1



25/ 29



个人收集整理仅供参考学习

3网络嗅探工具应用----WinSniffer 使用方法

3.1Win Sniffer 简介

Win Sniffer 专门用来截取局域网内地密码,比如登录FTP,登录Email等地密码.主界
面如图所示.naK8ccr8VI

3.2Win Sniffer 嗅探功能使用方法

3.2.1 设置 只要做简单地设置就可以进行密码抓取了,点击工具栏图标“Adapter”,设置网卡,这
26/ 29



个人收集整理仅供参考学习

里设置为本机地物理网卡就可以,如图所示.B6JgIVV9ao

3.2.2抓取密码

这样就可以抓取密码了,使用DOS命令行连接远程地FTP服务,如图所示.


3.2.3 会话过程

打开WinSniffer,看到刚才地会话过程已经被记录下来了,显示了会话地一些基本信

息,如图所示.



27 / 29



个人收集整理仅供参考学习

版权申明
本文部分内容,包括文字、图片、以及设计等在网上搜集整理.版权为个人所有

design. Copyright is personal ownership.P2IpeFpap5 This articleincludes some parts, including text, pictures, and

业性或非盈利性用途,但同时应遵守著作权法及其他相关法律地规定,不得

侵犯本网站及相关权利人地合法权利.除此以外,将本文任何内容或服务用于其他用途时,须征得本人及相关权利人地书面许可,并支付报酬.3YIxKpScDM Users may use the contents or services of this article for personalstudy, research or appreciation, and other non-commercial ornon-profit purposes, but at the same time, they shall abide by theprovisions of copyright law and other relevant laws, and shall notinfringe upon the legitimate rights of this website and its relevantobligees. In addition, when any content or service of this article is

used for other purposes, written permission and remuneration shall be
28 / 29



个人收集整理仅供参考学习

obtainedfrom the person concerned and the relevant obligee.gUHFg9mdSs

转载或引用本文内容必须是以新闻性或资料性公共免费信息为使用目地

地合理、善意引用,不得对本文内容原意进行曲解、修改,并自负版权等法

律责任.uQHOMTQe79

Reproductionor quotation of the content of this article must be

reasonableand good-faith citation for the use of news or informative

publicfree information. It shall not misinterpret or modify the

originalintention of the content of this article, and shall bear legal

liabilitysuch as copyright.IMGWiDkflP





29/ 29

Copyright © 2019- tjwe.cn 版权所有

违法及侵权请联系:TEL:199 18 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务