文档库 最新最全的文档下载
当前位置:文档库 › 网络嗅探器设计报告

网络嗅探器设计报告

网络嗅探器设计报告
网络嗅探器设计报告

计算机网络课程

设计报告

题目:网络嗅探器设计

编号:10-11-02-02

姓名:

学号:

日期:2011-5-17 至2011-6-27

课程设计成绩:指导教师签名:

目录

目录 (2)

一、课程设计要求 (3)

二、技术要点 (4)

1、属性.............................................................. 错误!未定义书签。

2、主要方法 (4)

3、发生的事件 (5)

三、编程思想 (6)

四、实现过程 (10)

五、难点与主要问题 (23)

六、结束语 (23)

参考资料 (24)

一、课程设计要求

编写图形界面程序实现简单网络嗅探器,具体功能如下:

1. 能够截获流经网卡的数据包;

2. 能够清楚的解析出某个数据包的以太网头部细节信息,IP头部细节信息,如果是TCP、UDP、ARP等协议的数据包,还需要根据协议详细的解析出TCP头,UDP头,ARP头。这些内容能够清楚的体现在图形界面上;

3.要求界面美观,实现设计内容所述功能;

4.要求程序代码与界面中均带有明显的学号姓名等版权信息。

二、技术要点

1、属性

winpcap的主要功能在于独立于主机协议(如TCP-IP)而发送和接收原始数据包。也就是说,winpcap不能阻塞,过滤或控制其他应用程序数据包的发收,它仅仅只是监听共享网络上传送的数据包。

Winpcap驱动各项功能

1> 捕获原始数据包,包括在共享网络上各主机发送/接收的以及相互之间交换的数据包;

2> 在数据包发往应用程序之前,按照自定义的规则将某些特殊的数据包过滤掉;

3> 在网络上发送原始的数据包;

4> 收集网络通信过程中的统计信息。

2、主要方法

〖抓包〗

抓包是NPF最重要的操作。在抓包的时候,驱动使用一个网络接口监视着数据包,并将这些数据包完整无缺地投递给用户级应用程序。

抓包过程依赖于两个主要组件:

一个数据包过滤器,它决定着是否接收进来的数据包并把数据包拷贝给监听程序。数据包过滤器是一个有布尔输出的函数。如果函数值是true,抓包驱动拷贝数据包给应用程序;如果是false,数据包将被丢弃。NPF数据包过滤器更复杂一些,因为它不仅决定数据包是否应该被保存,而且还得决定要保存的字节数。被NPF驱动采用的过滤系统来源于BSD Packet Filter(BPF),一个虚拟处理器可以执行伪汇编书写的用户级过滤程序。应用程序采用用户定义的过滤器并使用wpcap.dll将它们编译进BPF程序。然后,应用程序使用BIOCSETF IOCTL写入核心态的过滤器。这样,对于每一个到来的数据包该程序都将被执行,而满足条件的数据包将被接收。与传统解决方案不同,NPF不解释(interpret)过滤器,而是执行(execute)它。由于性能的原因,在使用过滤器前,NPF提供一个JIT编译器将它转化成本地的80x86函数。当一个数据包被捕获,NPF调用这个本地函数而不是调用过滤器解释器,这使得处理过程相当快。

一个循环缓冲区,用来保存数据包并且避免丢失。一个保存在缓冲区中的数据包有一个头,它包含了一些主要的信息,例如时间戳和数据包的大小,但它不是协议头。此外,以队列插入的方式来保存数据包可以提高数据的存储效率。可以以组的方式将数据包从NPF缓冲区拷贝到应用程序。这样就提高了性能,因为它降低了读的次数。如果一个数据包到来的时候缓冲区已经满了,那么该数据包将被丢弃,因此就发生了

丢包。

3、发生的事件

网络嗅探器通信流程如下图示:

< 图-1 > 网络嗅探器通信流程图

(1)调用Winsocket创建正确类型的原始套接字(AF_INET、SOCK_ RAW、IPPR0T0_IP);

m_s=socket(AF_JNET、SOCK_RAW、IPPROTO_IP)

(2)通过setsockopt( ) 函数来设置IP头操作选项;

