体育资讯网为您提供各类: 体育资讯2017最新体育资讯 大品牌游戏 希望您能喜欢!

您现在的位置: 主页 > 知性 > 文章内容

简单的网络嗅探器 - github_38237196的博客

频道标签:网络整理 发布时间:2019-07-09 录入:admin 点击:
ad

网络车的四种任务铅字
①播送铅字:在此铅字下,网卡可以在网络中接纳播送通讯。;
(2)组播铅字:在此铅字下设置的网卡可以接纳多播最高纪录;
(3)直觉的模子:在此铅字下,独自地宾格的网卡才干接纳最高纪录;
(4)混合模子:在此铅字下的网卡可以接纳每件东西通道它的最高纪录,最高纪录即使传送给我

嗅探器规律:
作为网络传染:扩散按次的嗅探器,通道对网卡举行训练,实现预期的结果了网络传染:扩散。,网卡训练也应用经用的套接字办法填写。。另一方面,通常的套接字按次要做错解答与本身武器装备地址相婚配的或是以播送产生收回的最高纪录帧,到对立面产生的最高纪录帧,比如那个已抵达网络的最高纪录帧,在使有法律效力传送即使添加后,网络代言人将不解答,更确切地说,应用按次无法搜集传入的最高纪录包。而网络嗅探器的宾格的刚才符合从网卡接纳有通道它的最高纪录包,这些包可以发送到它或对立面地方。。显然,为了实现就是很宾格的,网卡不克不及再正规军任务,必然要将其设置为混合铅字。。
假设的于训练实现预期的结果,这种对网卡搀杂铅字的设置是通道原始套接字(rawsocket)来实现预期的结果的,这也在确切的经用的最高纪录流套接字和最高纪录报。在创立原始重击较晚地,IP头运算选择能力必要通道setsockopt()功用设置,过后通道绑定将原始套接字绑定到住处附近的当地酒店网卡。结果原始套接字接待有最高纪录,您还必要通道ioctlsocket设置它,还可以选定的即使亲自处置IP头。到这程度,事实上的,您可以开端嗅探网络最高纪录包。,对最高纪录包的获取仍象流式套接字或最高纪录报套接字那么通道recv()重大聚会来填写。但与对立面两个插座确切的,,此刻原始套接字捕获量的最高纪录包非但仅是P,相反,它包孕IP头、TCP头最原始的最高纪录通讯,当通讯通道。通道对原始最高纪录的剖析,可以接到稍微参与网络的通讯。。因这些最高纪录打包在网络层和去除层中,这么,使负债务依最高纪录包的增加对其举行剖析。。

