网络嗅探器

 // 网络嗅探器.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include <WinSock2.h>
#include <Windows.h>
#include <mstcpip.h>

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

class CInitSock
{
public:
	CInitSock(BYTE minorVer = 2, BYTE majorVer = 2)
	{
		// 初始化WS2_32.dll
		WSADATA wsaData;
		WORD sockVersion = MAKEWORD(minorVer, majorVer);
		if(::WSAStartup(sockVersion, &wsaData) != 0)
		{
			exit(0);
		}
	}
	~CInitSock()
	{
		::WSACleanup();
	}
};

CInitSock theSock;
#define ETHERTYPE_IP    0x0800
#define ETHERTYPE_ARP   0x0806

typedef struct _ETHeader         // 14字节的以太头
{
	UCHAR	dhost[6];			// 目的MAC地址destination mac address
	UCHAR	shost[6];			// 源MAC地址source mac address
	USHORT	type;				// 下层协议类型,如IP(ETHERTYPE_IP)、ARP(ETHERTYPE_ARP)等
} ETHeader, *PETHeader;

#define ARPHRD_ETHER 	1

// ARP协议opcodes
#define	ARPOP_REQUEST	1		// ARP 请求
#define	ARPOP_REPLY		2		// ARP 响应

typedef struct _ARPHeader		// 28字节的ARP头
{
	USHORT	hrd;				//	硬件地址空间,以太网中为ARPHRD_ETHER
	USHORT	eth_type;			//  以太网类型,ETHERTYPE_IP ??
	UCHAR	maclen;				//	MAC地址的长度,为6
	UCHAR	iplen;				//	IP地址的长度,为4
	USHORT	opcode;				//	操作代码,ARPOP_REQUEST为请求,ARPOP_REPLY为响应
	UCHAR	smac[6];			//	源MAC地址
	UCHAR	saddr[4];			//	源IP地址
	UCHAR	dmac[6];			//	目的MAC地址
	UCHAR	daddr[4];			//	目的IP地址
} ARPHeader, *PARPHeader;

// 协议
#define PROTO_ICMP    1
#define PROTO_IGMP    2
#define PROTO_TCP     6
#define PROTO_UDP     17

