當前位置:首頁 » 安全設置 » 網路安全嗅探器的設計與實現
擴展閱讀
加入群語音網路異常 2025-06-30 22:42:09
無線網路名有趣 2025-06-30 22:33:18

網路安全嗅探器的設計與實現

發布時間: 2022-06-08 06:52:03

㈠ 求個網路嗅探器的設計 相關的 外文翻譯

隨著網路技術的發展和網路應用的普及,越來越多的信息資源放在了互聯網上,網路的安全性和可靠性顯得越發重要。因此,對於能夠分析、診斷網路,測試網路性能與安全性的工具軟體的需求也越來越迫切。網路嗅探器具有兩面性,攻擊者可以用它來監聽網路中數據,達到非法獲得信息的目的,網路管理者可以通過使用嗅探器捕獲網路中傳輸的數據包並對其進行分析,分析結果可供網路安全分析之用。
本文對網路嗅探技術進行了簡要分析,研究了網路數據包的捕獲機制,如winpcap、原始套接字。文中首先分析了嗅探的原理和危害,並介紹了幾種常見的嗅探器,然後研究了入侵檢測系統中使用的包捕獲技術。本文利用原始套接字在windows平台下實現了一個網路嗅探器程序,完成了對數據包進行解包、分析數據包的功能。
關鍵詞:網路嗅探器;數據包捕獲;數據包分析;原始套接字

目 錄
1 引言 1
1.1 網路安全的現狀 1
1.1.1 計算機網路安全的問題 1
1.1.2 網路安全機制及技術措施 1
1.2本課題的研究意義 2
1.3本文研究的內容 3
2 網路嗅探器的基本原理 3
2.1網路嗅探器概述 3
2.2 嗅探器實現基礎 3
2.3 常見的sniffer 4
2.4 數據包捕獲機制的研究 4
2.4.1 WinPcap包捕獲機制 5
2.4.2 套接字包捕獲機制 6
2.5 嗅探器的兩面性 8
2.5.1 sinffer的危害 8
2.5.2 通過網路嗅探進行網路管理 9
3 入侵檢測系統與嗅探器 9
3.1 入侵檢測概念 9
3.2 入侵檢測的實現與嗅探器 10
3.2.1 入侵檢測的實現與嗅探器的關系 11
3.2.2 數據包嗅探技術在入侵檢測系統中的應用 11
4 嗅探器的實現與測試 12
4.1利用套接字開發網路嗅探程序的步驟 12
4.2 嗅探器的具體實現原理 13
4.3 數據包捕獲程序設計 15
4.4 數據包的解析 15
4.5 數據的顯示 19
4.6 嗅探器的測試 22

㈡ 【c++ 課程設計】 簡單的網路嗅探器 目的與要求:實現網路層抓包,並對獲得包的源和目的地址、埠、協議等

#include <winsock2.h> /*windows socket的頭文件,系統定義的*/
#include <windows.h>
#include <ws2tcpip.h>
#include <stdio.h>
#include <stdlib.h>
#pragma comment(lib,"ws2_32.lib") /*鏈接API相關連的Ws2_32.lib靜態庫*/
#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(報頭長度)*/
unsigned char ip_v:4; /*version(版本)*/
unsigned char ip_tos; /*type os service服務類型*/
unsigned short int ip_len; /*total length (總長度)*/
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(協議)*/
unsigned short int ip_sum; /*checksum(校驗和)*/
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 (源埠號)*/
unsigned short int dport; /*destination port(目的埠號)*/
unsigned int th_seq; /*sequence number(包的序列號)*/
unsigned int th_ack; /*acknowledgement number(確認應答號)*/
unsigned char th_x:4; /*unused(未使用)*/
unsigned char th_off:4; /*data offset(數據偏移量)*/
unsigned char Flags; /*標志全*/
unsigned short int th_win; /*windows(窗口)*/
unsigned short int th_sum; /*checksum(校驗和)*/
unsigned short int th_urp; /*urgent pointer(緊急指針)*/
}TCP_HDR;

typedef struct udphdr {
unsigned short sport; /*source port(源埠號)*/
unsigned short dport; /*destination port(目的埠號)*/
unsigned short len; /*udp length(udp長度)*/
unsigned short cksum; /*udp checksum(udp校驗和)*/
}UDP_HDR;