setsockopt( m_s , SOL_SOCKET , SO_RCVTIMEO , (const char *)&rcvtimeo ,

sizeof(rcvtimeo)

(3)调用bind将套接字绑定到某一明确的本地接口;

bind(m_s,(PSOCKADDR)&sa, sizeof(sa)

(4)设置socket模式,调用WSA10ctl( ) 函数。使用SIO RCVALL命令将网卡设为混杂模式;

WSAIoctl( m_s,SIO_RCVALL ,&dwBufferInLen,sizeof(dwBufferInLen),&dwBufferLen, sizeof(dwBufferLen), &dwBytesReturned , NULL , NULL )

(5)开启一个监听线程,调用threadFunc函数

AfxBeginThread( threadFunc , (LPVOID)this );

(6)用Recv接收IP数据包,并作相应处理;

recv( pDlg->m_s , buf , sizeof( buf ) , 0 )

(7)调用closesocket关闭套接字,释放套接字资源:

closesocket(m_s)。

三、编程思想

具体到编程实现上,对网卡混杂模式的设置是通过原始套接字(raw socket)来实现的,这也有别于通常经常使用的数据流套接字和数据报套接字。在创建了原始套接字后,需要通过setsockopt()函数来设置IP头操作选项,然后再通过bind()函数将原始套接字绑定到本地网卡。为了让原始套接字能接受所有的数据,还需要通过WSAIoctl ()来设置套接字模式,从而开启监听线程。程序的核心部分即为监听线程函数threadFund(),由此对网络数据包进行嗅探,对数据包的获取仍像流式套接字或数据报套接字那样通过recv()函数来完成。但是与其他两种套接字不同的是,原始套接字此时捕获到的数据包并不仅仅是单纯的数据信息,而是包含有IP头、TCP头等信息头的最原始的数据信息,这些信息保留了它在网络传输时的原貌。通过对这些在低层传输的原始信息的分析可以得到有关网络的一些信息。由于这些数据经过了网络层和传输层的打包,因此需要根据其附加的帧头对数据包进行分析。下面给出结构:

数据包的总体结构:(网际层的IP 协议及配套协议)

<图-2> 数据包的总体结构

数据在从应用层到达传输层时,将添加TCP数据段头,或是UDP数据段头。其中UDP 数据段头比较简单,由一个8字节的头和数据部分组成,具体格式如下:UDP 用户数据报的封装

<图-3>UDP 用户数据报的封装

TCP数据头则比较复杂,以20个固定字节开始,在固定头后面还可以有一些长度不固定的可选项,下面给出TCP数据段头的格式组成:

TCP段格式:

<图-4>TCP段格式

在网络层,还要给TCP数据包添加一个IP数据段头以组成IP数据报。IP数据头以大端点机次序传送,从左到右,版本字段的高位字节先传输(SPARC是大端点机;Pentium 是小端点机)。如果是小端点机,就要在发送和接收时先行转换然后才能进行传输。

IP数据段头格式如下:

<图-5>IP数据段头格式

ICMP 报文的格式:

<图-6>ICMP 报文的格式

同样,在实际编程中也需要通过一个数据结构来表示各协议数据段头,下面给出数据结构的定义:

// IP头结构

typedef struct _IPHEADER {

unsigned char header_len:4; // 首部长度4位

unsigned char version:4; // 版本4位

unsigned char tos; // 服务类型8位

unsigned short total_len; // 数据报大小16位

unsigned short ident; // 数据报标识16位

unsigned short flags; // 标志位3位

unsigned char ttl; // 生存时间8位

unsigned char proto; // 上层协议标识8位protocol ( IP , TCP, UDP etc)

unsigned short checksum; // IP首部校验和16位

unsigned int sourceIP; // 源IP地址32位

unsigned int destIP; // 目的IP地址32位

}IPHEADER;

TCP、UDP、ICMP包头部结构:

#define UDP_HEAD_LEN 8 /* UDP 头部长度*/

#define PSEUDO_HEAD_LEN 12 /* Pseudo head length */

#define ICMP_HEAD_LEN 4 /* ICMP 头部长度*/

// TCP包头部结构

struct TCPPacketHead {

WORD SourPort;

WORD DestPort;

DWORD SeqNo; // 序列号32位

DWORD AckNo; // 确认号32位

BYTE HLen; // 首部长度4位

BYTE Flag; // 标志位6位

WORD WndSize; // 窗口大小16位

WORD ChkSum; // 校验和16位

WORD UrgPtr; // 紧急数据偏移量16位

// ICMP包头部结构

struct ICMPPacketHead {

BYTE Type; // 类型8位

BYTE Code; // 类代码8位

WORD ChkSum; // 校验和16位

};

// UDP包头部结构

struct UDPPacketHead {

WORD SourPort; // 源端口16

WORD DestPort; // 目的端口16

WORD Len; // 长度16

WORD ChkSum; // 校验和16

};

在明确了以上几个数据段头的组成结构后,就可以对捕获到的数据包进行分析了。据前面的设计思路,写出网络嗅探器的实现代码,主要代码实现清单为:

// 创建原始套接字

m_s = socket( AF_INET , SOCK_RAW , IPPROTO_IP ) ;

// 设置IP头操作选项

setsockopt( m_s , SOL_SOCKET , SO_RCVTIMEO , (const char *)&rcvtimeo ,

sizeof(rcvtimeo)

// 获取本机名

gethostname(szHostName, 128);

// 获取本地IP 地址

pHost = gethostbyname(szHostName);

// 填充SOCKADDR_IN结构

sa.sin_family = AF_INET;

sa.sin_port = htons(7000);

sa.sin_addr.s_addr= m_iphostsource;

// 把原始套接字sock 绑定到本地网卡地址上

bind(m_s,(PSOCKADDR)&sa, sizeof(sa)

// 设置socket模式,调用WSAloctl( ) 函数。使用SIO RCVALL命令将网卡设为混杂模式;WSAIoctl( m_s,SIO_RCVALL ,&dwBufferInLen,sizeof(dwBufferInLen),&dwBufferLen, sizeof(dwBufferLen), &dwBytesReturned , NULL , NULL )

// 开启一个监听线程,调用threadFunc函数

AfxBeginThread( threadFunc , (LPVOID)this );

//用Recv接收IP数据包,并作相应处理;

recv( pDlg->m_s , buf , sizeof( buf ) , 0 )

//调用closesocket关闭套接字,释放套接字资源:

closesocket(m_s)。

四、实现过程

4.1用MFCAppWizard创建应用程序框架

4.1.1选择应用项目模板

选择File New命令,弹出New对话框,选择Projects选项卡,从左边的项目模板列表框中选择MFC AppWizard[exe]项目类型。在Project name文本框中输入项目名ipmon063214,单击OK按钮,进入MFC应用程序向导。默认情况下,AppWizard 会自动在指定目录下以项目名为名字创建一个新目录。

4.1.2选择应用程序类型和语言

在弹出MFC AppWizard-Step1对话框,选择应用程序类型为Dialog based(基于对话框的应用程序),基于对话框的应用程序主窗口是一个对话框。语言使用默认的“中文[中国]”

4.1.3设置应用程序外观

上一步骤完成后单击Next按钮,进入设置应用程序外观的对话框,对话框的前几项依次确定对浮定工具条、打印、预览以及通信等特性的支持。

4.1.4设置项目的风格

在弹出的对话框中出现3个方面的选项供用户选择,分别是:

1)应用程序的主窗口是MFC标准风格还是资源管理器窗口风格。

2)在源文件中是否加入注释来引导用户编写程序代码。

3)使用动态链接库还是静态链接库。

保留默认值,单击Next按钮,进入下一步。

4.1.5查看类的信息

在这一步可以看到基类和自动生成的类、头文件、实现文件,分别为CIpmon063214WinApp、CIpmon063214App、ipmon063214.h、ipmon063214.cpp。

4.2修改对话框并添加控件

如下图

4.3 Sniff的具体实现

4.3.1 在头文件中定义协议相关的结构和宏

在ipmon063214Dlg.h,首先定义一些协议相关的结构和宏。另外还会申明一个线程函数为友员函数,它负责监听网络数据报。Ipmon063214Dlg.h中的主要代码如下所示:

// 定义协议的名称结构

typedef struct _PROTN2T

{

int proto ;

char *pprototext ;

}PROTN2T ;

// 协议数

#define PROTO_NUM 11

// IP头结构

typedef struct _IPHEADER {

……..

}IPHEADER;

#define UDP_HEAD_LEN 8 /* UDP head length */

#define PSEUDO_HEAD_LEN 12 /* Pseudo head length */

#define ICMP_HEAD_LEN 4 /* ICMP head length */

// TCP包头部结构

struct TCPPacketHead {

……..};

// ICMP包头部结构

struct ICMPPacketHead {

……..};

// UDP包头部结构

struct UDPPacketHead {

……..};

/////////////////////////////////////////////////////////////////////////////

// CIpmonDlg dialog

class CIpmonDlg : public CDialog

{

// Construction

public:

// 向ListControl 中控件添加数据的函数AddData

void AddData(CString s0,CString s1,CString s2,CString s3,CString s4,CString s5,CString s6);

CIpmonDlg(CWnd* pParent = NULL); // standard constructor

……..

/////////////////////////////////////////////////////////////////////////////

//监听线程函数

friend UINT threadFunc ( LPVOID p ) ;

// Generated message map functions

//{{AFX_MSG(CIpmonDlg)

virtual BOOL OnInitDialog();

afx_msg void OnSysCommand(UINT nID, LPARAM lParam);

afx_msg void OnPaint();

afx_msg HCURSOR OnQueryDragIcon();

afx_msg void OnLookUp();

virtual void OnOK();

//}}AFX_MSG

DECLARE_MESSAGE_MAP()

};

4.3.2 解析数据包协议

首先定义一个协议名称的数组和一个得到协议名称的函数,它们的代码如下所示:

PROTN2T aOfProto [ PROTO_NUM + 1] =

{

{ IPPROTO_IP , "IP" },

{ IPPROTO_ICMP , "ICMP" },

{ IPPROTO_IGMP , "IGMP" },

{ IPPROTO_GGP , "GGP" },

{ IPPROTO_TCP , "TCP" },

{ IPPROTO_PUP , "PUP" },

{ IPPROTO_UDP , "UDP" },

{ IPPROTO_IDP , "IDP" },

{ IPPROTO_ND , "NP" },

{ IPPROTO_RAW , "RAW" },

{ IPPROTO_MAX , "MAX" },

{ NULL , "" }

} ;

// 得到协议的名称

char *get_proto_name( unsigned char proto )

{

BOOL bFound = FALSE ;

for( int i = 0 ; i < PROTO_NUM ; i++ )

{

if( aOfProto[i].proto == proto )

{

bFound = TRUE ;

break ;

}

}

if( bFound )

return aOfProto[i].pprototext ;

return aOfProto[PROTO_NUM].pprototext ;

}

4.3.3对话框的初始化函数OnInitDialog()

BOOL CIpmonDlg::OnInitDialog()

{

CDialog::OnInitDialog();

// Add "About..." menu item to system menu.

// IDM_ABOUTBOX must be in the system command range.

ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);

ASSERT(IDM_ABOUTBOX < 0xF000);

CMenu* pSysMenu = GetSystemMenu(FALSE);

if (pSysMenu != NULL)

{

CString strAboutMenu;

strAboutMenu.LoadString(IDS_ABOUTBOX);

if (!strAboutMenu.IsEmpty())

{

pSysMenu->AppendMenu(MF_SEPARATOR);

pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);

}

}

// Set the icon for this dialog. The framework does this automatically

// when the application's main window is not a dialog

SetIcon(m_hIcon, TRUE); // Set big icon

SetIcon(m_hIcon, FALSE); // Set small icon

// TODO: Add extra initialization here

CHAR szHostName[128] = {0};

HOSTENT* pHost = NULL;

CHAR* pszIp = NULL;

int iNum = 0;

// 初始化SOCKET

if(AfxSocketInit(NULL)==FALSE)

{

AfxMessageBox("Sorry, socket load error!");

return FALSE;

}

// 得到主机名

if(gethostname(szHostName, 128)==0)

{

pHost = gethostbyname(szHostName);

if(pHost != NULL)

{

pszIp = inet_ntoa(*(in_addr*)pHost->h_addr_list[iNum]);

m_ipsource = inet_addr(pszIp);

}

else AfxMessageBox("pHost = NULL!");

}

else AfxMessageBox("can't find host name!");

// ListControl的初始化函数

DWORD dwStyle=GetWindowLong(m_ctrList.GetSafeHwnd(),GWL_STYLE);

dwStyle&=~LVS_TYPEMASK;

dwStyle|=LVS_REPORT;

SetWindowLong(m_ctrList.GetSafeHwnd(),GWL_STYLE,dwStyle);

m_ctrList.InsertColumn(0,"数据",LVCFMT_LEFT,525);

m_ctrList.InsertColumn(0,"大小",LVCFMT_LEFT,80);

m_ctrList.InsertColumn(0,"端口",LVCFMT_LEFT,40);

m_ctrList.InsertColumn(0,"目的地址",LVCFMT_LEFT,100);

m_ctrList.InsertColumn(0,"端口",LVCFMT_LEFT,40);

m_ctrList.InsertColumn(0,"源地址",LVCFMT_LEFT,100);

m_ctrList.InsertColumn(0,"协议",LVCFMT_LEFT,50);

::SendMessage(m_ctrList.m_hWnd, LVM_SETEXTENDEDLISTVIEWSTYLE, LVS_EX_FULLROWSELECT, LVS_EX_FULLROWSELECT);

// 获得主机所有的IP

DWORD dwSize = 0 ;

// 得到IP地址列表

GetIpAddrTable( NULL , &dwSize, FALSE ) ;

PMIB_IPADDRTABLE pIpAddrTable = (PMIB_IPADDRTABLE )new BYTE [ dwSize ] ;

if( pIpAddrTable )

{

if( GetIpAddrTable( (PMIB_IPADDRTABLE)pIpAddrTable, // // buffer for IP table

&dwSize, // size of buffer

FALSE // sort by IP address

) == NO_ERROR )

{

if( pIpAddrTable->dwNumEntries > 2 ) // Second is MS TCP loopback IP ( 127.0.0.1 )

{

m_Multihomed = TRUE ;

char szIP[16];

for( int i = 0 ; i < (int)pIpAddrTable->dwNumEntries ; i++ )

{

in_addr ina ;

ina.S_un.S_addr = pIpAddrTable->table[i].dwAddr ;

char *pIP = inet_ntoa( ina ) ;

strcpy( szIP , pIP ) ;

if( stricmp( szIP , "127.0.0.1" ) )

m_IPArr.Add(pIpAddrTable->table[i].dwAddr) ;

}

}

}

delete [] pIpAddrTable ;

}

return TRUE; // return TRUE unless you set the focus to a control

}