typedef struct _IPHeader		// 20字节的IP头
{
	UCHAR     iphVerLen;      // 版本号和头长度(各占4位)
	UCHAR     ipTOS;          // 服务类型
	USHORT    ipLength;       // 封包总长度,即整个IP报的长度
	USHORT    ipID;			  // 封包标识,惟一标识发送的每一个数据报
	USHORT    ipFlags;	      // 标志
	UCHAR     ipTTL;	      // 生存时间,就是TTL
	UCHAR     ipProtocol;     // 协议,可能是TCP、UDP、ICMP等
	USHORT    ipChecksum;     // 校验和
	ULONG     ipSource;       // 源IP地址
	ULONG     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头
{
	USHORT	sourcePort;			// 16位源端口号
	USHORT	destinationPort;	// 16位目的端口号
	ULONG	sequenceNumber;		// 32位序列号
	ULONG	acknowledgeNumber;	// 32位确认号
	UCHAR	dataoffset;			// 高4位表示数据偏移
	UCHAR	flags;				// 6位标志位
	//FIN - 0x01
	//SYN - 0x02
	//RST - 0x04
	//PUSH- 0x08
	//ACK- 0x10
	//URG- 0x20
	//ACE- 0x40
	//CWR- 0x80

	USHORT	windows;			// 16位窗口大小
	USHORT	checksum;			// 16位校验和
	USHORT	urgentPointer;		// 16位紧急数据偏移量
} TCPHeader, *PTCPHeader;

typedef struct _UDPHeader
{
	USHORT			sourcePort;		// 源端口号
	USHORT			destinationPort;// 目的端口号
	USHORT			len;			// 封包长度
	USHORT			checksum;		// 校验和
} UDPHeader, *PUDPHeader;

#pragma region 解析数据包
void DecodeTCPPacket(char *pData)
{
	TCPHeader *pTCPHdr = (TCPHeader *)pData;

	printf(" Port: %d -> %d \n", ntohs(pTCPHdr->sourcePort), ntohs(pTCPHdr->destinationPort));

	// 下面还可以根据目的端口号进一步解析应用层协议
	switch(::ntohs(pTCPHdr->destinationPort))
	{
	case 21:
#pragma region 解析密码
		char szBuffer[MAX_PATH];
		static char szUserName[21];
		static char szPassWord[21];

		if (strnicmp(pData,"USER",5) == 0)
		{
			sscanf(pData+4,"%*[]%s",szUserName);
		}
		else if (strnicmp(pData,"PASS",5) == 0)
		{
			sscanf(pData+4,"%*[]%s",szPassWord);
			wsprintf(szBuffer," User Name:%s\r\nPass Word: %s\r\n",szUserName,szPassWord);
		}
#pragma endregion 解析密码
		break;
	case 80:
	case 8080:
		break;
	}
}
#pragma endregion 解析数据包

#pragma region 检查封包的端口号
void DecodeIPPacket(char *pData)
{
	IPHeader *pIPHdr = (IPHeader*)pData;
	in_addr source, dest;
	char szSourceIp[32], szDestIp[32]; 

	printf("\n\n-------------------------------\n");

	// 从IP头中取出源IP地址和目的IP地址
	source.S_un.S_addr = pIPHdr->ipSource;
	dest.S_un.S_addr = pIPHdr->ipDestination;
	strcpy(szSourceIp, ::inet_ntoa(source));
	strcpy(szDestIp, ::inet_ntoa(dest));

	printf("	%s -> %s \n", szSourceIp, szDestIp);
	// IP头长度
	int nHeaderLen = (pIPHdr->iphVerLen & 0xf) * sizeof(ULONG);

	switch(pIPHdr->ipProtocol)
	{
	case IPPROTO_TCP: // TCP协议
		DecodeTCPPacket(pData + nHeaderLen);
		break;
	case IPPROTO_UDP:
		break;
	case IPPROTO_ICMP:
		break;
	}
}
#pragma endregion 检查封包的端口号
int _tmain(int argc, _TCHAR* argv[])
{

	// 创建原始套节字
	SOCKET sRaw = socket(AF_INET, SOCK_RAW, IPPROTO_IP);

	// 获取本地IP地址
	char szHostName[56];
	SOCKADDR_IN addr_in;
	struct  hostent *pHost;
	gethostname(szHostName, 56);
	if((pHost = gethostbyname((char*)szHostName)) == NULL)
		return 0;

	// 在调用ioctl之前,套节字必须绑定
	addr_in.sin_family  = AF_INET;
	addr_in.sin_port    = htons(0);
	memcpy(&addr_in.sin_addr.S_un.S_addr, pHost->h_addr_list[0], pHost->h_length);

	printf(" Binding to interface : %s \n", ::inet_ntoa(addr_in.sin_addr));
	if(bind(sRaw, (PSOCKADDR)&addr_in, sizeof(addr_in)) == SOCKET_ERROR)
		return 0;

	// 设置SIO_RCVALL控制代码,以便接收所有的IP包
	DWORD dwValue = 1;
	if(ioctlsocket(sRaw, SIO_RCVALL, &dwValue) != 0)	// SIO_RCVALL 网卡进入混杂模式
		return 0;

	// 开始接收封包
	char buff[1024];
	int nRet;
	while(TRUE)
	{
		nRet = recv(sRaw, buff, 1024, 0);
		if(nRet > 0)
		{
			DecodeIPPacket(buff);
		}
	}
	closesocket(sRaw);
	return 0;
}

  

时间: 2024-11-10 14:06:49

网络嗅探器的相关文章

C语言实现Linux网络嗅探器

C语言实现Linux网络嗅探器 0x01 实验简介 网络嗅探器是拦截通过网络接口流入和流出的数据的程序.所以,如果你正在浏览的互联网,嗅探器以数据包的形式抓到它并且显示.在本实验中,我们用 C 语言实现了一个网络嗅探器. 0x02程序框架和功能描述 本程序使用c语言编程,实现linux环境下网络嗅探的功能,并实现对接收到的UDP数据报进行解析. 0x03程序代码 sniffer.h #ifndef __SNIFFER_H__ #define __SNIFFER_H__ typedef struc

Python_sniffer(网络嗅探器)

import socket import threading import time activeDegree=dict() flag=1 def main(): global activeDegree global glag #获取本机IP地址 HOST=socket.gethostbyname(socket.gethostbyname()) #创建原始套接字,适用于Windows平台 #对于其他系统,要把socket.IPPROTO_IP替换为socket.IPPROTO_ICMP s=so

iOS RSA的网络安全模型、iOS签名机制总结(登录、token安全、签名)

摘要 最近公司准备做一个安全级别比较高的项目:技术总监给我们提出了一个这样子的需求:在http请求过程中,即使嗅探器捕获到网络请求的链接也无法去请求到数据.经过一番思考,觉得支付宝的签名完全符合这样子的需求.但是之前自己对签名.RSA等知识也是知道的很少,所以花了一番功夫学习了一下.本文将针对RSA登录和http请求作讲解,希望对大家有所帮助. 一.登录.登录保持(http请求) 登录机制 登录机制大概可以分为一下三个阶段: 1. 登录验证:是指客户端提供用户名和密码,向服务器提出登录请求,服务

六款主流免费网络嗅探软件wireshark,tcpdump,dsniff,Ettercap,NetStumbler

1.WireShark WireShark是一个开源免费的高性能网络协议分析软件,它的前身就是非常著名的网络分析软 件Ethereal.你可以使用它来解决网络疑难问题,进行网络协议分析,以及作为软件或通信协议的开发参考,同时也可以用来作为学习各种网络协议的教学 工具等等.WireShark支持现在已经出现了绝大多数的以太网网卡,以及主流的无线网卡. WireShark具有如下所示的特点: (1) 支持多种操作系统平台,可以运行于Windows.Linux.Mac OS X10.5.5.Solar

Linux网络流量监控与分析工具Ntop和Ntopng

Ntop工具 Ntop是一个功能强大的流量监控.端口监控.服务监控管理系统 能够实现高效地监控多台服务器网络 Ntop功能介绍 Ntop提供了命令行界面和web界面两种工作方式,通过web'界面,可以清晰展示网络的整体使用情况.网络中各主机的流量状态与排名.各主机占用的带宽以及各时段的流量明细.局域网内各主机的路由.端口使用情况等. Ntop是网络流量监控中的新秀,它是一种网络嗅探器,在运维中,可以使用Ntop检测网络数据传输.排除网络故障,分析网络流量判断网络上存在的各种问题.同时监控是否有黑

网络的基本概念TCP, UDP, 单播(Unicast), 多播(多播)(Multicast)

章相当低级,但相当重要! 我们周围一切差点儿都依赖于把事情抽象成低等级,并在某一点把它详细化,在一些设计概念中.接口层十分清晰而且目标非常集中,应用程序不用考虑操作系统怎样工作,操作系统也不用考虑硬件怎样工作,OSI模型的第4层不须要考虑第三层怎样工作.所以我们仅仅须要集中精力在某一层,就当以下的层正常工作,但这样能行吗?假设你写一个应用,你最好知道OS是怎么样工作的.而且要考虑数据库怎样存储字符的,相同.一个好的操作系统必须要了解硬件是怎样工作的.假设你觉得TCP不须要考虑IP的实现那就搞错了

用C++实现网络编程,抓取网络数据包的实现方法和介绍

做过网管或协议分析的人一般都熟悉sniffer这个工具,它可以捕捉流经本地网卡的所有数据包.抓取网络数据包进行分析有很多用处,如分析网络是否有网络病毒等异常数据,通信协议的分析(数据链路层协议.IP.UDP.TCP.甚至各种应用层协议),敏感数据的捕捉等.下面我们就来看看在windows下如何实现数据包的捕获. 下面先对网络嗅探器的原理做简单介绍. 嗅探器设计原理 嗅探器作为一种网络通讯程序,也是通过对网卡的编程来实现网络通讯的,对网卡的编程也是使用通常的套接字(socket)方式来进行.但是,

网络安全技术实验一

实验一  嗅探抓包 实验目标 l 掌握serv-u配置FTP. l 掌握基本的telnet使用方法. l 通过实验,掌握常用嗅探工具的安装与使用方法,理解TCP/IP协议栈中IP.TCP.UDP等协议的数据结构,了解FTP.HTTP等协议明文传输的特性,建立安全意识,防止此类协议传输明文造成的泄密. 实验学时:4 技术原理 l Serv-U 是当前众多的FTP服务器软件之一.通过使用Serv-US,用户能够将任何一台PC 设置成一个FTP 服务器,这样,用户或其他使用者就能够使用FTP 协议,通

Ubuntu 16.04安装基于nethogs衍生的网络监控软件(应用实时网速监控)

基于nethogs衍生的网络监控软件有如下所列举的: nettop显示数据包类型,按数据包的大小或数量排序. ettercap是以太网的网络嗅探器/拦截器/记录器 darkstat通过主机,协议等方式分解流量.用于分析在较长时间内收集的流量,而不是“实时”查看. iftop按服务和主机显示网络流量 ifstat以类似vmstat / iostat的方式通过界面显示网络流量 gnethogs基于GTK的GUI(在制品) nethogs-qt基于Qt的GUI hogwatch带有桌面/网络图形的带宽