void main(){

SOCKET sock;
WSADATA wsd;
DWORD dwBytesRet;
unsigned int optval = 1;
unsigned char *dataudp,*datatcp;
int i,pCount=0,lentcp, lenudp;
SOCKADDR_IN sa,saSource, saDest;
struct hostent FAR * pHostent;
char FAR name[MAX_HOSTNAME_LAN];
char szSourceIP[MAX_ADDR_LEN], szDestIP[MAX_ADDR_LEN],RecvBuf[65535] = {0};
struct udphdr *pUdpheader;
struct ipheader *pIpheader;
struct tcpheader *pTcpheader;
WSAStartup(MAKEWORD(2,1),&wsd);
if ((sock = socket(AF_INET, SOCK_RAW, IPPROTO_IP))==SOCKET_ERROR)
exit(1);
gethostname(name, MAX_HOSTNAME_LAN);
pHostent = gethostbyname(name);
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);
bind(sock, (SOCKADDR *)&sa, sizeof(sa)); /*bind()設定自己主機的IP地址和埠號*/
if ((WSAGetLastError())==10013)
exit(1);
WSAIoctl(sock, SIO_RCVALL, &optval, sizeof(optval), NULL, 0, &dwBytesRet, NULL, NULL);
pIpheader = (struct ipheader *)RecvBuf;
pTcpheader = (struct tcpheader *)(RecvBuf+ sizeof(struct ipheader ));
pUdpheader = (struct udphdr *) (RecvBuf+ sizeof(struct ipheader ));

while (1){
memset(RecvBuf, 0, sizeof(RecvBuf));
recv(sock, RecvBuf, sizeof(RecvBuf), 0);
saSource.sin_addr.s_addr = pIpheader->ip_src;
strncpy(szSourceIP, inet_ntoa(saSource.sin_addr), MAX_ADDR_LEN);
saDest.sin_addr.s_addr = pIpheader->ip_dst;
strncpy(szDestIP, inet_ntoa(saDest.sin_addr), MAX_ADDR_LEN);
lentcp =(ntohs(pIpheader->ip_len)-(sizeof(struct ipheader)+sizeof(struct tcpheader)));
lenudp =(ntohs(pIpheader->ip_len)-(sizeof(struct ipheader)+sizeof(struct udphdr)));

if((pIpheader->ip_p)==IPPROTO_TCP&&lentcp!=0){
printf("*******************************************\n");
pCount++;
datatcp=(unsigned char *) RecvBuf+sizeof(struct ipheader)+sizeof(struct tcpheader);
printf("-TCP-\n");
printf("\n目的IP地址:%s\n",szDestIP);
printf("\n目的埠:%i\n",ntohs(pTcpheader->dport));
printf("datatcp address->%x\n",datatcp);
printf("size of ipheader->%i\n",sizeof(struct ipheader));
printf("size of tcpheader->%i\n",sizeof(struct tcpheader));
printf("size of the hole packet->%i\n",ntohs(pIpheader->ip_len));
printf("\nchar Packet%i [%i]=\"",pCount,lentcp-1);

for (i=0;i<lentcp;i++){
printf("\\x%.2x",*(datatcp+i));
if (i%10==0)
printf("\"\n\"");
}
printf("\";\n\n\n");

for (i=0;i<lentcp;i++){
if( *(datatcp+i)<=127&&*(datatcp+i)>=20)
printf("%c",*(datatcp+i));
else
printf(".");
}
printf("\n\n*******************************************\n");
}

if((pIpheader->ip_p)==IPPROTO_UDP&&lentcp!=0){
pCount++;
dataudp=(unsigned char *) RecvBuf+sizeof(struct ipheader)+sizeof(struct udphdr);
printf("-UDP-\n");
printf("\n目的IP地址:%s\n",szDestIP);
printf("\n目的埠:%d\n",ntohs(pTcpheader->dport));
printf("UDP數據地址:%x\n",dataudp);
printf("IP頭部長度:%i\n",sizeof(struct ipheader));
printf("UDP頭部長度:%i\n",sizeof(struct udphdr));
printf("包的大小:%i\n",ntohs(pIpheader->ip_len));
printf("\nchar Packet%i [%i]=\"",pCount,lenudp-1);
for (i=0;i<lenudp;i++){
printf("\\x%.2x",*(dataudp+i));
if (i%10==0)
printf("\"\n\"");
}
printf("\";\n\n\n");
for (i=0;i<lenudp;i++){
if( *(dataudp+i)<=127&&*(dataudp+i)>=20)
printf("%c",*(dataudp+i));
else
printf(".");
}
printf("\n\n*******************************************\n");
}
}
}

