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

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

计算机与信息学院

《计算机网络系统实践》报告

2013 年 9 月 25

设计题目:嗅探器的设计与实现

学生姓名:***

学 号:2010****

专业班级:信息安全****

一、设计要求

1.不限平台,可以使用Libpcap、WinPcap 或 Linux的原始套接字;

2.实现一个功能比较简单的、具有图形界面的Sniffer,主线程响应用户界

面操作,工作线程完成抓包等工作;

3.能够解析出IP层和传输层的协议头,能够过滤TCP、UDP等数据包;

4.能够输出文本方式传送的数据包的内容;

5.能够进行简单的流量统计。

二、开发环境与工具

操作系统:windows7

开发工具:visual studio

开发语言:C++

附加库:Winpcap

三、设计原理

网络嗅探器是一种常用的监听网络的工具。所谓嗅探器( Sniffer) ,是一种利用计算机网络接口截获网络数据的软件或硬件,可用于网络管理、网络协议分析以及网络安全等众多方面。嗅探器不同于一般的键捕获工具,后者只能捕获当地终端控制台上的按键内容,而嗅探器所“嗅”到的是动态的以信息包形式( 如IP 数据包或者以太网包) 封装的信息流。其中可能携带了重要数据或敏感信息。可以将这些捕获到的信息包存档,以利用相应工具可以作进一步分析。

计算机网络的设计为嗅探器的使用创造了最基本的条件。在目前的网络环境中,所有计算机节点都是共享传输介质,任意节点发出或发往任意节点的数据帧必将经过网内每一个节点的网络接口,此时只需对嗅探节点的网络接口( 网卡) 进行适当的设置便可为实现嗅探的做好准备工作。在计算机网络系统中,网卡是用来接收网络上其他节点发来的数据帧,其内嵌的单片处理程序会检测数据帧来源的MAC 地址,并根据网卡所设置的接收方式来是否接收处理数据,如果认为应该处理,则网卡就会产生中断信号通知中央处理器,接收该数据帧并传输给操作系统处理。否则就简单丢弃,所对应节点的网卡就截断,计算机的中央处理器并不参与。

网卡是网络中节点主机的关键硬件设备。对数据的接收一般有四种设置模式: 广播模式: 接收在网络中进行广播数据信息。组播模式: 接收组播数据信息。单播模式: 只有匹配的目的网卡才能接收数据信息。混杂模式: 网卡能够可以接收一切通过它的数据信息。

四、系统功能描述及软件模块划分

系统功能设计

本系统的基本功能为实现网络数据包的捕获, 并将其数据内容解析显示。网络数据包捕获功能主要负责从网络中捕获和过滤数据,这可以通过调用winPcap提供的丰富的API函数来实现; 数据解析及显示部分主要负责界面数据转化、解析、处理、格式化、协议分析等, 这一部分主要通过MFC 来设计一个单文档图形用户界面GUI,解析结果将通过MFC的类库显示到GUI中

系统总系结构

网络嗅探器的整体设计由三个模块组成, 自底向上分别是嗅探器设置模块, 数据包捕获模块, 解析和显示模块。嗅探器设置模块主要调用w inP c aP 提供的API,分为获取网络设备信息,设置并编译过滤器,打开网络设备三个步骤。数据包捕获模块创建了新的线程,利用了winPcap的非回调函数Pcap_ next_ex()函数从winPcap底层驱动的数据缓冲区中读取数据包,并将数据包存储在系统临时文件中, 以便之后的分析。用Pcap_open_offline()函数从离线文件中读取包。读取到的任意一个符合捕获条件数据包, 将其内容解析, 并显示本数据包。捕获完成后, 进人解析和显示模块。(嗅探器总体结构如图1 )

图1.嗅探器总体结构

五、设计步骤

嗅探器的设置模块

a .获取已连接的网络设备列表, winPcap提供了pcap_findalldevs_ex()函

数, 这个函数返回一个PcaP-if结构的链表, 每个这样的结构都包含了一个适配器的详细信息。

b.打开网络设备,winPcap提供了pcap_open()函数,该函数第一参数制定要

捕获数据包的哪些部分, 第二参数用来制定适配器是否为混杂模式, 第三参数为读取数据的超时时间, 当适配器被打开后, 就可以进行捕获工作了;

c.设置过滤器, winPcap中用来过滤数据包的函数是pcap_compile()和pc

ap_setfilter()。pcap_compile()它将一个高层的布尔过滤表达式编译成一个能够被过滤引擎所解释的低层的字节码。pcap_setfilter()将一个过滤器与内核捕获会话相关联。当pcap_set_filter()被调用时, 这个过滤器将被应用到来自网络的所有数据包, 并且, 所有的符合要求的数据包(即那些经过过滤器以后, 布尔表达式为真的包), 将会立即复制给应用程序。

数据包的捕获模块

该部分创建了一个用于捕获数据包的线程, 在该线程中调用winPcap提供的pcap_next_ex()函数从底层驱动数据缓冲区中读取数据包, 该函数接受已打开的网络设备句柄, 返回捕获数据包的实体,并用pcap_dump函数将每一个数据包写人临时文件中。

解析与显示模块

该部分在接收到用户发出的捕获完成消息后, 将数据包从离线文件中逐条取出并进行解析和显示。将解析完毕数据包中的各项内容填人已经预先声明的协议的数据结构中, 包括(序号,捕获时间,以太帧长度,传输层协议,源IP 地址,目的IP地址,源MAC地址,目的MAC地址),然后将数据结构添加到列表视图中

WinPcap是一个在Windows操作系统下的免费、公开的用于直接访问网络的开发工具包(编程API)。大多数Windows网络应用程序都是通过Winsock API (Windows套接口)这类高级编程接口访问网络的。这种方法允许在网络上进行简单的数据传送,因为操作系统的TCP/IP协议栈实现软件会处理底层细节(协议操作、流程重组等等),并提供一个类似于读写文件的函数接口。

然而,有时候“简便方法”并不能满足实际需要。有些程序希望绕过TCP/IP 协议栈,直接处理底层网络中的通信数据,它们需要对网络进行底层进行直接访问,即在没有类似协议栈(TCP/IP协议栈)的实体介入条件下对网络进行原始访问。

络程序实际上是绕开操作系统的TCP/IP协议栈直接通过底层网络发送数据,因此,网络程序可以实现一些更低级、更灵活的功能。

开发WinPcap的目的是为Win32应用程序提供一种直接访问底层网络的能力。通过WinPcap,网络应用程序可以实现如下功能:1) 捕获原始数据包,包括发送到本主机以及在共享网络上的数据包。

2) 数据过滤。在将数据包发送给应用程序之前按照用户的规定对捕获的数据包进行过滤。