法典详细通讯
率先创立原始重击,将原始套接字绑定到假设的的住处附近的当地酒店地址(做错addr_any),过后通道ioctlsocket()重大聚会(这是把持的铅字,向socke发送sio rcvall把持命令,将网卡设置为混合铅字,这容许您接纳通道网络的有最高纪录包。;过后已衔接的最高纪录报或流式套代言人通道不息使调动recv()重大聚会来接纳IP最高纪录包,将接纳到的最高纪录贮存器在把缓冲液加入排列中;随后再通道自精确地解释的IP最高纪录包解析重大聚会扶垛纳到的最高纪录举行解析,通道def的方针情人从接纳到的最高纪录中获取最高纪录包的IP头;过后从IP HE中滴下源IP地址和宾格的IP地址。
在这里插入图片描述

IP
在这里插入图片描述

TCP
在这里插入图片描述

注重次序,为什么可以直觉的正点叫来
在这里插入图片描述
因正精确地解释IP 在tcp heade中应用unigned short/long/char/… 它们的浆糊是正规军的。,很在使调动的时分可以直觉的使调动属性,而做错写对立面来回办法;

/* 
精确地解释合同书体式
精确地解释合同书中应用的宏
*/

#ifndef __PROTOINFO_H__ 
#define __PROTOINFO_H__ 
#define ETHERTYPE_IP    0x0800 

// 合同书 
typedef struct _IPHeader        // 20八位位组IP头 
{ 
	unsigned char     iphVerLen;      // 版本号和给加说明文字浆糊(每个4位 
	unsigned char    ipTOS;          // 上菜用具典型  
	unsigned short    ipLength;       // 包装总浆糊,更确切地说,完全的IP音讯的浆糊 
	unsigned short    ipID;           // 最高纪录包特性,不料特性发送的每个最高纪录报 
	unsigned short    ipFlags;        // 表现 
	unsigned char     ipTTL;          // 生活工夫,是TTL。 
	unsigned char    ipProtocol;     // 合同书,能够是TCP、UDP、ICMP等 
	unsigned short    ipChecksum;     // 标准酒精度和 
	unsigned long     ipSource;       // 源IP地址 
	unsigned long     ipDestination;  // 宾格的IP地址 
} IPHeader, *PIPHeader;
 

// 精确地解释TCP表现 
#define   TCP_FIN   0x01
#define   TCP_SYN   0x02
#define   TCP_RST   0x04
#define   TCP_PSH   0x08
#define   TCP_ACK   0x10
#define   TCP_URG   0x20
#define   TCP_ACE   0x40
#define   TCP_CWR   0x80 

typedef struct _TCPHeader       // 20八位位组TCP头
{
	unsigned short  sourcePort;         // 16位源左舷号
	unsigned short  宾格的港    // 16位宾格的左舷号
	unsigned long   sequenceNumber;     // 32位序列号
	unsigned long   acknowledgeNumber;  // 32位鉴定号
	unsigned char   dataoffset;         // 高4位表现最高纪录去除
	unsigned char   flags;              // 6位制表
	unsigned short  windows;            // 16位窗口变得越来越大
	unsigned short  checksum;           // 16位标准酒精度和
	unsigned short  urgentPointer;      // 16位紧要最高纪录偏移 
} TCPHeader, *PTCPHeader;

typedef struct _UDPHeader
{
	unsigned short          sourcePort;     // 源左舷号     
	unsigned short          宾格的港// 宾格的左舷号      
	unsigned short          len;            // 封包浆糊
	unsigned short          checksum;       // 标准酒精度和
} UDPHeader, *PUDPHeader;

#endif  // __PROTOINFO_H#pragma once 

此功用是必须的。,朕思索将其添加到。cpp档案,像先前的插座,但缺席。,就我独特的关于,据我的观点这是原始插座的使遭受。


#include  
#pragma 正文(lib, "")  // 连锁到库档案 

class CInitSock { 
public:

	CInitSock(BYTE minorVer = 2, BYTE majorVer = 2) { 
		// 设定初值WS2_32.dll 
		WSADATA wsaData; 
		WORD sockVersion = MAKEWORD(minorVer, majorVer);            Winsock版本

使调动应用按次打中无论哪些Winsock API重大聚会,率先要做的是通道wsastartup重大聚会填写对 Winsock上菜用具设定初值,因而你必要使调动wsastartup重大聚会。
应用Socket的按次在应用Socket先于必然要使调动WSAStartup重大聚会。
重大聚会的第任何人限制因素选定的,执政的高位八位位组表现子版本、低八位位组表现钥匙孔板本;运算体系应用次货个限制因素来回版本通讯。当应用按次使调动wsastartup重大聚会时,
运算体系依,过后将找到的套接字库绑定到应用按次。以来应用按次就可以使调动所恳求的Socket库打中其它Socket重大聚会了。*/
		if (::WSAStartup(sockVersion, &wsaData) != 0) {       (Windows异步套接字启动命令)填充物套接字库 
放弃(0) 
		} 
	} 
	~CInitSock() { //析构重大聚会 
		::WSACleanup();         堵塞已填充物的套接字库 
	}
};

#include ""
#include "" 
//#include 
#include     用于处置TCP/IP合同书的头档案,面包包孕系列节目Winsockets相干功用
#include
//#include
#include 
#pragma 正文(lib, "")    连锁库档案
#pragma 正文(lib,"")
using namespace std;

//CInitSock theSock;      创立CInitsock clas的情人  
						//自精确地解释的重大聚会,用于解析接纳到的TCP最高纪录包,解析packe打中tcp头

void DecodeTCPPacket(char PData) { 
	
	TCPHeader *pTCPHdr = (TCPHeader PData公司
ntohs()是重大聚会名,功用是从网络八位位组按次替换16位八位位组序列

	cout<<" Port:"<sourcePort)<<" -> "<宾格的港)<宾格的港)) {
	case 21: //FTP
		break;
	case 80: //网页 
	case 8080: //WWW代劳上菜用具  
		break; 
	}
}