4.3.4消息处理函数

其中OnLookUp是“查看”按钮的消息响应函数,OnOK是“确定”按钮的消息响应函数。代码如下:

void CIpmonDlg::OnLookUp()

{

// TODO: Add your control notification handler code here

char szErr [ 50 ] , szHostName[MAX_PATH];

DWORD dwErr ;

SOCKADDR_IN sa;

// 判断是否有监听线程在执行

if( 0 == m_threadID )

{

SetDlgItemText(IDC_LOOKUP,"停止查看!" );

}

else

{

if( m_threadID )

{

PostThreadMessage(m_threadID,WM_CLOSE,0,0) ;

SetDlgItemText(IDC_LOOKUP,"开始查看!");

m_start.EnableWindow(FALSE) ;

}

return ;

}

DWORD dwBufferLen[10] ;

DWORD dwBufferInLen= 1 ;

DWORD dwBytesReturned = 0 ;

// 创建原始套接字

m_s = socket( AF_INET , SOCK_RAW , IPPROTO_IP ) ;

if( INV ALID_SOCKET == m_s )

{

dwErr = WSAGetLastError() ;

sprintf( szErr , "Error socket() = %ld " , dwErr ) ;

AfxMessageBox( szErr ) ;

closesocket( m_s ) ;

return ;

}

//设置套接字接收超时选项

int rcvtimeo = 5000 ;

if( setsockopt( m_s , SOL_SOCKET , SO_RCVTIMEO , (const char *)&rcvtimeo , sizeof(rcvtimeo) ) == SOCKET_ERROR)

{

dwErr = WSAGetLastError() ;

sprintf( szErr , "Error WSAIoctl = %ld " , dwErr ) ;

AfxMessageBox( szErr ) ;

closesocket( m_s ) ;

return ;

}

sa.sin_family = AF_INET;

sa.sin_port = htons(7000);

sa.sin_addr.s_addr= m_iphostsource;

//绑定

if (bind(m_s,(PSOCKADDR)&sa, sizeof(sa)) == SOCKET_ERROR) {

dwErr = WSAGetLastError() ;

sprintf( szErr , "Error bind() = %ld " , dwErr ) ;

AfxMessageBox( szErr ) ;

closesocket( m_s ) ;

return ;

}

//设置SOCKET模式

if( SOCKET_ERROR != WSAIoctl( m_s, SIO_RCV ALL , &dwBufferInLen, sizeof(dwBufferInLen),

&dwBufferLen, sizeof(dwBufferLen), &dwBytesReturned , NULL , NULL ) )

//开启一个监听线程

AfxBeginThread( threadFunc , (LPVOID)this );

else

{

dwErr = WSAGetLastError() ;

sprintf( szErr , "Error WSAIoctl = %ld " , dwErr ) ;

AfxMessageBox( szErr ) ;

closesocket( m_s ) ;

return ;

}

}

//“确定”按钮的消息响应函数

void CIpmonDlg::OnOK()

{

// TODO: Add extra validation here

if( NULL != m_threadID )

PostThreadMessage(m_threadID,WM_CLOSE,0,0) ;

if( m_IPArr.GetSize() )

m_IPArr.RemoveAll() ;

CDialog::OnOK();

}

4.3.5监听线程函数threadFunc()

UINT threadFunc ( LPVOID p )