㈢ 計算機網路課程設計

我給你發

㈣ 嗅探器是做什麼用的電腦

嗅探器是一種監視網路數據運行的軟體設備,協議分析器既能用於合法網路管理也能用於竊取網路信息。網路運作和維護都可以採用協議分析器:如監視網路流量、分析數據包、監視網路資源利用、執行網路安全操作規則、鑒定分析網路數據以及診斷並修復網路問題等等。非法嗅探器嚴重威脅網路安全性,這是因為它實質上不能進行探測行為且容易隨處插入,所以網路黑客常將它作為攻擊武器。
嗅探器最初由 Network General 推出,由 Network Associates 所有。最近,Network Associates 決定另開辟一個嗅探器產品單元,該單元組成一家私有企業並重新命名為 Network General,如今嗅探器已成為 Network General 公司的一種特徵產品商標,由於專業人士的普遍使用,嗅探器廣泛應用於所有能夠捕獲和分析網路流量的產品。
嗅探器設計原理
嗅探器作為一種網路通訊程序,也是通過對網卡的編程來實現網路通訊的,對網卡的編程也是使用通常的套接字(socket)方式來進行。但是,通常的套接字程序只能響應與自己硬體地址相匹配的或是以廣播形式發出的數據幀,對於其他形式的數據幀比如已到達網路介面但卻不是發給此地址的數據幀,網路介面在驗證投遞地址並非自身地址之後將不引起響應,也就是說應用程序無法收取到達的數據包。而網路嗅探器的目的恰恰在於從網卡接收所有經過它的數據包,這些數據包即可以是發給它的也可以是發往別處的。顯然,要達到此目的就不能再讓網卡按通常的正常模式工作,而必須將其設置為混雜模式。

㈤ 嗅探器 干什麼啊

嗅探器
嗅探器是一種監視網路數據運行的軟體設備,協議分析器既能用於合法網路管理也能用於竊取網路信息。網路運作和維護都可以採用協議分析器:如監視網路流量、分析數據包、監視網路資源利用、執行網路安全操作規則、鑒定分析網路數據以及診斷並修復網路問題等等。非法嗅探器嚴重威脅網路安全性,這是因為它實質上不能進行探測行為且容易隨處插入,所以網路黑客常將它作為攻擊武器。
嗅探器最初由 Network General 推出,由 Network Associates 所有。最近,Network Associates 決定另開辟一個嗅探器產品單元,該單元組成一家私有企業並重新命名為 Network General,如今嗅探器已成為 Network General 公司的一種特徵產品商標,由於專業人士的普遍使用,嗅探器廣泛應用於所有能夠捕獲和分析網路流量的產品。
嗅探器設計原理
嗅探器作為一種網路通訊程序,也是通過對網卡的編程來實現網路通訊的,對網卡的編程也是使用通常的套接字(socket)方式來進行。但是,通常的套接字程序只能響應與自己硬體地址相匹配的或是以廣播形式發出的數據幀,對於其他形式的數據幀比如已到達網路介面但卻不是發給此地址的數據幀,網路介面在驗證投遞地址並非自身地址之後將不引起響應,也就是說應用程序無法收取到達的數據包。而網路嗅探器的目的恰恰在於從網卡接收所有經過它的數據包,這些數據包即可以是發給它的也可以是發往別處的。顯然,要達到此目的就不能再讓網卡按通常的正常模式工作,而必須將其設置為混雜模式。

㈥ 用VC編寫網路嗅探工具

目前,已經有不少的Sniff工具軟體,如Windows環境下,最富盛名的工具是Netxray和Sniffer pro,用它們在 Windows環境下抓包來分析,非常方便。在UNIX環境下如Sniffit,Snoop,Tcpmp,Dsniff 等都是比較常見的。這里介紹一個用C語言和網路數據包和分析開發工具libpcap及winpcap實現的簡易網路Sniffer。
2網路嗅探器程序實現
在c環境下編程,源碼如下:
/* June 2nd,2002
* Project for graation qualification By Bby Team 19 */
#include
#include
//必須加路徑,必須把頭文件packet32.h包含進去
#include "..\..\Include\packet32.h"
#include "..\..\Include\ntddndis.h"