void DecodeUDPPacket(char PData)
{
	UDPHeader *pUDPHdr = (UDPHeader PData公司
ntohs()是重大聚会名,功用是从网络八位位组按次替换16位八位位组序列
	cout << " Port:" << ntohs(pUDPHdr->sourcePort) << " -> " << ntohs(pUDPHdr->宾格的港) << endl;
}

/*
自精确地解释的重大聚会,用于解析收到的IP最高纪录封包,解析出封包打中IP头
*/

void DecodeIPPacket(char PData) {
	IPHeader *pIPHdr = (IPHeaderPData公司
	in_addr source, dest;       //in_addr是任何人框架体,可以用来表现任何人32位的IPv4地址
	char szSourceIp[32], szDestIp[32];      // 精确地解释两个数组用于贮存器源IP地址和宾格的IP地址

	cout<<"*************************************************************************"<ipSource;      // 从IP头中裁剪源IP地址
	dest.S_un.S_addr = pIPHdr->ipDestination;       // 从IP头中裁剪宾格的IP地址
	strcpy(szSourceIp, ::inet_ntoa(source));
	strcpy(szDestIp, ::inet_ntoa(dest));

	cout< "<iphVerLen<ipTOS << endl;
	cout << "包装总浆糊:" << pIPHdr->ipLength << endl;
	cout << "最高纪录包特性:" << pIPHdr->ipID << endl;
	cout << "生活工夫:" << (int)pIPHdr->ipTTL << endl;
	cout << "合同书典型:" <<(int) pIPHdr->ipProtocol << endl;
	cout << "标准酒精度和:" << pIPHdr->ipChecksum << endl;					// IP头浆糊
	int nHeaderLen = (pIPHdr->iphVerLen & 0xf) * sizeof(ULONG);

	switch (pIPHdr->ipProtocol) 
	{
	case IPPROTO_TCP: // TCP合同书
		DecodeTCPPacket(pData + nHeaderLen);
		break;

	case IPPROTO_UDP:
		DecodeUDPPacket(pData + nHeaderLen);
		break;

	case IPPROTO_ICMP:
		break;
	}
}  

int main() {
	// 创立原始的socket word sra
	WSADATA wsaData;//WSADATA框架被用来抚养重大聚会WSAStartup来回的Windows 套接字设定初值通讯
	if (wsa启动(makeword(2, 2), &wsaData) != 0) 正填充物套接字库
	{
printf(倒闭 to load 温斯托克)
		return 0;
	}
	SOCKET sRaw = socket(AF_INET, SOCK_RAW, ipproto_ip;//必然要在管理员铅字下运转
	if (SRAW) == SOCKET_ERROR) {
printf(未能创立套接字:%d, WSAGetLastError());
	}

	// 获取住处附近的当地酒店IP地址
	char szHostName[56];
	SOCKADDR_IN addr_in;
	struct  hostent *pHost; //hostent是host 条宾格的缩写,此框架记载优秀的通讯,包孕优秀的名、别号、地址典型、地址浆糊和地址列表
	gethostname(szHostName, 56);

	if (磷 = gethostbyname((char*)szHostName)) == 空)
		cout << "get failed";

	// 在使调动ioctl先于,套节字必然要绑定
	addr_in.sin_family = AF_INET;
	addr_in.sin_port = htons(7000);
	//.S_un.S_addr = inet_addr(" "); 
	memcpy(&.S_un.S_addr, pHost->h_addr_list[0], pHost->h_length);
	cout<<" Binding to interface :"< 0) {
			DecodeIPPacket(buff);       使调动此重大聚会剖析IP包
		}

	}
	int a;
体系(分离)。
	cin >> a;
	closesocket(SRAW));          堵塞证明是的插座

	return 0;

}

下一篇:没有了