3) 发送原始数据包。向网络发送原始数据包。4) 数据包统计。对网络通信进行统计。

3、基于WinPcap可以开发的网络应用程序

基于WinPcap可以开发很多网络应用程序,典型的包括:1) 网络和协议分析软件2) 网络监听软件3) 网络通信量记录软件4) 网络数据生成软件5) 用户机网桥和路由器6) 网络入侵探测系统7) 网络扫描软件8) 网络安全工具

二、WinPcap的体系结构分析

1、WinPcap的组成与结构

如图2.1,WinPcap由一个数据包监听设备驱动程序(NPF)、一个底层的动态连接库(packet.dll)和一个高层的不依赖于操作系统的静态库(wpcap.dll)共三个部分构成。这里,NPF在操作系统的内核级,packet.dll、wpcap.dll在用户级。

4

向9x系统的概念和NT系统的非常相似,只是在某些实现上有点差异,比如说9x只支持ANSI编码,而NT系统则提倡使用Unicode编码。

简单来讲,WinPcap典型的开发和运行环境是windows NT/2000/XP。当然,早期的WinPcap也支持windows 95/98/Me,但是,我们不推荐在windows 95/98/Me下开发和运行基于WinPcap的网络应用。

二、WinPcap的体系结构分析

如图2.1,WinPcap由一个数据包监听设备驱动程序(NPF)、一个底层的动态连接库(packet.dll)和一个高层的不依赖于操作系统的静态库(wpcap.dll)共三个部分构成。这里,NPF在操作系统的内核级,packet.dll、wpcap.dll在用户级。

1)数据包监听设备驱动程序技术实现上,为了实现抓包,系统必须

绕过操作系统的协议栈来访问在网络上传输的原始数据包(raw packet)。这就要求WinPcap的一部分运行在操作系统核心内部,直接与网络接口驱动交互。由于这个部分是系统依赖(system dependent)的,在Winpcap的解决方案中它被视为是一个设备驱动,称作NPF(Netgroup Packet Filter)。Winpcap开发小组针对Windows95,Windows98,WindowsME,Windows NT 4,Windows2000和WindowsXP提供了不同版本的驱动(在Windows95/98/ME中是VXD文件,在WindowsNT/2000中是SYS文件)。这些驱动不仅提供了基本的特性(例如抓包、发送原始数据包——注入数据包),还有更高级的特性(例如可编程的过滤器系统和监视引擎)。前者可以被用来约束一个抓包会话只针对网络通信中的一个子集概括地讲,数据包监听设备驱动程序直接从数据链路层抓取网络数据包并过滤,将数据包不加修改地传递给运行在用户层的应用程序。它在不同的WINDOWS 系统下是不同。数据包监听设备驱动程序支持BPF过滤机制,可以灵活地设置过滤规则。

2)底层的动态连接库(packet.dll)和高层静态库(wpcap.dll)为了方便编程,WinPcap必须提供一个编程接口(API),这就是WinPcap的底层的动态连接库(packet.dll)和高层静态库(wpcap.dll)。这里,packet.dll提供了一个底层API,伴随着一个独立于Microsoft操作系统的编程接口,这些API可以直接用来访问驱动的函数;wpcap.dll导出了一组更强大的与libpcap一致的高层抓包函数库(capture primitives),这些函数使得数据包的捕获以一种与网络硬件和操作系统无关的方式进行

底层动态链接库运行在用户层,它将应用程序和数据包监听设备驱动程序隔离开来,使得应用程序可以不加修改地在不同的WINDOWS系统上运行。高级的静态链接库和应用程序编译在一起,它使用低级动态链接库提供的服务,向应用程

序提供完善的监听接口。

概括来讲,WinPcap包含了一个最优化的内核模式驱动——称作Netgroup Packet Filter(NPF),和一套与libpcap兼容的用户级函数库。WinPcap使Unix平台下的应用程序能方便的移植到Win32平台下,并且它能使一套很大的Unix函数库只需通过简单的重新编译就立刻在Win32平台下使用。而且,由于网络监听的重要性,WinPcap还为此提供了特殊的系统调用函数。实际上,Windows环境下的WinPcap与Unix环境下的Berkeley Packet Filter(BPF)在体系架构上是基本一致的。在Unix环境下,程序员只需要了解Libpcap提供的编程接口即可,Libpcap将应用程序与操作系统内核之间的相互作用隐藏起来,提供了一套与用户程序联系的函数和强大的捕获数据包的抽象接口。在Windows环境下,程序员主要基于wpcap.dll提供的编程接口开发应用程序。当然,程序要也可以使用packet.dll、NPF提供的编程接口,只是后者提供的API更加底层。

六、关键问题及其解决方法

界面初始化

BOOL CzszhangDlg::OnInitDialog()

{

CDialog::OnInitDialog();

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);

}

}

SetIcon(m_hIcon, TRUE); // 设置大图标

SetIcon(m_hIcon, FALSE); // 设置小图标

ShowWindow(SW_MINIMIZE);

m_listCtrl.SetExtendedStyle(LVS_EX_FULLROWSELECT|LVS_EX_GRI DLINES);

m_listCtrl.InsertColumn(0,_T("编号"),3,30); //1表示右,表示中,表示左

m_listCtrl.InsertColumn(1,_T("时间"),3,130);

m_listCtrl.InsertColumn(2,_T("长度"),3,72);

m_listCtrl.InsertColumn(3,_T("源MAC地址"),3,140);

m_listCtrl.InsertColumn(4,_T("目的MAC地址"),3,140);

m_listCtrl.InsertColumn(5,_T("协议"),3,70);

m_listCtrl.InsertColumn(6,_T("源IP地址"),3,145);

m_listCtrl.InsertColumn(7,_T("目的IP地址"),3,145);

m_combobox.AddString(_T("请选择一个网卡接口(必选)"));

m_comboBoxRule.AddString(_T("请选择过滤规则(可选)"));

if(sniffer_initCap()<0)

return FALSE;/*初始化接口列表*/

for(dev=alldev;dev;dev=dev->next)

{

if(dev->description)

m_combobox.AddString(CString(dev->description));

}

/*初始化过滤规则列表*/

m_comboBoxRule.AddString(_T("tcp"));

m_comboBoxRule.AddString(_T("udp"));

m_comboBoxRule.AddString(_T("ip"));

m_comboBoxRule.AddString(_T("icmp"));

m_comboBoxRule.AddString(_T("arp"));

m_combobox.SetCurSel(0);

m_comboBoxRule.SetCurSel(0);

m_buttonStop.EnableWindow(FALSE);

m_buttonSave.EnableWindow(FALSE);

return TRUE; // 除非将焦点设置到控件,否则返回TRUE

}

捕获数据包

//开始捕获