{

// 函数参数是对话框的指针

CIpmonDlg *pDlg = static_cast(p) ;

char buf [1000] , *bufwork ;

MSG msg ;

int iRet ;

DWORD dwErr ;

char *pSource , *pDest ;

IPHEADER *pIpHeader ;

in_addr ina ;

char szSource [16] , szDest[16] , szErr [ 50 ];

char *pLastBuf = NULL ;

int HdrLen, totallen;

WORD sourport, destport;

// 定义头结构变量

struct TCPPacketHead *pTCPHead;

struct ICMPPacketHead *pICMPHead;

struct UDPPacketHead *pUDPHead;

BYTE *pdata = NULL;

/*---------------------------------------------------------------------*/

PeekMessage(&msg, NULL, WM_USER, WM_USER, PM_NOREMOVE) ;

// 获取该线程的ID号

pDlg->m_threadID = GetCurrentThreadId() ;

while( TRUE )

{

// 检测消息队列中的WM_CLOSE消息

if( PeekMessage( &msg , 0 , WM_CLOSE,WM_CLOSE,PM_NOREMOVE ) )

{

closesocket( pDlg->m_s ) ;

pDlg->m_threadID = 0 ;

pDlg->m_start.EnableWindow(TRUE) ;

break ;

}

memset( buf , 0 , sizeof(buf) ) ;

// 接收数据

iRet = recv( pDlg->m_s , buf , sizeof( buf ) , 0 ) ;

if( iRet == SOCKET_ERROR )

{

dwErr = WSAGetLastError() ;

sprintf( szErr , "Error recv() = %ld " , dwErr ) ;

continue ;

}

else

if( *buf )

{

bufwork = buf ;

// 获取IP包的头

pIpHeader = (IPHEADER *)bufwork ;

WORD iLen = ntohs(pIpHeader->total_len) ;

while( TRUE )

{

if( iLen <= iRet )

{

ina.S_un.S_addr = pIpHeader->sourceIP ;

// 获取源地址

pSource = inet_ntoa( ina ) ;

strcpy( szSource , pSource ) ;

ina.S_un.S_addr = pIpHeader->destIP ;

// 获取目标地址

pDest = inet_ntoa( ina ) ;

strcpy( szDest , pDest ) ;

CString str, strProto, strSourPort, strDestPort, strData, strSize;

// 获取数据报的协议名称

strProto = get_proto_name( pIpHeader->proto );

HdrLen = pIpHeader->header_len&0xf;

HdrLen *= 4;

totallen = ntohs(pIpHeader->total_len);

totallen-=HdrLen;

// 对不同协议的头部数据进行分析

switch(pIpHeader->proto)

{

// ICMP数据报头分析

case IPPROTO_ICMP:

{

pICMPHead=(struct ICMPPacketHead *)(buf+HdrLen);

strSourPort = "-";

strDestPort = "-";

pdata=((BYTE

*)pICMPHead)+ICMP_HEAD_LEN;

totallen -= ICMP_HEAD_LEN;

break;

}、

// TCP数据报头分析

case IPPROTO_TCP:

{

pTCPHead=(struct TCPPacketHead *)(buf+HdrLen);

// 得到源端口和目的端口

sourport = ntohs(pTCPHead->SourPort);

destport = ntohs(pTCPHead->DestPort);

strSourPort.Format("%d",sourport);

strDestPort.Format("%d",destport);

HdrLen = (pTCPHead->HLen)>>4; //in fact only 4 bits

HdrLen *= 4;

pdata=((BYTE *)pTCPHead)+HdrLen;

totallen -= HdrLen;

break;

}

// UDP数据报头分析

case IPPROTO_UDP:

{

pUDPHead=(struct UDPPacketHead *)(buf+HdrLen);

// 得到源端口和目的端口

sourport = ntohs(pUDPHead->SourPort);

destport = ntohs(pUDPHead->DestPort);

//strL4.Format(" sour port:%d,dest port:%d",sourport,destport);

strSourPort.Format("%d",sourport);

strDestPort.Format("%d",destport);

pdata=((BYTE

*)pUDPHead)+UDP_HEAD_LEN;

totallen -= UDP_HEAD_LEN;

break;

}

}

// ICMP协议数据分析

if(pIpHeader->proto == IPPROTO_ICMP)

strData.Format("type:%d code:%d data:%s",pICMPHead->Type,pICMPHead->Code,pdata);

else strData.Format(" %s",pdata);

基于winpcap的嗅探器设计与实现

基于winpcap的嗅探器设计与实现

计算机与信息学院 《计算机网络系统实践》报告 设计题目:嗅探器的设计与实现 学生姓名:*** 学号:2010**** 专业班级:信息安全****

2013 年9 月25 一、设计要求 1.不限平台,可以使用Libpcap、WinPcap 或 Linux的原始套接字; 2.实现一个功能比较简单的、具有图形界面的Sniffer,主线程响应用户界 面操作,工作线程完成抓包等工作; 3.能够解析出IP层和传输层的协议头,能够过滤TCP、UDP等数据包; 4.能够输出文本方式传送的数据包的内容; 5.能够进行简单的流量统计。 二、开发环境与工具

操作系统:windows7 开发工具:visual studio 开发语言:C++ 附加库:Winpcap 三、设计原理 网络嗅探器是一种常用的监听网络的工具。所谓嗅探器( Sniffer) ,是一种利用计算机网络接口截获网络数据的软件或硬件,可用于网络管理、网络协议分析以及网络安全等众多方面。嗅探器不同于一般的键捕获工具,后者只能捕获当地终端控制台上的按键内容,而嗅探器所“嗅”到的是动态的以信息包形式( 如IP 数据包或者以太网包) 封装的信息流。其中可能携带了重要数据或敏感信息。可以将这些捕获到的信息包存档,以利用相应工具可以作进一步分析。 计算机网络的设计为嗅探器的使用创造了最基本的条件。在目前的网络环境中,所有计算机节点都是共享传输介质,任意节点发出或发往任意节点的数据帧必将经过网内每一个节点的网络接口,此时只需对嗅探节点的网络接口( 网卡) 进行适当的设置便可为实现嗅探的做好准备工作。在计算机网络系统中,网卡是用来接收网络上其他节点发来的数据帧,其内嵌的单片处理程序会检测数据帧来源的MAC 地址,并根据网卡所设置的接收方式来是否接收处理数据,如果认为应该处理,则网卡就会产生中断信号通知中央处理器,接收该数据帧并传输给操作系统处理。否则就简单丢弃,所对应节点的网卡就截断,计算机的中央处理器并不参与。 网卡是网络中节点主机的关键硬件设备。对数据的接收一般有四种设置模式: 广播模式: 接收在网络中进行广播数据信息。组播模式: 接收组播数据信息。单播模式: 只有匹配的目的网卡才能接收数据信息。混杂模式: 网卡能够可以接收一切通过它的数据信息。 四、系统功能描述及软件模块划分 系统功能设计 本系统的基本功能为实现网络数据包的捕获, 并将其数据内容解析显示。网络数据包捕获功能主要负责从网络中捕获和过滤数据,这可以通过调

网络嗅探器的设计与实现

计算机网络课程设计 题目网络嗅探器的设计与实现 系 (部) 姓名 学号 指导教师 2015年7月18日

计算机网络课程设计任务书

网络嗅探器的设计与实现 摘要:网络嗅探器是对网络中的数据帧进行捕获的一种被动监听手段,是一种常用的收集有用数据的方法。本设计是关于网络嗅探器的设计与实现,其功能包括实现网络层抓包,对获得包的源和目的地址、端口、协议等进行分析和实现简单的包嗅探器功能。 关键字:网络嗅探器;数据包捕获; 套接字 引言 由于网络技术的发展,计算机网络的应用越来越广泛,其作用也越来越重要。计算机网络安全问题更加严重,网络破坏所造成的损失越来越大。但是由于计算机系统中软硬件的脆弱性和计算机网络的脆弱性以及地理分布的位置、自然环境、自然破坏以及人为因素的影响,不仅增加了信息存储、处理的风险,也给信息传送带来了新的问题。 嗅探器是一种常用的收集有用数据的方法,可以作为网络数据包的设备。嗅探器是通过对网卡的编程来实现网络通讯的,对网卡的编程是使用通常的套接字(socket)方式来进行。通常的套接字程序只能响应与自己硬件地址相匹配的或是以广播形式发出的数据帧,对于其他形式的数据帧比如已到达网络接口但却不是发给此地址的数据帧,网络接口在验证投递地址并非自身地址之后将不引起响应,也就是说应用程序无法收取到达的数据包。而网络嗅探器的目的恰恰在于从网卡接收所有经过它的数据包,这些数据包即可以是发给它的也可以是发往别处的。 1 基本概念 1.1 嗅探器 每一个在局域网(LAN)上的工作站都有其硬件地址,这些地址唯一地表示了网络上的机器。当用户发送一个数据包时,这些数据包就会发送到LAN上所有可用的机器。在一般情况下,网络上所有的机器都可以“听”到通过的流量,但对不属于自己的数据包则不予响应。嗅探器工作在网络的底层,在网络上监听数据包来获取敏感信息。从原理上来说,在一个实际的系统中,数据的收发是由网卡来完成的,网卡接收到传输来的数据,其内的单片程序接收数据帧的目的MAC地址,根据计算机上的网卡驱动程序设置的接收模式判断该不该接收,认为该接收就接收后产生中断信号通知CPU,认为不该接收就丢掉不管,所以不该接收的数据网卡就截断了,计算机根本就不知道。对于网卡来说一般有四种接收模式: a)广播方式:该模式下的网卡能够接收网络中的广播信息。 b)组播方式:设置在该模式下的网卡能够接收组播数据。 c)直接方式:在这种模式下,只有目的网卡才能接收该数据。

试谈简单的网络嗅探器

成都信息工程学院课程设计报告 简单的网络嗅探器 姓名:纪红专业:信息安全班级:信安084班

提交日期:2011-12-13

简单的网络嗅探器 摘要 计算机网络嗅探器是能够窃听计算机程序在网络上发送和接收到的数据,程序实现了对抓取到的本机在网络中的通信数据的协议类型、源地址、目的地址、端口和数据包的大小加以简单的分析,改程序应用C#语言编写,实现了一个简单的网络嗅探功能。其中一个窗体显示主页面,另一个窗体显示详细信息 关键词:网络嗅探器;发送和同意到的数据;协议类型;源地址;目地地址;端口和数据包;分析;C#言语

目录 论文总页数:9页

1 引言 1.1 课题背景 随着社会信息化的不断深入,计算机啊网络差不多渗入到社会的每一个角落,人们已无时无刻离不开网络。专门多人经常上网购物,学习,玩游戏,然而网络上的一些不良信息专门可能阻碍到互联网用户尤其是青青年的身心健康。基于以上的现实问题,我开发了这款网络嗅探器。能够用来实现对计算机程序在网络上发送和接收到的数据的分析。 1.2 研究现状 网络嗅探器不管是在网络安全依旧在黑客攻击方面扮演了专门重要的角色。通过使用网络嗅探器能够把网卡设置于混杂模式,并能够对网络上传输的数据包的捕获和分析。此分析结果可供网络安全分析之用,但如为黑客所利用也能够为其发动进一步的攻击提供有价值的信息。可见,嗅探器实际上是一把双刃剑。尽管网络嗅探器技术被黑客所利用后会对网络构成一定的威胁,但嗅探器本身的危害并不是专门大,要紧是用来为其他黑客软件提供网络情报,真正的攻击要紧是由其它黑客软件来完成的。而在网络安全方面,网络嗅探手段能够有效地探测在网络上传输的数据包信息,通过对这些信息的分析利用有助于网络安全的维护。 1.3 本课题研究的意义 当我们处理自身网络问题的时候,一个信息包嗅探器向我们展示出正在网络上进行的一切活动。因此,借助一定的知识,

网络嗅探实验报告

HUNAN UNIVERSITY 信息安全实验报告 题目:网络嗅探实验 指导老师: 学生姓名: 学生学号: 院系名称:信息科学与工程学院 专业班级: 2015年5月15日星期五

一、实验目的 掌握Sniffer(嗅探器)工具的使用方法,实现FTP、HTTP数据包的捕捉。 掌握对捕获数据包的分析方法,了解FTP、HTTP数据包的数据结构和连接过程,了解FTP、HTTP协议明文传输的特性,以建立安全意识。 二、实验环境 ①Windows 7 ②Wireshark(网络封包分析软件) ③FLASHFXP(FTP下载软件) ④Serv_U(FTP服务器端) ⑤搜狗浏览器。 三、实验要求 每两个学生为一组:其中学生A进行Http或者Ftp连接,学生B运行Wireshark软件监听学生A主机产生的网络数据包。完成实验后,互换角色重做一遍。 四、实验内容 任务一:熟悉Wireshark工具的使用 任务二:捕获FTP数据包并进行分析 任务三:捕获HTTP数据包并分析 五、实验原理 网卡有几种接收数据帧的状态:unicast(接收目的地址是本级硬件地址的数据帧),Broadcast(接收所有类型为广播报文的数据帧),multicast(接收特定的组播报文),promiscuous(目的硬件地址不检查,全部接收)。 以太网逻辑上是采用总线拓扑结构,采用广播通信方式,数据传输是依靠帧中的MAC 地址来寻找目的主机。 每个网络接口都有一个互不相同的硬件地址(MAC地址),同时,每个网段有一个在此网段中广播数据包的广播地址。 一个网络接口只响应目的地址是自己硬件地址或者自己所处网段的广播地址的数据帧,丢弃不是发给自己的数据帧。但网卡工作在混杂模式下,则无论帧中的目标物理地址是什么,主机都将接收。 1.HTTP 协议简介 HTTP 是超文本传输协议(Hyper Text Transfer Protocol)的缩写,用于WWW 服务。 (1)HTTP 的工作原理 HTTP 是一个面向事务的客户服务器协议。尽管HTTP 使用TCP 作为底层传输协议,但HTTP 协议是无状态的。也就是说,每个事务都是独立地进行处理。当一个事务开始时,就在web客户和服务器之间建立一个TCP 连接,而当事务结束时就释放这个连接。此外,客户可以使用多个端口和和服务器(80 端口)之间建立多个连接。其工作过程包括以下几个阶段。 ①服务器监听TCP 端口 80,以便发现是否有浏览器(客户进程)向它发出连接请求; ②一旦监听到连接请求,立即建立连接。 ③浏览器向服务器发出浏览某个页面的请求,服务器接着返回所请求的页面作为响应。 ④释放TCP 连接。

(2020年编辑)网络嗅探器的设计与实现

《网络与信息安全》课程设计报告 班级学号:姓名: 题目: 评阅: 成绩: 2011年1月

目录 一、开发背景 1、网络安全现状。 2、开发意义。 二、设计分析 1、实现目标。 2、开发技术简介。 三、详细设计 1、嗅探原理。 2、代码设计。 四、测试运行 五、总结 六、参考文献

摘要 网络嗅探器是作用在网络上的一种监听程序,它是系统管理员的一个得力助手,管理员可以用它来分析网络。例如当网络繁忙时可利用它来查找是哪一段网络繁忙,数据报文是属于哪一种协议,这样可以计算出哪种业务受欢迎。但是当有黑客使用它时,它又变得很可怕。它可以非法获取一些保密性信息,如帐号、密码等,它带来的负面破坏是非常大的。作为从事网络安全技术方面的人员来说,要想有效地利用它、防范它就得深入地学习、分析网络嗅探技术。 1、本设计的基本任务是设计一个嗅探软件,实现对常用网络数据包抓取、分析。 2、软件所要完成对本机在网络中的通信数据,比如协议类型,源、目的地址和端口、数据包 的大小等加以分析的功能。 3、本设计用到的开发工具为Microsoft Visual Studio 2010 开发环境为Windows 7。 4、程序由韩瑞彬同学和我共同完成,本人主要负责主界面的设计和网络数据包的抓取,韩 瑞彬同学负责对数据包的解析设计。 关键字:嗅探器,安全,黑客,数据报文 一、开发背景

1、网络安全现状 随着各种新的网络技术的不断出现、应用和发展,计算机网络的应用越来越广泛,其作用也越来越重要。但是由于计算机系统中软硬件的脆弱性和计算机网络的脆弱性以及地理分布的位置、自然环境、自然破坏以及人为因素的影响,不仅增加了信息存储、处理的风险,也给信息传送带来了新的问题。计算机网络安全问题越来越严重,网络破坏所造成的损失越来越大。Internet 的安全已经成为亟待解决的问题。多数黑客入侵成功并植入后门后的第一件事就是选择一个合适当前网络的嗅探器,以获得更多的受侵者的信息。嗅探器是一种常用的收集有用数据的方法,可以作为分析网络数据包的设备。网络嗅探器就是利用计算机的网络接口截获其他计算机的数据报文的一种工具,而且它与一般的键盘捕获程序不同。键盘捕获程序捕获在终端上输入的键值,而嗅探器捕获的则是真实的网络报文.如果把网络嗅探器放置于网络节点处,对网络中的数据帧进行捕获的一种被动监听手段,是一种常用的收集有用数据的方法,可以分析各种信息包并描述出网络的结构和使用的机器,由于它接收任何一个在同一网段上传输的数据包,所以也就存在着捕获密码、各种信息、秘密文档等一些没有加密的信息的可能性。这成为黑客们常用的扩大战果的方法,用来夺取其他主机的控制权。当然嗅探器的正当用处主要是网络管理人员分析网络的流量,以便找出所关心的网络中潜在的问题。例如,假设网络的某一段运行得不是很好,报文的发送比较慢,而我们又不知道问题出在什么地方,此时就可以用嗅探器截获网络中的数据包,分析问题的所在。 2、开发意义 本次设计只是对抓取到的本机在网络中的通信数据,比如说协议类型,源、目的地址和端口、数据包的大小等加以分析,而无法做到像Sniffer 或者影音神探那种成熟的嗅探器所拥有的强大功能。作为从事网络技术方面的人员来说,要想有效地利用它、防范它,就得深入地学习、分析网络嗅探技术。最为重要的是,对于网络嗅探器的设计与实现,使我对网络通信,数据传输和网络信息安全等有了切身的体会与融入,同时也是对网络安全技术这门课的学以致用,不断提高自我的一种有效途径。 二、设计分析 1、实现目标 (1)实现网络嗅探器的界面。 (2)实现抓取数据包的功能。

网络嗅探器设计

目 录 一、什么是嗅探器 二、嗅探器的作用 三、网络嗅探器原理 四、反嗅探技术 五、网络嗅探器的设计 六、总结: 一、什么是嗅探器 嗅探器,可以理解为一个安装在计算机上的窃听设备它可以用来窃听计算机在网络上所产生的众多的信息。简单一点解释:一部电话的窃

听装置, 可以用来窃听双方通话的内容,而计算机网络嗅探器则可以窃听计算机程序在网络上发送和接收到的数据。 可是,计算机直接所传送的数据,事实上是大量的二进制数据。因此, 一个网络窃听程序必须也使用特定的网络协议来分解嗅探到的数据, 嗅探器也就必须能够识别出那个协议对应于这个数据片断,只有这样才能够进行正确的解码。 计算机的嗅探器比起电话窃听器,有他独特的优势: 很多的计算机网络采用的是“共享媒体"。也就是说,你不必中断他的通讯,并且配置特别的线路,再安装嗅探器,你几乎可以在任何连接着的网络上直接窃听到你同一掩码范围内的计算机网络数据。我们称这种窃听方式为“基于混杂模式的嗅探”(promiscuous mode) 。 尽管如此,这种“共享” 的技术发展的很快,慢慢转向“交换” 技术,这种技术会长期内会继续使用下去, 它可以实现有目的选择的收发数据。 二、嗅探器的作用 嗅探器是网络的抓包工具,可以对网络中大量数据抓取,从而方便使用者对网络中用户的一些信息进行分析,所以,通常被黑客运用于网络攻击。我们如果也能掌握网络嗅探器的原理和设计,可以将它运用与网络故障检测、网络状况的监视,还可以加强企业信息安全防护。三、网络嗅探器原理 嗅探器是如何工作的?如何窃听网络上的信息? 网络的一个特点就是数据总是在流动中,从一处到另外一处,而互联网是由错综复杂的各种网络交汇而成的,也就是说:当你的数据从网络的一台电脑到另一台电脑的时候,通常会经过大量不同的网络设备,(我们用tracert命令就可以看到这种路径是如何进行的)。如果传输过程中,有人看到了传输中的数据,那么问题就出现了——这就好比给人发了一封邮件,在半路上被人拆开偷看一样,这样说或许还不是很可怕,那要是传送的数据是企业的机密文件那,或是用户的信用卡帐号和密码呢……? 嗅探侦听主要有两种途径,一种是将侦听工具软件放到网络连接的

嗅探器实验报告

基于JPCAP的网络嗅探器 实验报告 学号:1106840229 姓名:陆凯

一、平台和情况简述 本实验是用java实现的网络抓包程序。 操作系统环境为windows 7和8 64位。 必要软件为winpcap4.0,jpcapx64,eclipse 二、JPCAP简介 (以下来自百度百科)众所周知,JAVA语言虽然在TCP/UDP传输方面给予了良好的定义,但对于网络层以下的控制,却是无能为力的。JPCAP扩展包弥补了这一点。JPCAP实际上并非一个真正去实现对数据链路层的控制,而是一个中间件,JPCAP调用WINPCAP给JAVA语言提供一个公共的接口,从而实现了平台无关性。 三、程序整体设计 从实际操作使用的角度上来讲,整个程序由三个.JAVA文件组成,其中两个文件都可以生成Jframe框架。也就是说程序只有两个界面,一个主界面和一个选择网卡的Dialog界面。摘取三个文件中的类和方法: 1.MainProgram.java: public class MainProgram extends JFrame implements ActionListener:(1)public static void main(String[] args) 主函数 (2)public MainProgram() (3)private void initGUI() 界面设计

(4)public void actionPerformed(ActionEvent event) 菜单事件响应 (5)public void dealPacket(Packet packet) 包处理 (6)public String output(Packet p) 十六进制显示 2.Jcapturedialog.java Public class Jcapturedialog extends JDialog implements ActionListener: (1)public Jcapturedialog(JFrame frame) 构造 (2)public void actionPerformed(ActionEvent evt) 按键响应 (3)public static JpcapCaptor getJpcap(JFrame parent) 3.Jcaptor.java public class Jcaptor: (1)public void setJFrame(MainProgram frame) (2)public void capturePacketsFromDevice() 抓包 (3)private void startCaptureThread() 开线程 (4)public void stopCapture() 关闭线程 从整个的抓包流程来讲,用JPCAP类中的函数(形参已省略)来表达,可以表达为: 1.通过JpcapCaptor.getDeviceList()获取网卡列表 2.通过jpcap.setFilter()设置过滤器 3.通过JpcapCaptor.openDevice()打开相应的网卡 4.在线程中采用jpcap.processPacket()来抓包 5.通过自己编写的dealPacket()针对抓得的包按照不同的协议来分析并产生表格中的数据

网络嗅探器的设计实现

- - -. 《网络与信息安全》课程设计报告

2011年1月 目录 一、开发背景 1、网络安全现状。 2、开发意义。 二、设计分析 1、实现目标。 2、开发技术简介。 三、详细设计 1、嗅探原理。 2、代码设计。 四、测试运行 五、总结

六、参考文献 摘要 网络嗅探器是作用在网络上的一种监听程序,它是系统管理员的一个得力助手,管理员可以用它来分析网络。例如当网络繁忙时可利用它来查找是哪一段网络繁忙,数据报文是属于哪一种协议,这样可以计算出哪种业务受欢迎。但是当有黑客使用它时,它又变得很可怕。它可以非法获取一些XX性信息,如XX、密码等,它带来的负面破坏是非常大的。作为从事网络安全技术方面的人员来说,要想有效地利用它、防X它就得深入地学习、分析网络嗅探技术。 1、本设计的基本任务是设计一个嗅探软件,实现对常用网络数据包抓取、分析。 2、软件所要完成对本机在网络中的通信数据,比如协议类型,源、目的地址和端口、数据包 的大小等加以分析的功能。 3、本设计用到的开发工具为Microsoft Visual Studio 2010 开发环境为Windows 7。 4、程序由韩瑞彬同学和我共同完成,本人主要负责主界面的设计和网络数据包的抓取,韩 瑞彬同学负责对数据包的解析设计。 关键字:嗅探器,安全,黑客,数据报文

一、开发背景 1、网络安全现状 随着各种新的网络技术的不断出现、应用和发展,计算机网络的应用越来越广泛,其作用也越来越重要。但是由于计算机系统中软硬件的脆弱性和计算机网络的脆弱性以及地理分布的位置、自然环境、自然破坏以及人为因素的影响,不仅增加了信息存储、处理的风险,也给信息传送带来了新的问题。计算机网络安全问题越来越严重,网络破坏所造成的损失越来越大。Internet 的安全已经成为亟待解决的问题。多数黑客入侵成功并植入后门后的第一件事就是选择一个合适当前网络的嗅探器,以获得更多的受侵者的信息。嗅探器是一种常用的收集有用数据的方法,可以作为分析网络数据包的设备。网络嗅探器就是利用计算机的网络接口截获其他计算机的数据报文的一种工具,而且它与一般的键盘捕获程序不同。键盘捕获程序捕获在终端上输入的键值,而嗅探器捕获的则是真实的网络报文.如果把网络嗅探器放置于网络节点处,对网络中的数据帧进行捕获的一种被动监听手段,是一种常用的收集有用数据的方法,可以分析各种信息包并描述出网络的结构和使用的机器,由于它接收任何一个在同一网段上传输的数据包,所以也就存在着捕获密码、各种信息、秘密文档等一些没有加密的信息的可能性。这成为黑客们常用的扩大战果的方法,用来夺取其他主机的控制权。当然嗅探器的正当用处主要是网络管理人员分析网络的流量,以便找出所关心的网络中潜在的问题。例如,假设网络的某一段运行得不是很好,报文的发送比较慢,而我们又不知道问题出在什么地方,此时就可以用嗅探器截获网络中的数据包,分析问题

《网络嗅探器》课程设计报告

《网络与信息安全技术》课程报告 课题名称:网络嗅探器提交报告时间:2010年12月17 日 网络嗅探器 专业 组号指导老师 [摘要]随着网络技术的飞速发展,网络安全问题越来越被人重视。嗅探技术作为网络安全攻防中最基础的技术,既可以用于获取网络中传输的大量敏感信息,也可以用于网络管理。通过获取网络数据包的流向和内容等信息,可以进行网络安全分析和网络威胁应对。因此对网络嗅探器的研究具有重要意义。 本课程设计通过分析网络上常用的嗅探器软件,在了解其功能和原理的基础上,以VC为开发平台,使用Windows环境下的网络数据包捕获开发库WinPcap,按照软件工程的思想进行设计并实现了一个网络嗅探工具。该嗅探工具的总体架构划分为5部分,分别是最底层的数据缓存和数据访问,中间层的数据捕获,协议过滤,协议分析和最顶层的图形画用户界面。 本嗅探器工具完成了数据包捕获及分析,协议过滤的主要功能,实现了对网络协议,源IP 地址,目标IP地址及端口号等信息的显示,使得程序能够比较全面地分析出相关信息以供用户参考决策。 关键词:网络嗅探;WinPcap编程接口;数据包;网络协议;多线程 (中文摘要在150字左右。摘要正文尽量用纯文字叙述。用五号宋体字。姓名与摘要正文之间空二行。关键词与摘要之间不空行。“摘要”这两个字加粗) 关键词:入侵检测系统;感应器;分析器;分布式入侵检测系统模型 Network sniffer Major: software engineering Group Number: 29 [Abstract] With the rapid development of network technology, network security is increasingly being attention. Sniffing network security technology as the most basic offensive and defensive

信安实验报告1网络嗅探实验

实验一网络嗅探实验 一、简单阐述实验原理 网络嗅探器Sniffer的原理 网卡有几种接收数据帧的状态:unicast(接收目的地址是本级硬件地址的数据帧),Broadcast (接收所有类型为广播报文的数据帧),multicast(接收特定的组播报文),promiscuous (目的硬件地址不检查,全部接收) 以太网逻辑上是采用总线拓扑结构,采用广播通信方式,数据传输是依靠帧中的MAC地址来寻找目的主机。 每个网络接口都有一个互不相同的硬件地址(MAC地址),同时,每个网段有一个在此网段中广播数据包的广播地址 一个网络接口只响应目的地址是自己硬件地址或者自己所处网段的广播地址的数据帧,丢弃不是发给自己的数据帧。但网卡工作在混杂模式下,则无论帧中的目标物理地址是什么,主机都将接收 通过Sniffer工具,将网络接口设置为“混杂”模式。可以监听此网络中传输的所有数据帧。从而可以截获数据帧,进而实现实时分析数据帧的内容。 数据传输有两种方式:主动和被动模式。 关于被动模式与主动模式书上这么解释来着。 客户端与服务器建立控制连接后,要告诉服务器采用哪种文件传输模式。FTP提供了两种传输模式,一种是Port(主动模式),一种是Passive被动模式。这个主被动指的是服务器端。 主动,是指服务器端主动向客户端发起数据连接请求,那么此时服务器端要用自己的一个固有端口一般是20去监听客户端。整个过程是这样的,客户端在最初会用一个端口3716向服务器端的21发起控制连接请求(应该是在握手后中确定的吧),连接成功后,在发送port 3716+1,告诉服务服务器端坚定3717,那么服务器端就会用数据端口,一般是20与3717建立连接(这就是主动进行数据连接)。服务器端利用自己的20与客户端 3717来文件的数据传送通信,利用21和客户端最初的端口3616进行用户验证和管理。 而被动模式,是服务器端被动的接受客户端的数据连接请求,这个端口号是由客户端告知服务器端的,在本地随机生成(1025-65535)。 二、分别写出任务二、任务三中要求找出的有用信息,写出对应捕获的报文窗口中的summary(概要)代码,并推断出监测主机的系列行为。

sniffer嗅探器基本知识

嗅探器 嗅探器保护网络 嗅探器是一种监视网络数据运行的软件设备,协议分析器既能用于合法网络管理也能用于窃取网络信息。网络运作和维护都可以采用协议分析器:如监视网络流量、分析数据包、监视网络资源利用、执行网络安全操作规则、鉴定分析网络数据以及诊断并修复网络问题等等。非法嗅探器严重威胁网络安全性,这是因为它实质上不能进行探测行为且容易随处插入,所以网络黑客常将它作为攻击武器。 目录 编辑本段简介 嗅探器最初由 Network General 推出,由 Network Associates 所有。最近,Network Associates 决定另开辟一个嗅探器产品单元,该单元组成一家私有企业并重新命名为 Network General,如今嗅探器已成为 Network General 公司的一种特征产品商标,由于专业人士的普遍使用,嗅探器广泛应用于所有能够捕获和分析网络流量的产品。 编辑本段网络技术与设备简介 在讲述Sniffer的概念之前,首先需要讲述局域网设备的一些基本概念。 数据在网络上是以很小的称为帧(Frame)的单位传输的,帧由几部分组成,不同的部分执行不同的功能。帧通过特定的称为网络驱动程序的软件进行成型,然后通过网卡发送到网线上,通过网线到达它们的目的机器,在目的机器的一端执行相反的过程。接收端机器的以太网卡捕获到这些帧,并告诉操作系统帧已到达,然后对其进行存储。就是在这个传输和接收的过程中,存在安全方面的问题。 每一个在局域网(LAN)上的工作站都有其硬件地址,这些地址惟一地表示了网络上的机器(这一点与Internet地址系统比较相似)。当用户发送一个数据包时,这些数据包就会发送到LAN上所有可用的机器。 在一般情况下,网络上所有的机器都可以“听”到通过的流量,但对不属于自己的数据包则不予响应(换句话说,工作站A不会捕获属于工作站B 的数据,而是简单地忽略这些数据)。如果某个工作站的网络接口处于混杂

网络嗅探器实验报告

网络攻击与防御技术实验报告 实验目的: 本实验通过研究Winpcap中常用的库函数的使用方式来实现了一个小型的网络数据包抓包器,并通过对原始包文的分析来展示当前网络的运行状况。 实验内容: 1.实现对网络基本数据包的捕获 2.分析捕获到的数据包的详细信息 实验环境: 1.WpdPack_4_0_1支持库 2.VC++开发环境 3.Windows操作系统 实验设计: 系统在设计过程中按照MVC的设计模式,整体分为三层。第一层为Control层即控制层,这里为简化设计,将Control层分为两个部分,一部分为网络报文输入,另一部分为用户输入;第二层是Model层即模型层;第三层为View层即显示层。 系统的整体运行过程为:从Control层得到数据,交到Model层进行处理,将处理完的结果交View层进行显示。Control层主要用于网络数据包的捕获以及获得用户的输入;Model层主要用于分析数据包,处理用户的输入;View层主要用于对处理后的结果进行显示。 详细过程: 程序在执行过程中有两个核心的工作,一是调用Winpcap函数库实现下层抓包。二是对抓到的包文进行分析。下面分别列出两个核心过程的基本算法与相关的实现代码。 抓包算法: 第一:初始化Winpcap开发库 第二:获得当前的网卡列表,同时要求用户指定要操作的网卡 第三:获得当前的过滤规则,可为空 第四:调用库函数,pcap_loop(),同时并指定其回调函数,其中其回调函数为数据包分析过程。 对应的相应核心代码为: I f((pCap=pcap_open_live(getDevice()->name,65536,1,1000,strErrorBuf))==NULL) { return -1; } If(pcap_compile(pCap, &fcode, filter, 1, NetMask) < 0)

网络嗅探器的设计与实现论文总结

目录 1 引言 (1) 1.1 开发背景 (1) 1.2 开发意义 (1) 2 系统分析 (2) 2.1 设计概述 (2) 2.1.1 实现目标 (2) 2.1.2 开发环境 (2) 2.2 开发相关技术简介 (2) 2.2.1 C#语言简介 (2) 2.2.2 嗅探技术简介 (3) 2.2.3 TCP/IP协议 (4) 2.2.4 数据包简介 (6) 2.3 可行性分析 (8) 3 详细设计 (9) 3.1 设计原理 (9) 3.2 功能说明 (12) 3.3 系统实施 (12) 3.4 系统测试 (14) 4 论文总结 (19) 5 参考文献 (20) 6 致谢 (21)

1 引言 1.1 开发背景 随着各种新的网络技术的不断出现、应用和发展,计算机网络的应用越来越广泛,其作用也越来越重要。但是由于计算机系统中软硬件的脆弱性和计算机网络的脆弱性以及地理分布的位置、自然环境、自然破坏以及人为因素的影响,不仅增加了信息存储、处理的风险,也给信息传送带来了新的问题。计算机网络安全问题越来越严重,网络破坏所造成的损失越来越大。Internet的安全已经成为亟待解决的问题。多数黑客入侵成功并植入后门后的第一件事就是选择一个合适当前网络的嗅探器,以获得更多的受侵者的信息。嗅探器是一种常用的收集有用数据的方法,可以作为分析网络数据包的设备。网络嗅探器就是利用计算机的网络接口截获其他计算机的数据报文的一种工具,而且它与一般的键盘捕获程序不同。键盘捕获程序捕获在终端上输入的键值,而嗅探器捕获的则是真实的网络报文.如果把网络嗅探器放置于网络节点处,对网络中的数据帧进行捕获的一种被动监听手段,是一种常用的收集有用数据的方法,可以分析各种信息包并描述出网络的结构和使用的机器,由于它接收任何一个在同一网段上传输的数据包,所以也就存在着捕获密码、各种信息、秘密文档等一些没有加密的信息的可能性。这成为黑客们常用的扩大战果的方法,用来夺取其他主机的控制权。当然嗅探器的正当用处主要是网络管理人员分析网络的流量,以便找出所关心的网络中潜在的问题。例如,假设网络的某一段运行得不是很好,报文的发送比较慢,而我们又不知道问题出在什么地方,此时就可以用嗅探器截获网络中的数据包,分析问题的所在。[1] 1.2 开发意义 本次毕业设计是基于C#的网络嗅探器的设计与实现,由于本人能力上的限度,只是对抓取到的本机在网络中的通信数据,比如说协议类型,源、目的地址和端口、数据包的大小等加以分析,而无法做到像Sniffer或者影音神探那种成熟的嗅探器所拥有的强大功能。作为从事网络技术方面的人员来说,要想有效地利用它、防范它,就得深入地学习、分析网络嗅探技术。最为重要的是,对于网络嗅探器的设计与实现,使我对网络通信,数据传输和网络信息安全等有了切身的体会与融入,同时也是对大学四年的学以致用,不断提高自我的一种有效途径。

信息安全实验报告

信息安全实验报告

信息安全基础实验报告 姓名:田廷魁学号:201227920316 班级:网工1201班 ARP欺骗工具及原理分析(Sniffer网络嗅探器)一.实验目的和要求 实验目的: 1.熟悉ARP欺骗攻击有哪些方法。 2.了解ARP欺骗防范工具的使用。 3.掌握ARP欺骗攻击的实验原理。 实验要求: 下载相关工具和软件包(ARP攻击检测工具,局域网终结者,网络执法官,ARPsniffer嗅探工具)。 二.实验环境(实验所用的软硬件) ARP攻击检测工具 局域网终结者 网络执法官 ARPsniffer嗅探工具 三.实验原理 ARP(Address Resolution Protocol)即地址解析协议,是一种将IP地址转化成物理地址的协议。不管网络层使用什么协议,在网络链路上传送数据帧时,最终还是必须使用硬件地址的。而每台机器的MAC地址都是不一样的,具有全球唯一性,因此可以作为一台主机或网络设备的标识。目标主机的MAC地址就是通过ARP协议获得的。

ARP欺骗原理则是通过发送欺骗性的ARP数据包致使接收者收到数据包后更新其ARP缓存表,从而建立错误的IP与MAC对应关系,源主机发送数据时数据便不能被正确地址接收。 四.实验内容与步骤 1、利用ARPsniffer嗅探数据 实验须先安装winpcap.exe它是arpsniffer.exe运行的条件,接着在arpsniffer.exe同一文件夹下新建记事本,输入Start cmd.exe ,保存为cmd.bat。ARPsniffer有很多种欺骗方式,下面的例子是其中的一种。 安装截图:

步骤一:运行cmd.exe,依次输入以下命令: "arpsf.exe -sniffall -o f:\sniffer.txt -g 192.168.137.1 -t 192.168.137.5"(其中IP地址:192.168.137.1是局域网网关的地址,192.168.137.5是被欺骗主机的IP地址,试验获取的数据将会被输入到F盘的sniffer.txt文件中。)按回车键运行,出现如下图所示的选项,选1,接着选0,回车,程序便开始监听了。 运行截图: 步骤二:停止运行,打开F盘的sniffer.txt文件,在文件中查找,可以发现被欺骗主机的一些敏感信息,如下图:可以发现被欺骗主机注册某网站时的信息:username=wanglouanquan password=123456等。 捕获信息截图:

巧用嗅探器保障网络稳定运行(图

巧用嗅探器保障网络稳定运行(图) 安全中国 https://www.wendangku.net/doc/d711171853.html,更新时间:2009-04-22 01:15:35 责任编辑:ShellExp 对于网络、系统管理或安全技术人员来说,在对网络进行管理和维护的过程中,总会遇到这样或那样的问题。例如,网络传输性能为什么突然降低?为什么网页打不开,但QQ却能上线?为什么某些主机突然掉线?诸如此类的网络问题一个又一个地不断出现,都需要我们快速有效地去解决,以便能够尽量减少由于网络问题对企业正常业务造成的影响。因此,我们就需要一引起工具来帮助我们快速有效地找出造成上述这些问题的原因。 网络嗅探器就是这样的一种网络工具,通过对局域网所有的网络数据包,或者对进出某台工作站的数据包进行分析,就可以迅速地找到各种网络问题的原因所在,因而也就深受广大网络管理员和安全技术人员的喜爱。 可是,我们也应该知道交换机是通过MAC地址表来决定将数据包转发到哪个端口的。原则上来讲,简单通过物理方式将网络嗅探器接入到交换机端口,然后将嗅探器的网络接口卡设为混杂模式,依然只能捕捉到进出网络嗅探器本身的数据包。这也就是说,在交换机构建的网络环境中,网络嗅探器不使用特殊的方式是不能分析其它主机或整个局域网中的数据包的。但是,现在的企业都是通过交换机来构建局域网,那么,如果我们要想在这样的网络环境中使用网络嗅探器来解决网络问题,就必需考虑如何将网络嗅探器接入到目标位置,才能让网络嗅探器捕捉到网络中某台主机或整个网段的网络流量。 就目前来说,对于在交换机构建的网络环境中使用网络嗅探器,可以通过利用可网管交换机的端口汇聚功能、通过接入集成器或Cable TAP接线盒及选择具有特殊功能的网络嗅探软件这3种方法来进行。这3种可行的方式分别针对不同的交换机应用环境来使用的,本文下面就针对目前主流的几种交换机网络环境,来详细说明这3种接入方式的具体应用。 一、通过可网管交换机端口汇聚功能来达到目的

嗅探器实验报告

嗅探器实验报告 学院:通信工程 班级:011252 学号:01125118 姓名:寇天聪

嗅探器设计原理 嗅探器作为一种网络通讯程序,也是通过对网卡的编程来实现网络通讯的,对网卡的编程也是使用通常的套接字(socket)方式来进行。通常的套接字程序只能响应与自己硬件地址相匹配的或是以广播形式发出的数据帧,对于其他形式的数据帧比如已到达网络接口但却不是发给此地址的数据帧,网络接口在验证投递地址并非自身地址之后将不引起响应,也就是说应用程序无法收取到达的数据包。而网络嗅探器的目的恰恰在于从网卡接收所有经过它的数据包,这些数据包即可以是发给它的也可以是发往别处的。显然,要达到此目的就不能再让网卡按通常的正常模式工作,而必须将其设置为混杂模式。 网络嗅探器无论是在网络安全还是在黑客攻击方面均扮演了很重要的角色。通过使用网络嗅探器可以把网卡设置于混杂模式,并可实现对网络上传输的数据包的捕获与分析。此分析结果可供网络安全分析之用,但如为黑客所利用也可以为其发动进一步的攻击提供有价值的信息。可见,嗅探器实际是一把双刃剑。虽然网络嗅探器技术被黑客利用后会对网络安全构成一定的威胁,但嗅探器本身的危害并不是很大,主要是用来为其他黑客软件提供网络情报,真正的攻击主要是由其他黑软来完成的。而在网络安全方面,网络嗅探手段可以有效地探测在网络上传输的数据包信息,通过对这些信息的分析利用是有助于网络安全维护的。

本程序实现的基本功能:指定局域网内的任一ip地址,能分析包的类型,结构,流量的大小。 嗅探器工作原理 根据前面的设计思路,不难写出网络嗅探器的实现代码,下面就结合注释对程序的具体是实现进行讲解,同时为程序流程的清晰起见,去掉了错误检查等保护性代码。

网络嗅探器的设计与实现

{ 计算机网络课程设计 题目网络嗅探器的设计与实现] 系 (部) 姓名 学号 指导教师 # 2015年7月18日

计算机网络课程设计任务书

网络嗅探器的设计与实现 摘要:网络嗅探器是对网络中的数据帧进行捕获的一种被动监听手段,是一种常用的收集有用数据的方法。本设计是关于网络嗅探器的设计与实现,其功能包括实现网络层抓包,对获得包的源和目的地址、端口、协议等进行分析和实现简单的包嗅探器功能。 关键字:网络嗅探器;数据包捕获; 套接字 引言 由于网络技术的发展,计算机网络的应用越来越广泛,其作用也越来越重要。计算机网络安全问题更加严重,网络破坏所造成的损失越来越大。但是由于计算机系统中软硬件的脆弱性和计算机网络的脆弱性以及地理分布的位置、自然环境、自然破坏以及人为因素的影响,不仅增加了信息存储、处理的风险,也给信息传送带来了新的问题。 嗅探器是一种常用的收集有用数据的方法,可以作为网络数据包的设备。嗅探器是通过对网卡的编程来实现网络通讯的,对网卡的编程是使用通常的套接字(socket)方式来进行。通常的套接字程序只能响应与自己硬件地址相匹配的或是以广播形式发出的数据帧,对于其他形式的数据帧比如已到达网络接口但却不是发给此地址的数据帧,网络接口在验证投递地址并非自身地址之后将不引起响应,也就是说应用程序无法收取到达的数据包。而网络嗅探器的目的恰恰在于从网卡接收所有经过它的数据包,这些数据包即可以是发给它的也可以是发往别处的。 1基本概念 1.1嗅探器 每一个在局域网(LAN)上的工作站都有其硬件地址,这些地址唯一地表示了网络上的机器。当用户发送一个数据包时,这些数据包就会发送到LAN上所有可用的机器。在一般情况下,网络上所有的机器都可以“听”到通过的流量,但对不属于自己的数据包则不予响应。嗅探器工作在网络的底层,在网络上监听数据包来获取敏感信息。从原理上来说,在一个实际的系统中,数据的收发是由网卡来完成的,网卡接收到传输来的数据,其内的单片程序接收数据帧的目的MAC地址,根据计算机上的网卡驱动程序设置的接收模式判断该不该接收,认为该接收就接收后产生中断信号通知CPU,认为不该接收就丢掉不管,所以不该接收的数据网卡就截断了,计算机根本就不知道。对于网卡来说一般有四种接收模式: a)广播方式:该模式下的网卡能够接收网络中的广播信息。 b)组播方式:设置在该模式下的网卡能够接收组播数据。 c)直接方式:在这种模式下,只有目的网卡才能接收该数据。