#define Max_Num_Adapter 10
// Prototypes原形
//發包
void PrintPackets(LPPACKET lpPacket);
//設備列表
char AdapterList[Max_Num_Adapter][1024];
// 主程序開始
int main()
{
//define a pointer to an ADAPTER structure設備指針
LPADAPTER lpAdapter = 0;
//define a pointer to a PACKET structure包指針
LPPACKET lpPacket;
int i;
DWORD dwErrorCode;
DWORD dwVersion;
DWORD dwWindowsMajorVersion;
//Unicode strings (WinNT)
WCHAR AdapterName[8192]; //網路適配器設備列表
WCHAR *temp,*temp1;
//ASCII strings (Win9x)
char AdapterNamea[8192]; //網路適配器設備列表
char *tempa,*temp1a;
int AdapterNum=0,Open;
ULONG AdapterLength;
char buffer[256000]; // 容納來自驅動器的數據的緩沖區
struct bpf_stat stat;
// 獲得本機網卡名
AdapterLength=4096;
printf("Packet.dll test application. Library version:%s\n", PacketGetVersion());
printf("Adapters installed:\n");
i=0;
下面這段代碼是用來在不同版本下得到網路適配器名:
Win9x 和WinNT中的網卡名稱是分別用ASCII和UNICODE實現的,所以首先要得到本地操作系統的版本號.:
dwVersion=GetVersion();
dwWindowsMajorVersion= (DWORD)(LOBYTE(LOWORD(dwVersion)));
這里首先用到的Packet.dll函數是PacketGetAdapterNames(PTSTR pStr,PULONG BufferSize,通常它是與驅動程序通信並被調用的第一個函數,它將返回的用戶本地系統中安裝的網路適配器的名字放在緩沖區pStr中;BufferSize是緩沖區的長度:
if (!(dwVersion >= 0x80000000 && dwWindowsMajorVersion >= 4))
{ //是Windows NT
// 找不到設備列表
if(PacketGetAdapterNames(AdapterName,&AdapterLength)==FALSE){
printf("Unable to retrieve the list of the adapters!\n");
return -1;

一個簡易網路嗅探器的實現 來自: 書簽論文網
}
// 找到設備列表
temp=AdapterName;
temp1=AdapterName;
while ((*temp!='\0')||(*(temp-1)!='\0'))
{
if (*temp=='\0')
{
memcpy(AdapterList,temp1,(temp-temp1)*2);
temp1=temp+1;
i++;
}
temp++;
}
// 顯示適配器列表
AdapterNum=i;
for (i=0;i wprintf(L"\n%d- %s\n",i+1,AdapterList);
printf("\n");
}
else //否則就是windows 9x,獲取適配器名的方法同WinNT下
{
if(PacketGetAdapterNames(AdapterNamea,&AdapterLength)==FALSE){
printf("Unable to retrieve the list of the adapters!\n");
論文一個簡易網路嗅探器的實現來自

return -1;
}
tempa=AdapterNamea;
temp1a=AdapterNamea;
while ((*tempa!='\0')||(*(tempa-1)!='\0'))
{
if (*tempa=='\0')
{
memcpy(AdapterList,temp1a,tempa-temp1a);
temp1a=tempa+1;
i++;
}
tempa++;
}
AdapterNum=i;
for (i=0;i printf("\n%d- %s\n",i+1,AdapterList);
printf("\n");
}
下面這段代碼就是讓用戶選擇監聽的網路適配器號:
// 選擇設備
do
{
printf("Select the number of the adapter to open : ");
scanf("%d",&Open);
if (Open>AdapterNum)
printf("\nThe number must be smaller than %d",AdapterNum);
} while (Open>AdapterNum);
然後,將所選擇的設備打開,這里可以設置為「混雜」模式打開,也可以是「直接」模式打開。代碼如下:
// 打開設備
lpAdapter = PacketOpenAdapter(AdapterList[Open-1]);
// 當設備無法打開時,出示錯誤信息:
if (!lpAdapter || (lpAdapter->hFile == INVALID_HANDLE_VALUE))
{
dwErrorCode=GetLastError();
printf("Unable to open the adapter, Error Code : %lx\n",dwErrorCode);
return -1;
}
將網卡設置為「混雜」模式,代碼如下:
這里用到函數PacketSetHwFilter(LPADAPTER AdapterObject,ULONG Filter),它在到來的包上設置了一個硬體過濾器,如操作成功,返回TRUE。AdapterObject是過濾器所在的網卡設備指針;過濾器的常量Filter定義在頭文件ntddndis.h 中,包括有:
•NDIS-PACKET-TYPE-PROMISCUOUS:設置混雜模式,每個到來的包都會被網卡接受;
•NDIS-PACKET-TYPE-DIRECTED:只有直接到主機網卡的包才會被接受;
•NDIS-PACKET-TYPE-BROADCAST:只接受廣播包;
•NDIS-PACKET-TYPE-MULTICAST:只接受到主機所在的組的多播包;
•NDIS-PACKET-TYPE-ALL-MULTICAS:接受每個多播的包。
// set the network adapter in promiscuous mode
// 如果混雜模式設置失敗,提示錯誤:
if(PacketSetHwFilter(lpAdapter,NDIS_PACKET_TYPE_PROMISCUOUS)==FALSE){

一個簡易網路嗅探器的實現 來自: 書簽論文網
printf("Warning: unable to set promiscuous mode!\n");
}
然後在driver中置512K的緩沖:
這里用到函數PacketSetBuff(LPADAPTER AdapterObject,int dim),它被用於設置AdapterObject指向的網卡的驅動程序的緩沖區,成功則返回TRUE。Dim是新的緩沖區的大小,當它被設定時,舊緩沖區中的數據將被丟棄,其中存儲的包也會失去。
需要注意的地方:驅動器緩沖區的大小設置是否恰當,將影響截包進程的性能,設置應能保證運行快且不會丟包。這里設置的是512000Byte。
// set a 512K buffer in the driver
// 當無法設置緩沖區時,提示錯誤:
if(PacketSetBuff(lpAdapter,512000)==FALSE){
printf("Unable to set the kernel buffer!\n");
return -1;
}
PacketSetReadTimeout(LPADAPTER AdapterObject,int timeout)函數的功能是,設置與AdapterObject指定網卡綁定的讀操作超時的值,timeout以毫秒為單位,0表示沒有超時,當沒有包到時,read就不返回。

// set a 1 second read timeout
// 設置1秒的讀取操作超時
if(PacketSetReadTimeout(lpAdapter,1000)==FALSE){
printf("Warning: unable to set the read tiemout!\n");
}
接下來,定位設備,代碼如下:
這里用到函數PacketAllocatePacket(Void)將在內存中分配一個PACKET結構並返回一個指向它的指針,但這個結構的Buffer欄位還沒有設定,所以應再調用PacketInitPacket函數來對其進行初始化。
//allocate and initialize a packet structure that will be used to
//receive the packets.
// 當定位失敗時,提示錯誤:
if((lpPacket = PacketAllocatePacket())==NULL){
printf("\nError: failed to allocate the LPPACKET structure.");
return (-1);
}
然後,就可以初始化設備,開始接受網路包了:
用函數PacketInitPacket(LPPACKET lpPacket,PVOID Buffer,UINT Length)來初始化PACKET結構。lpPacket是要被初始化的指針;Buffer為指向用戶分配的包含包的數據的緩沖區的指針;Length為緩沖區長度。
需要注意的地方:PACKET結構關聯的緩沖區存儲由packet capture driver 截獲的包,包的數量被緩沖區大小所限制,最大緩沖區的大小就是應用程序從驅動器中一次能讀到的數據的多少。所以設置大的緩沖區可減少系統調用的次數,提高截獲效率。這里設置的是256K。
PacketInitPacket(lpPacket,(char*)buffer,256000);
接下來,是截包主循環:
//main capture loop
這里又用到函數PacketReceivePacket(LPADAPTER AdapterObject,LPPACKET lpPacket,BOOLEAN Sync),它將接受(截獲)一個包的集合。參數包括一個指向用來指定截包的網卡的ADAPTER結構指針、一個指向用來容納包的PACKET結構、一個指出是同步還是非同步方式操作的標記。當操作同步時,函數鎖定程序;當操作非同步時,函數不鎖定程序,必須調用PacketWaitPacket過程來檢查是否正確完成。一般採用同步模式。
// 直到有鍵盤鍵入:
while(!kbhit())
{
// capture the packets 捕獲包
// 捕獲包失敗時,提示錯誤:
if(PacketReceivePacket(lpAdapter,lpPacket,TRUE)==FALSE){
printf("Error: PacketReceivePacket failed");

一個簡易網路嗅探器的實現 來自: 書簽論文網
return (-1);
}
// 列印包中的數據,調用自定義函數PrintPackets()
PrintPackets(lpPacket);
}
最後將得到的統計數據列印出來,代碼如下:
這里用到函數PacketGetStats(LPADAPTER AdapterObject,struct bpf_star*s)可以得到兩個驅動程序的內部變數的值:從調用PacketOpenAdapter開始,已經被指定網卡接收的包數目;以及已經被網卡接收但被內核丟棄的包數目。這兩個值被驅動程序拷貝到應用提供的bpf_stat結構中。
//print the capture statistics
// 得到統計值
// 當無法從內核讀取狀態時,提示錯誤:
if(PacketGetStats(lpAdapter,&stat)==FALSE){
printf("Warning: unable to get stats from the kernel!\n");
}
// 列印「XX包被截取;XX包被丟棄」:
else
printf("\n\n%d packets received.\n%d Packets lost",stat.bs_recv,stat.bs_drop);
這里用函數PacketFreePacket(LPPACKET lpPacket)來釋放由lpPacket指向的結構:
// 釋放空間
PacketFreePacket(lpPacket);
用函數PacketCloseAdapter(LPADAPTER lpAdapter)來釋放ADAPTER結構lpAdapter,並關閉網卡指針:
// close the adapter and exit
// 關閉設備退出
PacketCloseAdapter(lpAdapter);
return (0);
} // 主程序結束
其中用來列印數據報的自定義的函數PrintPackets()的代碼在這里就不詳細說明了。
3結束語
通過對網路嗅探器的編寫,目的使大家知道網路管理的重要性,時刻注意網路信息安全問題,做好信息的加密和解密工作。

㈦ FTP嗅探器的設計與實現

FTP嗅探器的設計與實
這樣好理解,分析結果的

㈧ (網路嗅探器-sniffer)誰能幫我找關於網路嗅探器的綜述文章。

嗅探器是一種利用計算機網路介面截獲網路數據(目的地為其他計算機)的工具。可用於網路管理、網路協議分析以及網路安全等眾多方面。在網路攻防技術中,嗅探技術是最為基礎的一種技術。從攻擊的角度,黑客可以利用嗅探器程序非法獲取網路中傳輸的大量敏感信息,如帳號和口令等。而且由於嗅探器完全被動安靜的工作方式以及幾乎可以被安裝在任何地方,對網路安全極具威脅。從防守的角度,嗅探技術是基於網路的入侵檢測系統的最底層環節,是整個系統的數據來源。(通過設計並實現基於Windows環境下的網路嗅探器,掌握網路環境下的多線程編程,熟悉TCP,UDP等常用協議,全面認識網路嗅探技術,深入探討WinPcap包截獲系統和傳統的BSD包截獲之間的區別)。按照軟體工程的思想進行設計、實現和測試。對於該嗅探器的總體架構設計,我分了5個部分,分別是最底層的數據緩存和數據訪問、中間層的數據捕獲、協議分析、數據過濾和最頂層的圖形化用戶界面。實現達到界面將會顯示網路流量的去向,以及是什麼網路協議,顯示各欄位的具體含義是什麼,源IP地址和目標IP地址及埠號,傳送文件的具體類型等信息。使得該程序能夠較全面的分析出信息以供用戶參考決策。

㈨ 網路嗅探器的設計與實現 全代碼 最簡單的就行 最好用java 可以用的加分

主要原理是利用網卡的混雜模式,和乙太網自身的特點進行的。
java寫的話用 JPACAP

Jpcap是一個能夠抓取與發送網路數據包的Java組件。可以使用Jpcap從一個網路介面獲取數據包,然後在Java中對它們進行分析和顯示。同樣也可以通過一個網路介面發送任意數據包。Jpcap當前能夠 捕獲乙太網,IPv4,IPv6,ARP/RARP,TCP,UDP和ICMPv4數據包。
Jpcap實際上並非一個真正去實現對數據鏈路層的控制,而是一個中間件,Jpcap調用wincap/libcap,而給Java語言提供一個公共的介面,從而實現了平台無關性。在官方網站上聲明,Jpcap支持FreeBSD3.x,Linux RedHat6.1, Fedora Core4,Solaris,and Microsoft Windows 2000/XP等系統。
Jpcap的整個結構大體上跟wincap/libpcap是很相像的,例如NetworkInterface類對應wincap的 typedef struct_ADAPTER ADAPTER,getDeviceList()對應pcap_findalldevs()等等。
Jpcap主要的類有如下幾個:
1.NetworkInterface
該類的每一個實例代表一個網路設備,一般就是網卡。這個類只有一些數據成員,除了繼承自java.lang.Object的基本方法以外,沒有定義其它方法。
2.JpcapCaptor
該類提供了一系列靜態方法實現一些基本的功能。該類一個實例代表建立了一個與指定設備的鏈接,可以通過該類的實例來控制設備,例如設定網卡模式、設定過濾關鍵字等等。
3.JpcapSender
該類專門用於控制數據包的發送。
4.Packet
這個是所有其它數據包類的父類。Jpcap所支持的數據包有:
ARPPacket、DatalinkPacket、EthernetPacket、ICMPPacket、IPPacket、TCPPacket、UDPPacket。

㈩ 求一個C++或C編寫網路嗅探器的設計思路和代碼

Windows下面的
#include <vector>
#include <iostream>
#include <winsock2.h>
#include <mstcpip.h>

#pragma comment( lib, "ws2_32.lib" )

using namespace std;

struct IPHeader
{
unsigned char mHeaderLengthAndVersion;
unsigned char mTypeOfService;
unsigned short mTotalLength;
unsigned short mIdentifier;
unsigned short mFragment;
unsigned char mTTL;
unsigned char mProtocolType;
unsigned short mCheckSum;
unsigned int mSourceIP;
unsigned int mDestIP;

int getHeaderLength() const
{
return mHeaderLengthAndVersion & 0xf;
}
};

struct TCPHeader
{
unsigned short mSourcePort;
unsigned short mDestPort;
unsigned int mSequence;
unsigned int mAck;
unsigned char mLengthAndReserve;
unsigned char mFlags;
unsigned short mWindow;
unsigned short mCheckSum;
unsigned short mUrgent;
};

struct UDPHeader
{
unsigned short mSourcePort;
unsigned short mDestPort;
unsigned short mLength;
unsigned short mCheckSum;
};

struct ICMPHeader
{
unsigned char mType;
unsigned char mCode;
unsigned short mCheckSum;
unsigned short mID;
unsigned short mSequence;
unsigned long mTimeStamp;
};

void ProcessIPPacket( char*, int );
void ProcessTCPPacket( char*, int );
void ProcessUDPPacket( char*, int );

void main( )
{
WSADATA data;
WSAStartup( MAKEWORD( 2, 0 ), &data );

SOCKET rawSock = socket( AF_INET, SOCK_RAW, IPPROTO_IP );

char name[ 1024 ];
gethostname( name, sizeof( name ) );

hostent* ent = gethostbyname( name );

SOCKADDR_IN addr;
addr.sin_family = AF_INET;
addr.sin_port = htons( 8888 );
memcpy( &addr.sin_addr.S_un.S_addr, ent->h_addr_list[ 0 ], ent->h_length );

bind( rawSock, (PSOCKADDR)&addr, sizeof( addr ) );

DWORD mmy;
WSAIoctl( rawSock, SIO_RCVALL, &mmy, sizeof( mmy ), &mmy, sizeof( mmy ), &mmy, NULL , NULL );

for(;;)
{
vector<char> vc( 128 * 1024 );
ProcessIPPacket( &vc[0], recv( rawSock, &vc[0], (int)vc.size(), 0) );
}
}

void ProcessIPPacket( char* packet, int size )
{
IPHeader* header = (IPHeader*)packet;

if( header->mProtocolType == IPPROTO_TCP )
ProcessTCPPacket( packet + header->getHeaderLength(), size - header->getHeaderLength() );
else if( header->mProtocolType == IPPROTO_UDP )
ProcessUDPPacket( packet + header->getHeaderLength(), size - header->getHeaderLength() );
}

void ProcessTCPPacket( char* packet, int size )
{
TCPHeader* header = (TCPHeader*)packet;
cout<<"got tcp packet"<<endl;
}

void ProcessUDPPacket( char* packet, int size )
{
UDPHeader* header = (UDPHeader*)packet;
cout<<"got udp packet"<<endl;
}
應該不用寫其他的了吧,可以再加寫捕捉QQ聊天的信息的東西,自己加了挖:)