int CzszhangDlg::sniffer_startCap()

{

int if_index,filter_index,count;

u_int netmask;

struct bpf_program fcode;

CString Ncard;

sniffer_initCap();

//获得接口和过滤器索引

if_index = this->m_combobox.GetCurSel();

filter_index = this->m_comboBoxRule.GetCurSel();

if(0==if_index || CB_ERR == if_index)

{

MessageBox(_T("请选择一个合适的网卡接口"));

return -1;

}

if(CB_ERR == filter_index)

{

MessageBox(_T("过滤器选择错误"));

return -1;

}

/*获得选中的网卡接口*/

dev=alldev;

for(count=0;count

dev=dev->next;

if ((adhandle= pcap_open_live(dev->name, // 设备名

65536, //捕获数据包长度

1, // 混杂模式(非意味着是混杂模式)

1000, // 读超时设置

errbuf // 错误信息

)) == NULL)

{

MessageBox(_T("无法打开接口:"+CString(dev->description)));

pcap_freealldevs(alldev);

return -1;

}

/*检查是否为以太网*/

if(pcap_datalink(adhandle)!=DLT_EN10MB)

{

MessageBox(_T("这不适合于非以太网的网络!"));

pcap_freealldevs(alldev);

return -1;

}

if(dev->addresses!=NULL)

netmask=((struct sockaddr_in *)(dev->addresses->netmask))->sin_addr.S_un.S_addr;

else

netmask=0xffffff;

//编译过滤器

if(0==filter_index)

{

char filter[] = "";

if (pcap_compile(adhandle, &fcode, filter, 1, netmask) <0 ) {

MessageBox(_T("语法错误,无法编译过滤器"));

pcap_freealldevs(alldev);

return -1;

}

}else{

CString str;

char *filter;

int len,x;

this->m_comboBoxRule.GetLBText(filter_index,str);

len = str.GetLength()+1;

filter = (char*)malloc(len);

for(x=0;x

{

filter[x] = str.GetAt(x);

}

if (pcap_compile(adhandle, &fcode, filter, 1, netmask) <0 ) {

MessageBox(_T("语法错误,无法编译过滤器"));

pcap_freealldevs(alldev);

return -1;

}

}

//设置过滤器

if (pcap_setfilter(adhandle, &fcode)<0)

{

MessageBox(_T("设置过滤器错误"));

pcap_freealldevs(alldev);

return -1;

}

/* 设置数据包存储路径*/

CFileFind file;

char thistime[30];

struct tm *ltime;

memset(filepath,0,512);

memset(filename,0,64);

if(!file.FindFile(_T("SavedData")))

{

CreateDirectory(_T("SavedData"),NULL);

}

time_t nowtime;

time(&nowtime);

ltime=localtime(&nowtime);

strftime(thistime,sizeof(thistime),"%Y%m%d %H%M%S",ltime);

strcpy(filepath,"SavedData\\");

strcat(filename,thistime);

strcat(filename,".zsz");

strcat(filepath,filename);

dumpfile =pcap_dump_open(adhandle, filepath);

if(dumpfile==NULL)

{

MessageBox(_T("文件创建错误!"));

return -1;

}

pcap_freealldevs(alldev);

/*接收数据,新建线程处理*/

LPDWORD threadCap=NULL;

m_ThreadHandle=CreateThread(NULL,0,sniffer_CapThread,this,0,threadCa p);

if(m_ThreadHandle==NULL)

{

int code=GetLastError();

CString str;

str.Format(_T("创建线程错误,代码为%d."),code);

MessageBox(str);

return -1;

}

return 1;

}

数据包处理

DWORD WINAPI sniffer_CapThread(LPVOID lpParameter)

{

int res,nItem ;

struct tm *ltime;

CString timestr,buf,srcMac,destMac;

time_t local_tv_sec;

struct pcap_pkthdr *header; //数据包头

const u_char *pkt_data=NULL,*pData=NULL; //网络中收到的字节流数据

u_char *ppkt_data;

CzszhangDlg *pthis = (CzszhangDlg*) lpParameter;

if(NULL == pthis->m_ThreadHandle)

{

MessageBox(NULL,_T("线程句柄错误"),_T("提示"),MB_OK);

return -1;

}

while((res = pcap_next_ex( pthis->adhandle, &header, &pkt_data)) >= 0) {

if(res == 0) //超时

continue;

struct datapkt *data = (struct datapkt*)malloc(sizeof(struct datapkt));

memset(data,0,sizeof(struct datapkt));

if(NULL == data)

{

MessageBox(NULL,_T("空间已满,无法接收新的数据包"),_T("Error"),MB_OK);

return -1;

}

//分析出错或所接收数据包不在处理范围内

if(analyze_frame(pkt_data,data,&(pthis->npacket))<0)

continue;

//将数据包保存到打开的文件中

if(pthis->dumpfile!=NULL)

{

pcap_dump((unsigned char*)pthis->dumpfile,header,pkt_data);

}

//更新各类数据包计数

pthis->sniffer_updateNPacket();

//将本地化后的数据装入一个链表中,以便后来使用

ppkt_data = (u_char*)malloc(header->len);

memcpy(ppkt_data,pkt_data,header->len);

pthis->m_localDataList.AddTail(data);

pthis->m_netDataList.AddTail(ppkt_data);

/*预处理,获得时间、长度*/

data->len = header->len; //链路中收到的数据长度

local_tv_sec = header->https://www.360docs.net/doc/dc958287.html,_sec;

ltime = localtime(&local_tv_sec);

data->time[0] = ltime->tm_year+1900;

data->time[1] = ltime->tm_mon+1;

data->time[2] = ltime->tm_mday;

data->time[3] = ltime->tm_hour;

data->time[4] = ltime->tm_min;

data->time[5] = ltime->tm_sec;

/*为新接收到的数据包在listControl中新建一个item*/

buf.Format(_T("%d"),pthis->npkt);

nItem = pthis->m_listCtrl.InsertItem(pthis->npkt,buf);

/*显示时间戳*/

timestr.Format(_T("%d/%d/%d %d:%d:%d"),data->time[0],

data->time[1],data->time[2],data->time[3],data->time[4],data->time[5]);

pthis->m_listCtrl.SetItemText(nItem,1,timestr);

/*显示长度*/

buf.Empty();

buf.Format(_T("%d"),data->len);

pthis->m_listCtrl.SetItemText(nItem,2,buf);

/*显示源MAC*/

buf.Empty();

buf.Format(_T("%02X-%02X-%02X-%02X-%02X-%02X"),data->ethh->src [0],data->ethh->src[1],

data->ethh->src[2],data->ethh->src[3],data->ethh->src[4],data->ethh->src[5]);

pthis->m_listCtrl.SetItemText(nItem,3,buf);

/*显示目的MAC*/

buf.Empty();

buf.Format(_T("%02X-%02X-%02X-%02X-%02X-%02X"),data->ethh->de st[0],data->ethh->dest[1],

data->ethh->dest[2],data->ethh->dest[3],data->ethh->dest[4],data->ethh->de st[5]);

pthis->m_listCtrl.SetItemText(nItem,4,buf);

/*获得协议*/

pthis->m_listCtrl.SetItemText(nItem,5,CString(data->pktType));

/*获得源IP*/

buf.Empty();

if(0x0806== data->ethh->type)

{

buf.Format(_T("%d.%d.%d.%d"),data->arph->ar_srcip[0], data->arph->ar_srcip[1],data->arph->ar_srcip[2],data->arph->ar_srcip[3]);

}else if(0x0800 == data->ethh->type) {

struct in_addr in;

in.S_un.S_addr = data->iph->saddr;

buf = CString(inet_ntoa(in));

}else if(0x86dd ==data->ethh->type ){

int n;

for(n=0;n<8;n++)

{

if(n<=6)

buf.AppendFormat(_T("%02x:"),data->iph6->saddr[n]);

else

buf.AppendFormat(_T("%02x"),data->iph6->saddr[n]);

}

}

pthis->m_listCtrl.SetItemText(nItem,6,buf);

/*获得目的IP*/

buf.Empty();

if(0x0806 == data->ethh->type)

{

buf.Format(_T("%d.%d.%d.%d"),data->arph->ar_destip[0], data->arph->ar_destip[1],data->arph->ar_destip[2],data->arph->ar_destip[3]);

}else if(0x0800 == data->ethh->type){

struct in_addr in;

in.S_un.S_addr = data->iph->daddr;

buf = CString(inet_ntoa(in));

}else if(0x86dd ==data->ethh->type ){

int n;

for(n=0;n<8;n++)

{

if(n<=6)

buf.AppendFormat(_T("%02x:"),data->iph6->daddr[n]);

else

buf.AppendFormat(_T("%02x"),data->iph6->daddr[n]);

}

}

pthis->m_listCtrl.SetItemText(nItem,7,buf);

/*对包计数*/

pthis->npkt++;

}

return 1;

}

数据解析函数

/*分析链路层*/

int analyze_frame(const u_char * pkt,struct datapkt * data,struct pktcount *npacket)

{

int i;

struct ethhdr *ethh = (struct ethhdr*)pkt;

data->ethh = (struct ethhdr*)malloc(sizeof(struct ethhdr));

if(NULL == data->ethh)

return -1;

for(i=0;i<6;i++)

{

data->ethh->dest[i] = ethh->dest[i];

data->ethh->src[i] = ethh->src[i];

}

npacket->n_sum++;

data->ethh->type = ntohs(ethh->type);

//处理ARP还是IP包?

switch(data->ethh->type)

{

case 0x0806:

return analyze_arp((u_char*)pkt+14,data,npacket); //mac 头大小为

break;

case 0x0800:

return analyze_ip((u_char*)pkt+14,data,npacket);

break;

case 0x86dd:

return analyze_ip6((u_char*)pkt+14,data,npacket);

return -1;

break;

default:

npacket->n_other++;

return -1;

break;

}

return 1;

}

/*分析网络层:ARP*/

int analyze_arp(const u_char* pkt,datapkt *data,struct pktcount *npacket)

{

int i;

struct arphdr *arph = (struct arphdr*)pkt;

data->arph = (struct arphdr*)malloc(sizeof(struct arphdr));

if(NULL == data->arph )

return -1;

//复制IP及MAC

for(i=0;i<6;i++)

{

if(i<4)

{

data->arph->ar_destip[i] = arph->ar_destip[i];

data->arph->ar_srcip[i] = arph->ar_srcip[i];

}

data->arph->ar_destmac[i] = arph->ar_destmac[i];

data->arph->ar_srcmac[i]= arph->ar_srcmac[i];

}

data->arph->ar_hln = arph->ar_hln;

data->arph->ar_hrd = ntohs(arph->ar_hrd);

data->arph->ar_op = ntohs(arph->ar_op);

data->arph->ar_pln = arph->ar_pln;

data->arph->ar_pro = ntohs(arph->ar_pro);

strcpy(data->pktType,"ARP");

npacket->n_arp++;

return 1;

}

/*分析网络层:IP*/

int analyze_ip(const u_char* pkt,datapkt *data,struct pktcount *npacket) {

int i;

struct iphdr *iph = (struct iphdr*)pkt;

data->iph = (struct iphdr*)malloc(sizeof(struct iphdr));

if(NULL == data->iph)

return -1;

data->iph->check = iph->check;

npacket->n_ip++;

data->iph->saddr = iph->saddr;

data->iph->daddr = iph->daddr;

data->iph->frag_off = iph->frag_off;

data->iph->id = iph->id;

data->iph->proto = iph->proto;

data->iph->tlen = ntohs(iph->tlen);

data->iph->tos = iph->tos;

data->iph->ttl = iph->ttl;

data->iph->ihl = iph->ihl;

data->iph->version = iph->version;

data->iph->op_pad = iph->op_pad;

int iplen = iph->ihl*4; //ip头长度

switch(iph->proto)

{

case PROTO_ICMP:

return analyze_icmp((u_char*)iph+iplen,data,npacket);

break;

case PROTO_TCP:

return analyze_tcp((u_char*)iph+iplen,data,npacket);

break;

case PROTO_UDP:

return analyze_udp((u_char*)iph+iplen,data,npacket);

break;

default :

return-1;

break;

}

return 1;

}

/*分析网络层:IPV6*/

int analyze_ip6(const u_char* pkt,datapkt *data,struct pktcount *npacket) {

int i;

struct iphdr6 *iph6 = (struct iphdr6*)pkt;

data->iph6 = (struct iphdr6*)malloc(sizeof(struct iphdr6));

if(NULL == data->iph6)

return -1;

npacket->n_ip6++;

data->iph6->version = iph6->version;

data->iph6->flowtype = iph6->flowtype;

data->iph6->flowid = iph6->flowid;

data->iph6->plen = ntohs(iph6->plen);

data->iph6->nh = iph6->nh;

data->iph6->hlim =iph6->hlim;

for(i=0;i<16;i++)

{

data->iph6->saddr[i] = iph6->saddr[i];

data->iph6->daddr[i] = iph6->daddr[i];

}

switch(iph6->nh)

{

case 0x3a:

return analyze_icmp6((u_char*)iph6+40,data,npacket);

break;

case 0x06:

return analyze_tcp((u_char*)iph6+40,data,npacket);

break;

case 0x11:

return analyze_udp((u_char*)iph6+40,data,npacket);

break;

default :

return-1;

break;

}

return 1;

}

/*分析传输层:ICMP*/

int analyze_icmp(const u_char* pkt,datapkt *data,struct pktcount *npacket) {

struct icmphdr* icmph = (struct icmphdr*)pkt;

data->icmph = (struct icmphdr*)malloc(sizeof(struct icmphdr));

if(NULL == data->icmph)

return -1;

data->icmph->chksum = icmph->chksum;

data->icmph->code = icmph->code;

data->icmph->seq =icmph->seq;

data->icmph->type = icmph->type;

strcpy(data->pktType,"ICMP");

npacket->n_icmp++;

return 1;

}

/*分析传输层:ICMPv6*/

int analyze_icmp6(const u_char* pkt,datapkt *data,struct pktcount *npacket) {

int i;

struct icmphdr6* icmph6 = (struct icmphdr6*)pkt;

data->icmph6 = (struct icmphdr6*)malloc(sizeof(struct icmphdr6));

if(NULL == data->icmph6)

return -1;

data->icmph6->chksum = icmph6->chksum;

data->icmph6->code = icmph6->code;

data->icmph6->seq =icmph6->seq;

data->icmph6->type = icmph6->type;

data->icmph6->op_len = icmph6->op_len;

data->icmph6->op_type = icmph6->op_type;

for(i=0;i<6;i++)

{

data->icmph6->op_ethaddr[i] = icmph6->op_ethaddr[i];

}

strcpy(data->pktType,"ICMPv6");

npacket->n_icmp6++;

return 1;

}

/*分析传输层:TCP*/

int analyze_tcp(const u_char* pkt,datapkt *data,struct pktcount *npacket) {

struct tcphdr *tcph = (struct tcphdr*)pkt;

data->tcph = (struct tcphdr*)malloc(sizeof(struct tcphdr));

if(NULL == data->tcph)

return -1;

data->tcph->ack_seq = tcph->ack_seq;

data->tcph->check = tcph->check;

data->tcph->doff = tcph->doff;

data->tcph->res1 = tcph->res1;

data->tcph->cwr = tcph->cwr;

data->tcph->ece = tcph->ece;

data->tcph->urg = tcph->urg;

data->tcph->ack = tcph->ack;

data->tcph->psh = tcph->psh;

data->tcph->rst = tcph->rst;

data->tcph->syn = tcph->syn;

data->tcph->fin = tcph->fin;

data->tcph->dport = ntohs(tcph->dport);

data->tcph->seq = tcph->seq;

data->tcph->sport = ntohs(tcph->sport);

data->tcph->urg_ptr = tcph->urg_ptr;

data->tcph->window= tcph->window;

data->tcph->opt = tcph->opt;

//http??

if(ntohs(tcph->dport) == 80 || ntohs(tcph->sport)==80)

{

npacket->n_http++;

strcpy(data->pktType,"HTTP");

}

else{

npacket->n_tcp++;

strcpy(data->pktType,"TCP");

}

return 1;

}

/*分析传输层:UDP*/

int analyze_udp(const u_char* pkt,datapkt *data,struct pktcount *npacket) {

struct udphdr* udph = (struct udphdr*)pkt;

data->udph = (struct udphdr*)malloc(sizeof(struct udphdr));

if(NULL == data->udph )

return -1;

data->udph->check = udph->check;

基于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)直接方式:在这种模式下,只有目的网卡才能接收该数据。

个人课程设计报告

个人课程设计报告 个人课程设计之后怎么样写相关的报告呢?各位,我们看看下面的相关范文,大家一起阅读吧! 个人课程设计报告篇一首先我们由衷的感谢老师提供给我们这样一个锻炼自己的机会,经过这四周的学习,本次课程设计即将结束,总的来说,经过这门课的学习收获还是相当大的。回顾这段时间的课程设计,至今我仍感慨万分。的确,从选材到开始制作,从理论到实践,在四周的实训日子里,可以说得是苦多于甜,但是可以学到很多很多的的东西,同时不仅可以巩固了以前所学过的知识,而且学到了很多在书本上所没有学到过的知识。 通过这次课程设计使我们都更加懂得并亲身体会到了理论与实际相结合的重要性,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从实践中得出结论,才能真正为社会服务,从而提高自己的实际动手能力和独立思考的能力。在设计的过程中遇到很多问题,可以说是困难重重,并且在设计的过程中发现了自己的很多不足之处,发现自己对之前所学过的知识理解得不够深刻,掌握得不够牢固,有待加强。 生活就是这样,汗水预示着结果但是也见证着收获,劳动是人类生存、生活永恒不变的话题,通过实训,我才真正领略到“艰苦奋斗”这一词的真正含义。我想说,设计确实

有些辛苦,但苦中也有乐,在如今单一的理论学习中,很少有机会能有实践的机会,但我们可以。而且设计也是一个团队的任务,一起的工作可以让我们有说有笑,相互帮助,配合默契,多少欢乐在这里洒下。我想说,之前的时间确实很累,但当我们看到自己所做的劳动成果时,心中也不免产生兴奋。也许有人不喜欢这类的工作,也许有人认为编程的工作有些枯燥,但我们认为无论干什么,只要人生活的有意义就够了,而且这也是最主要的,社会需要我们,我们也可以为社会而工作。 我们的工作是一个团队的工作,团队需要个人,个人也离不开团队,必须发扬团结协作的精神,某个人的离群都可能导致整项工作的失败。实训中只有一个人知道原理是远远不够的,必须让每个人都知道,否则一个人的错误,就有可能导致整个项目失败,团结协作是我们实训成功的一项非常重要的保证。而这次实习也正好锻炼我们这一点,这也是非常宝贵的。 虽然我们的课程设计在规定的时间内按时完成了任务,但是,由于知识和经验的欠缺,整个系统的开发功能还不算太完善,在设计的过程中也遇到了很多困难,比如由于早期的需求分析不充分,给后来系统的具体实现带来了很大的困难,所以中间做了一部分的无用功,但通过我们的不懈努力和老师、同学的帮助,设计才得以圆满按时的完成,所以仅

(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)实现抓取数据包的功能。

WinPcap开发-零基础知识入门基础

WinPcap开发(一):零基础入门 *原创作者:追影人 0×00 前言 网络编程在网络安全方面具有举足轻重的作用,如何快捷高效的监听、分析、构造网络流量,成为很多安全从业者需要解决的重点问题。而winpcap这一免费开源项目恰好可以为win32应用程序提供访问网络底层的能力,所以其成为了相关网络编程的首选开发工具。 0×01 winpcap是什么? winpcap(windows packet capture)是windows平台下一个免费的网络访问系统,可用于windows系统下的网络编程。著名的wireshark便是基于winpcap开发的,大家在安装wireshark中可以看到winpcap驱动程序的安装过程。 有关winpcap的介绍网络上很多,百科里面介绍的也很详细,我就不再copy了。需要注意的一点是,winpcap并不是一个简单的library,而是一个针对Win32平台上的抓包和网络分析的一个架构,它包括一个核心态的包过滤器,一个底层的动态链接库(packet.dll)和一个高层的不依赖于系统的库(wpcap.dll)。所以它只能“嗅探”到物理线路上的数据包,而不具备拦截的能力,因此不适用于个人防火墙等项目。 0×02 你需要准备些什么?

本系列文章主要带大家认识和了解如何利用winpcap网络编程技术进行网络的协议分析、流量统计及网络探测扫描等,这里我们并不会去深硬的解读相关源代码,而是以轻松的方式结合实验来对相关原理进行深入理解。在本系列文章中,笔者从简到难,简明介绍winpcap架构原理、相关环境搭建及快速编写核心代码。但是在开始前,读者需要有一些相关基础:了解网络协议相关基础知识,掌握一门winpc ap开发库支持的编程语言,自己能动手实践编写一些例子。Winpcap提供的开发接口原生是c语言的,不过热心肠的程序猿们已经为其他语言的使用提供了封装,比如java、.net、python,好像连易语言都有。本系列文章将使用c语言来进行各种实验,有兴趣的读者可以将其转换成自己熟悉的语言来动手实践。 0×03 你能学到什么? 有关winpcap开发的文章在网上很容易找到,但是更多的都是对于代码的讲解,笔者在本文尽量系统性的从原理层面结合各个应用场景来介绍相关知识:

个人博客_课程设计报告

目录 第一章概述 (1) 1.1 本课题的研究背景 (1) 1.2 本课题的研究意义 (1) 1.3 现行研究存在的问题及解决办法 (1) 1.3.1 需求分析问题 (1) 1.3.2 代码实现问题 (2) 第二章系统分析 (3) 2.1 系统需求分析 (3) 2.2 采用的关键技术介绍 (3) 2.2.1 https://www.360docs.net/doc/dc958287.html,简介 (3) 2.2.2 Access数据库简介 (4) 2.3 可行性分析 (4) 2.3.1 技术可行性 (4) 2.3.2 操作可行性 (4) 第三章系统概要设计 (6) 3.1 系统总体设计 (6) 3.1.1 运行环境 (6) 3.1.2 系统流程 (6) 3.1.3 系统结构 (7) 3.2 系统接口的概要设计 (8) 3.2.1 用户接口 (8) 3.3 数据库概要设计 (9) 3.3.1 逻辑结构设计 (9) 3.3.2 物理结构设计 (10) 第四章系统详细设计 (11) 4.1 系统界面的详细设计 (11) 4.1.1 普通用户首页的详细设计 (11) 4.1.2 留言界面的详细设计 (11) 4.1.3 后台首页的详细设计 (12) 4.2 数据库详细设计 (13) 4.2.1 表的详细设计 (13) 第五章系统实现 (15) 5.1 系统开发环境 (15) 5.2 系统实现 (15) 5.2.1 客户端系统实现 (15) 5.2.2 后台管理系统实现 (17)

5.3 系统运行环境要求 (17) 5.3.1 服务器端要求 (17) 5.3.2 客户端要求 (18) 5.4 系统部署 (18) 5.4.1数据库设置 (18) 5.4.2 服务器端运行设置步骤 (18) 第六章性能测试与分析 (19) 6.1 测试实例(测试集)的研究与选择 (19) 第七章课程设计总结 (20) 7.1 课程设计心得体会 (20) 参考文献 (21)

网络嗅探器的设计实现

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

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

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

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

我的课程设计报告心得体会(大全)

我的课程设计报告心得体会(大全) 我的课程设计报告心得体会(大全) 一 课程设计是培养学生综合运用所学知识,发现,提出,分析和解决实际问题,锻炼实践能力的重要环节,是对学生实际工作能力的具体训练和考察过程.随着科学技术发展的日新日异,单片机已经成为当今计算机应用中空前活跃的领域,在生活中可以说得是无处不在。因此作为二十一世纪的大学来说掌握单片机的开发技术是十分重要的。 回顾起此次单片机课程设计,至今我仍感慨颇多,的确,从选题到定稿,从理论到实践,在整整两星期的日子里,可以说得是苦多于甜,但是可以学到很多很多的的东西,同时不仅可以巩固了以前所学过的知识,而且学到了很多在书本上所没有学到过的知识。通过这次课程设计使我懂得了理论与实际相结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,才能真正为社会服务,从而提高自己的实际动手能力和独立思考的能力。在设计的过程中遇到问题,可以说得是困难重重,这毕竟第一次做的,难免会遇到过各种各样的问题,同时在设计的过程中发现了自己的不足之处,对以前所学过的知识理解得不够深刻,掌握得不够牢固,比如说三极管PNP管脚不懂怎么放置,不懂分得二极管的正负极,对单片机汇编语言掌握得不好……通过这次课程设计之后,一定把以前所学过的知识重新温故。

这次课程设计终于顺利完成了,在设计中遇到了很多编程问题,最后在梁强老师的辛勤指导下,终于游逆而解。同时,在梁强老师的身上我学得到很多实用的知识,在次我表示感谢!同时,对给过我帮助的所有同学和各位指导老师再次表示忠心的感谢! 二 课程设计的心得体会 做了两周的课程设计,有很多的心得体会,有关于单片机方面的,更多的是关于人与人之间关系方面的。 我们组一共有三个人,但其他两个人是真的神龙见首不见尾,除了在最后答辩的时候他们一起坐在了我旁边,冠冕堂皇的指着我画了几遍的图说了几嘴,我想可能他们自己都不知道自己在说怎么,虽然有的东西他们也答出来了。我佩服他们的勇气,羡慕他们的运气(我见到的很多做了10 天的人最后的成绩都有不如他们的),但是鄙视他们的做法。 所幸的是,我得到了很多同学的帮助。我想没有他们我可能都要放弃了,因为我本人对单片机也并不是很熟悉,学的东西好像它是它,我是我似的,理论联系不了实际。以前的汇编语言没学好,一开始的程序这块儿就要令我抓狂了。后来请教我们班的一个男生,每次跟他一起到试验室调试程序(他们组也只有他一个人动手),看他边做边给我讲解。最后在开发机上做出来的时候,虽然不是我自己

课程设计个人总结

课程设计个人总结 我们完成了为期两周的课程设计,通过这次课程设计我深深体会到,在已度过的大学时间里,我们大多数接触的是专业课.我们在课堂上掌握的仅仅是专业课的理论知识, 如何去锻炼我们的实践能力?如何把我们所学的专业基础课理论知识运用到实践中去呢?我想做类似的课程设计就为我们提供了良好的实践平台。 虽然在大三开学初我对这门课并没有什么兴趣, 觉得那些程序枯燥乏味, 但在这次课程设计后我发现自己在一点一滴的努力中对它的兴趣也在逐步的增加。我们有四位同学一起合作,我们默契的配合使我们组第一个完成了我们的设计,而且设计达到了我们预期的效果。这次课程设计对我来说学到的不仅是那些知识,更多的是团队和合作。现在想来,也许学校安排的课程设计有着它更深层的意义吧, 它不仅仅让我们综合那些理论知识来运用到设计和创新中, 还让我们知道了一个团队凝聚在一起时所能发挥出的巨大潜能巨大力量!两周来我们一起找资料,选方案,再选方案是大家意见不统一然后我们一起上网进行查阅敲定方案后进行仿真,焊接调试程序,最后我们的篮球电子裁判器设计成功完成。两个星期后的今天我已明白课程设计对我来说的意义, 它不仅仅是让我们把所学的理论知识与实践相结合起来,提高自己的实际动手能力和独立思考的能力,更重要的是同学间的团结,使得我们这次比别的同学节省了时间,。 回顾起此课程设计,至今我仍感慨颇多,从理论到实践,在这段日子里,可以说得是苦多于甜,但是可以学到很多很多的东西,同时不仅可以巩固了以前所学过的知识,而且学到了很多在书本上所没有学到过的知识。通过这次课程设计使我懂得了理论与实际相结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,才能真正为社会服务,从而提高自己的实际动手能力和独立思考的能力。设计过程中,也对团队精神的进行了考察,让我们在合作起来更加默契,在成功后一起体会喜悦的心情。果然是团结就是力量,只有互相之间默契融洽的配合才能换来最终完美的结果。 在这学期的课程设计中,不仅培养了我们的独立思考、动手操作的能力,在各个其它能力上也都有了提高。更重要的是,在课程设计中,我们学会了很多学习的方法,而这是今后最实用的,真的是受益匪浅。要面对社会的挑战,只有不断的学习、实践,再学习、再实践。这对于我们的将来也有很大的帮助。以后,不管有多苦,我想我们都能变苦为乐,找寻有趣的事情,发现其中珍贵的事情。就像中国提倡的艰苦奋斗一样,我们在完成这次课程设计后变的更加成熟,能够面对需要面对的事情 ---吴丽娜

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

《网络与信息安全技术》课程报告 课题名称:网络嗅探器提交报告时间: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 引言 (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或者影音神探那种成熟的嗅探器所拥有的强大功能。作为从事网络技术方面的人员来说,要想有效地利用它、防范它,就得深入地学习、分析网络嗅探技术。最为重要的是,对于网络嗅探器的设计与实现,使我对网络通信,数据传输和网络信息安全等有了切身的体会与融入,同时也是对大学四年的学以致用,不断提高自我的一种有效途径。

winpcap环境部署(VC6.0出现找不到“pcap.h_'”文件解决方法)

Winpcap 环境部署 (VC6.0出现“pcap.h': No such file or directory”问题解决方法)Winpcap简介及Winpcap安装包和开发包下载地址: Winpcap是一个强大的网络开发库,可以实现许多功能:获取可用的网络适配器;获取指定适配器信息(比如名称和描述信息);捕获指定网卡的数据封包;发送数据封包;过滤捕获的包以获取特定包等。 首先到https://www.360docs.net/doc/dc958287.html,/install/default.htm下载安装winpcap 驱动和DLL组件。 注意下图被红线圈起来的地方,即使下载地址,点击进入 然后到https://www.360docs.net/doc/dc958287.html,/devel.htm.下载winpcap开发包,解压到指定目录,这里我解压到C:\WpdPack_4_0_2\WpdPack,可以看到里面包含了:Lib,Include,文档

和示例程序。 把安装包和开发包下载下来后,执行安装包,这样你的机子就能运行winpcap程序了,解压开发包里面有 具体解决方法: 这里的include和lib文件夹里的东西因为vc6.0里没有,所以编译一些程序时我们要手动添加。如果出现fatal error C1083: Cannot open include file: 'pcap.h': No such file or directory这个问题,就需要添加了。 下面是具体添加步骤: 第一步:

点菜单栏上的“工具”,再点击下拉菜单中的“选项”弹出“选项”对话框 点“目录”在“目录【S】”的下面选择include files然后按底下的添加符号,把你写的winpcap 开发包解压到的具体路径添加进去,如上图我的路径是

个人信息管理系统毕业课程设计实验报告

(此文档为word格式,下载后您可任意编辑修改!) 山东交通学院 目录 1.系统分析 (2) 1.1系统需求分析 (2) 1.2项目规划 (2) 1.3系统功能结构分析 (3) 1.4设计目的分析 (3) 2.数据库系统设计 (4) 2.1数据表概要设计 (4) 2.2数据库逻辑结构设计 (4) 3.应用程序设计 (5) 3.1界面设置 (5) 3.2关键技术 (15) 4.系统安装 (20) 建立数据源 (20) 5.设计体会 (21) 参考文献 (22)

摘要 随着经济社会的发展,计算机已被应用到社会生活的各个领域。与此同时,互联网作为信息技术的通信桥梁连接着全球的计算机,而网站作为网络信息主要的表现形式而且还是互联网信息的主要承载者,在网络上表现出其及其重要的地位,并发挥着极其重要的作用。无论是在国内还是国外都得以迅速的发展和壮大,并被人们重视和关注。互联网已经彻底的改变了世界,互联网的世界里蕴藏着无限的可能,在这种情况下,各行各业及其个人、单位、工厂、企事业等等在网上构筑属于自己的网络信息平台,保护自己的网络资源并在互联网上开辟自己的市场和消费群体,以及构造自己的数字化世界和加强全球范围内不同地域的人们联系交流等等活动也就显的日益重要。于是各种各样的网站便如雨后春笋般地出现鱼龙混杂且良莠不齐。因此,个人信息的管理就显得尤为重要了。不仅可以更好的保护个人信息,对日常的使用也会提供很大的方便。关键词:个人信息管理系统;数据集;数据库;Visual C++6.0。 1.系统分析 1.1系统需求分析 在做本系统前,我对系统的需求做了如下分析: 1)登录权限:在登录权限的分析上我们规定必须凭借用户名和密码才可登陆,进行管理。 2)使用者功能:首先说明一下,我们的系统用户对象是个人。关于其本系统的功能,大致可分为日记管理,通讯录管理,备忘录管理,以及个人财务管理;日记管理,其中包括用户对日记编号,时间,地点,事件、人物的查询、

WinpCap 编写抓包程序

利用WinpCap 编写抓包程序 网友:yeahilly 发布于:2008.05.20 11:12(共有条评论) 查看评论| 我要评论 WinpCap是一个公开的免费的抓包驱动加开发包,利用它,可以大大缩短我们的开发周期。 首先,先枚举系统中的所有网卡: /* 获取设备列表*/ if (pcap_findalldevs(&alldevs, errbuf) == -1) { fprintf(stderr,"Error in pcap_findalldevs: %s\n", errbuf); exit(1); } /* 数据列表*/ for(d=alldevs; d; d=d->next) { printf("%d. %s", ++i, d->name); if (d->description) printf(" (%s)\n", d->description); else printf(" (No description available)\n"); } 然后选择网卡,然后设备。 if ( (adhandle= pcap_open_live(d->name, //设备名 65536, // 捕捉完整的数据包 1 , // 混在模式 1, // 读入超时

errbuf // 错误缓冲 ) ) == NULL) { printf("Unable to open the adapter"); pcap_freealldevs(alldevs); return; } 打开设备之后,我们就可以利用adhandle句柄来正式抓包了,先新建一个回调函数,形如 void packet_handler(u_char* packets,const struct pcap_pkthdr *header,const u_char *data) { } 然 后调用pcap_loop(adhandle, 0, packet_handler, NULL);pcap_loop的最后一个参数和packet_handler的packets参数是对应的,用于在函数间传递数据。WinpCap每收 到一个包就自动调用packet_handler函数,将包的内容作为data参数,我们对data作强制类型转化就可以得到数据包各部分的内容。 事实上,WinpCap开发包除了可以用回调函数抓包外,还可以用非回调的方法。在得到adhandle后不调用pcap_loop,而用下面的方法:while(1) { res = pcap_next_ex(adhandle,&header,&data); if(res==0) { Sleep(100); continue; } } 用pcap_next_ex读取数据包内容,至于if(res==0)这一段是为了防止没数据包到达时重复循环。

网络嗅探器的设计与实现

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

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

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

网络嗅探器的实际与实现

网络与信息安全 课程设计 网络嗅探器的设计和实现 学院:计算机科学与技术 班级:网络工程06-1班 姓名:白俊生 学号:310609040105 指导老师:刘坤

目录 一、什么是嗅探器--------------------------------------------1 二、嗅探器的作用---------------------------------------------1 三、网络嗅探器的原理-----------------------------------------1 四、反嗅探技术----------------------------------------------7 五、网络嗅探器的设计-----------------------------------------8 六、结语---------------------------------------------------14参考书目--------------------------------------------------14

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

基于WinPcap的网络数据包捕获与分析

基于WinPcap的网络数据包捕获与分析 一、WinPcap介绍 1.WinPcap简介 WinPcap是一个在Windows操作系统下的免费、公开的用于直接访问网络的开发工具包(编程API)。大多数Windows网络应用程序都是通过Winsock API(Windows套接口)这类高级编程接口访问网络的。这种方法允许在网络上进行简单的数据传送,因为操作系统的TCP/IP协议栈实现软件会处理底层细节(协议操作、流程重组等等),并提供一个类似于读写文件的函数接口。 然而,有时候“简便方法”并不能满足实际需要。有些程序希望绕过TCP/IP协议栈,直接处理底层网络中的通信数据,它们需要对网络进行底层进行直接访问,即在没有类似协议栈(TCP/IP协议栈)的实体介入条件下对网络进行原始访问。 基于Winsock API编程,应用程序是通过调用操作系统提供的编程接口访问TCP/IP协议栈实现网络通信的。基于WinPcap编程,网络程序实际上是绕开操作系统的TCP/IP协议栈直接通过底层网络发送数据,因此,网络程序可以实现一些更低级、更灵活的功能。 2.WinPcap的组成与结构 如图 1.1,WinPcap由一个数据包监听设备驱动程序(NPF)、一个底层的动态连接库(packet.dll)和一个高层的不依赖于操作系统的静态库(wpcap.dll)共三个部分构成。这里,NPF在操作系统的内核级,packet.dll、wpcap.dll在用户级。 1)数据包监听设备驱动程序Array技术实现上,为了实现抓包,系统必须绕过操作系统 的协议栈来访问在网络上传输的原始数据包(raw packet)。这就要求WinPcap的一部分运行在操作系统核心 内部,直接与网络接口驱动交互。由于这个部分是系统依 赖(system dependent)的,在Winpcap的解决方案中它被 视为是一个设备驱动,称作NPF(Netgroup Packet Filter)。 图1.1 WinPcap的组成和结构

C语言课程设计 个人课程表管理系统报告

个人课程表管理系统 设 计 报 告 专业:通信工程 班级:通信1401 团队: C.F 指导老师:刘少昌 队长:陈志强 队员:蔡晶晶、陈超、刘勤、盛玉霞 设计时间:2015年7月9日星期四

说明 *我们的课题是:个人课程表管理系统 *选题的目的与意义: 我们的系统是为了更加方便的查询课程表,方便我们的大学校园生活而创建。这个项目符合我们大一学生c语言水平,而且此课题新颖,可以充分锻炼我们团队思维能力。 *项目的主要功能描述: 一输入课程:可根据个人需求,填写课程表信息。 二显示课程:按照时间顺序显示。 三查询课表:有以时间、课程名、查询。 四修改课程: 可以按照已有的课程信息,选择要修改课程的序号,可以修改已选序号的全部信息、时间、课程名、教室。五删除课程:可以按照已有的课程信息,选择要修改课程的序号,进行删除。 六保存文件保存文件 七退出程序:退出程序。

结构体设计 struct schedule { char time[8]; 字符型课程时间 char lessonname[12]; 字符型课程名 char teacher[10]; 字符型授课老师 char classroom[10]; 字符型教室 char hours[4]; 字符型第几节课 int weeks; 整型周时 }; 全局变量struct schedule str[100]; *函数原型设计 a)void input(); /*声明输入函数*/ b)void menu1(); /*声明主菜单函数*/ c)void rank(); /*声明显示时间顺序函数*/ d)void querymenu3(); /*声明查询函数*/ e)void looktime(); /*声明按照时间查询函数*/ f)void looklessonname(); /*声明按照课程名查询函数*/ g)void add(); /*声明保存函数*/ h)void amend(); /*声明修改课程函数*/ i)void amend1(); /*声明修改课程子函数*/ j)void amendnews(int i); /*声明修改整个课程信息函数k)void amendtime(int i); /*声明修改课程时间函数*/ l)void lessonname(int i);/*声明修改课程课程名函数*/ m)void amendclassroom(int i);/*声明修改课程教室函数n)void deleted(); /*声明删除函数*/

相关文档
最新文档