网络嗅探器源代码

#include /*windows socketμ?í·???t£??μí3?¨ò?μ?*/ #include #include #include #include #pragma comment(lib,"ws2_32.lib") /*á′?óAPI?à1?á?μ?Ws2_32.lib?2ì??a*/ #define MAX_HOSTNAME_LAN 255 #define SIO_RCVALL _WSAIOW(IOC_VENDOR,1) #define MAX_ADDR_LEN 16 struct ipheader { unsigned char ip_hl:4; /*header length(±¨í·3¤?è£?*/ unsigned char ip_v:4; /*version(°?±?)*/ unsigned char ip_tos; /*type os service·t??ààDí*/ unsigned short int ip_len; /*total length (×ü3¤?è)*/ unsigned short int ip_id; /*identification (±êê?·?)*/ unsigned short int ip_off; /*fragment offset field(??ò???óò)*/ unsigned char ip_ttl; /*time to live (éú′?ê±??)*/ unsigned char ip_p; /*protocol(D-òé)*/ unsigned short int ip_sum; /*checksum(D£?éoí)*/ unsigned int ip_src; /*source address(?′μ??·)*/ unsigned int ip_dst; /*destination address(??μ?μ??·)*/ }; /* total ip header length: 20 bytes (=160 bits) */ typedef struct tcpheader { unsigned short int sport; /*source port (?′???úo?)*/ unsigned short int dport; /*destination port(??μ????úo?)*/ unsigned int th_seq; /*sequence number(°üμ?DòáDo?)*/ unsigned int th_ack; /*acknowledgement number(è·è?ó|′eo?)*/ unsigned char th_x:4; /*unused(?′ê1ó?)*/ unsigned char th_off:4; /*data offset(êy?Y??ò?á?)*/ unsigned char Flags; /*±ê??è?*/ unsigned short int th_win; /*windows(′°?ú)*/ unsigned short int th_sum; /*checksum(D£?éoí)*/ unsigned short int th_urp; /*urgent pointer(???±????)*/ }TCP_HDR;

相关文档
相关文档 最新文档