简易的sniff程序

真的很简易,这个程序仅仅是抓一些发送到本机的数据包,然后显示出来它们的一些信息罢了!

     程序非常简单!

     

#include <WinSock2.h>
#include <windows.h>
#include <stdio.h>
#include <stdlib.h>
#pragma  comment(lib, "ws2_32.lib")	/*链接ws2_32.lib动态链接库*/
#define SIO_RCVALL _WSAIOW(IOC_VENDOR, 1)
const int MAX_ADDR_LEN = 16;		/*ip地址长度*/
const int MAX_HOSTNAME_LEN = 255;	/*主机名称*/

/*WORD 16位 DWORD 32位*/
struct IPHeader {
	BYTE HeaderLength : 4;       //首部长度
	BYTE Version : 4;            //版本
	BYTE DS;                     //区分服务
	WORD TotalLength;            //总长度
	WORD ID;                     //标识
	BYTE FragmentOffset0 : 5;    //片偏移
	BYTE MF : 1;                 //MF标识
	BYTE DF : 1;                 //DF标识
	BYTE Reserved : 1;           //保留标识
	BYTE FragmentOffset1;        //片偏移
	BYTE TTL;                    //生存时间
	BYTE Protocol;               //协议
	WORD Checksum;               //检验和
	DWORD SourceAddress;         //源地址
	DWORD DestinationAddress;    //目的地址
};

struct TCPHeader {
	WORD SourcePort;             //源端口
	WORD DestinationPort;        //目的端口
	DWORD SequenceNumber;        //序号
	DWORD AcknowledgmentNumber;  //确认号
	BYTE Reserved0 : 4;          //保留字段第一部分
	BYTE DataOffset : 4;         //数据偏移
	BYTE FIN : 1;                //FIN标识
	BYTE SYN : 1;                //SYN标识
	BYTE RST : 1;                //RST标识
	BYTE PSH : 1;                //PSH标识
	BYTE ACK : 1;                //ACK标识
	BYTE URG : 1;                //URG标识
	BYTE Reserved1 : 2;          //保留字段第二部分
	WORD Window;                 //窗口
	WORD Checksum;               //检验和
	WORD UrgentPointer;          //紧急指针
};

struct UDPHeader {
	WORD SourcePort;             //源端口
	WORD DestinationPort;        //目的端口
	WORD Length;                 //长度
	WORD Checksum;               //检验和
};

void main()
{
	SOCKET sock;
	WSADATA wsd;
	DWORD dwBytesRet;
	unsigned int optval = 1;
	int pCount = 0;

	sockaddr_in source, dest;

	char hostName[MAX_HOSTNAME_LEN];

	char sourceIP[MAX_ADDR_LEN]; /*记录源ip地址*/
	char destIP[MAX_ADDR_LEN];	/*记录目的ip地址*/
	char recvBuff[65535] = { 0 };

	WSAStartup(MAKEWORD(2, 1), &wsd); /*初始化*/
	hostent *pHostent;
	UDPHeader *pUdpheader;	/*UDP头部*/
	IPHeader *pIpheader;	/*IP头部*/
	TCPHeader *pTcpheader;	/*TCP头部*/

	if ((sock = socket(AF_INET, SOCK_RAW, IPPROTO_IP)) == SOCKET_ERROR)/*创建原始套接字*/
	{
		exit(-1);
	}

	gethostname(hostName, MAX_HOSTNAME_LEN);	//获取主机名称
	pHostent = gethostbyname(hostName);		//获取有关于本机信息的一个hostent结构体

	sockaddr_in sa;
	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)); /*绑定套接字*/

	if (WSAGetLastError() == 10013)
	{
		exit(1);
	}
	/************************************************************************/
	/* The WSAIoctl function controls the mode of a socket.
	*/
	/************************************************************************/
	/*这个函数主要用来设定一些参数,这里设定接收所有的数据包*/
	WSAIoctl(sock, SIO_RCVALL, &optval, sizeof(optval), NULL, 0, &dwBytesRet, NULL, NULL);

	pIpheader = (IPHeader *)recvBuff;

	while (pCount < 1000)
	{
		memset(recvBuff, 0, sizeof(recvBuff));
		recv(sock, recvBuff, sizeof(recvBuff), 0); /*接收数据包*/

		source.sin_addr.S_un.S_addr = pIpheader->SourceAddress; /*数据包源地址*/
		strncpy_s(sourceIP, inet_ntoa(source.sin_addr), MAX_ADDR_LEN);

		dest.sin_addr.S_un.S_addr = pIpheader->DestinationAddress; /*目的地址*/
		strncpy_s(destIP, inet_ntoa(dest.sin_addr), MAX_ADDR_LEN);

		if (pIpheader->Protocol == IPPROTO_TCP)  /*使用的是TCP协议*/
		{
			int dataLen;
			pTcpheader = (TCPHeader *)(recvBuff + sizeof(IPHeader));
			dataLen = (pIpheader->TotalLength -
				(pIpheader->HeaderLength * 4 + pTcpheader->DataOffset * 4));//tcp可能存在扩展

			if (dataLen == 0) break;
			printf("---------------------TCP---------------------\n");
			printf("数据包序号 : %d\n", pCount);
			printf("数据包大小 : %d\n", dataLen);
			printf("源IP地址   :%s\n", sourceIP);
			/*ntohs(s表示short)即将16位的数从网络(network)字节序转换为主机(host)字节序*/
			/*同理,ntohl(l表示long)即将32位的数从网络(network)字节序转换为主机(host)字节序*/
			printf("源端口     :%d\n", ntohs(pTcpheader->SourcePort));
			printf("目地ip地址 :%s\n", destIP);
			printf("目的端口   :%d\n", ntohs(pTcpheader->DestinationPort));
			printf(" IP头部大小:%d\n", pIpheader->HeaderLength * 4);
			printf("TCP头部大小:%d\n", (pTcpheader->DataOffset) * 4);
			Sleep(1000);/*如果不休眠一下的话,速度会非常的快!*/
			pCount++;
		}

		if (pIpheader->Protocol == IPPROTO_UDP) //数据包使用UDP
		{
			pUdpheader = (UDPHeader *)(recvBuff + sizeof(IPHeader));
			int dataLen;
			dataLen = (pIpheader->TotalLength -
				(pIpheader->HeaderLength * 4 + sizeof(UDPHeader)));//udp首部并没有扩展
			if (dataLen == 0) break;
			printf("---------------------UDP--------------------\n");
			printf("数据包序号 : %d\n", pCount);
			printf("数据包大小 : %d\n", dataLen);

			printf("源IP地址   :%s\n", sourceIP);
			printf("源端口     :%d\n", ntohs(pUdpheader->SourcePort));
			printf("目的IP地址 :%s\n", destIP);
			printf("目的端口   :%d\n", ntohs(pUdpheader->DestinationPort));
			printf("IP头部大小 :%d\n", (pIpheader->HeaderLength)* 4);
			printf("UDP头部大小:%d\n", sizeof(UDPHeader));
			Sleep(1000);//如果不休眠一下的话,速度会非常的快!
			pCount++;
		}

	}/*while*/
	system("pause");
}

简易的sniff程序

时间: 2024-10-09 03:31:52

简易的sniff程序的相关文章

C语言 linux环境基于socket的简易即时通信程序

转载请注明出处:http://www.cnblogs.com/kevince/p/3891033.html   By Kevince 最近在看linux网络编程相关,现学现卖,就写了一个简易的C/S即时通信程序,代码如下: head.h 1 /*头文件,client和server编译时都需要使用*/ 2 #include <unistd.h> 3 #include <stdio.h> 4 #include <sys/types.h> 5 #include <sys

简易的记事本程序

利用GUI和IO流做的简易的记事本程序 import java.awt.BorderLayout; import java.awt.EventQueue; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.io.BufferedReader; import java.io.FileNotFoundException; import java.io.FileReader; imp

利用map的特性做一个简易的投票程序

pair 1. 概念:pair是 一种模版类型,每个pair 可以存储两个值,这两种值的类型无限制.也可以将自己写的struct类型的的对象放进去. 2. 用法: pair<int ,int >p (1,2); pair<int ,int > p1= make_pair(1,2); 3. 编写程序读入一系列string和int型数据,将每一组存储在一个pair对象中,然后将这些pair对象存储在vector容器并显示 #include<iostream> #includ

如何用 Python 写一个简易的抽奖程序

不知道有多少人是被这个头图骗进来的:) 事情的起因是这样的,上周有同学问小编,看着小编的示例代码敲代码,感觉自己也会写了,如果不看的话,七七八八可能也写的出来,但是一旦自己独立写一段程序,感觉到无从下手. 其实这个很正常,刚开始学习写代码,都是跟着别人的套路往下写,看的套路少,很难形成自己的套路,这就和做数学题是一样的,做一道题就想会所有的题目,这个可能性微乎其微,都是通过大量的练习来摸索到自己的套路. 正好快过年了,各个公司都会搞一些抽奖活动,小编今天就来聊一下,如果要写一个简单的抽奖程序,小

任务02——安装 Intellj IDEA,编写一个简易四则运算小程序,并将代码提交到 GitHub

GITHUB:  https://github.com/lalacllla 代码(不完善): https://github.com/lalacllla/CALTMP/blob/master/src/caltmp.java 1.Intellj IDEA的安装和项目的新建并没有什么困难,个人认为Intellj IDEA相对于ECLIPSE更容易上手,界面更加简洁. 2.初步了解Git以及Github的使用,如何简单的创建一个repository,如何上传自己的代码. 3.代码部分还是有比较多的问题需

一个简易的日志程序

在程序开发过程中,我们经常要记录各种操作信息以及系统信息到日志中,以便于以后查找相关记录或者在遇到程序出现错误时查找错误的原因.一般日志存储于两种介质中:一.存储入数据库,另一种存储于文本文档中.我们最常用的插件有log4.net等.但是对我们日常的小程序来说,它可能过重,所以我自己在自己的开发中写了一个简单的小程序以适应小程序的需要. 为方便自己以后查找,记录代码如下: 1 using System; 2 using System.Collections.Generic; 3 using Sy

简易的词法分析程序

#include <stdio.h> #include <string.h> char prog[666],token[8],ch; int syn,p,m,n,sum; char *rwtab[6]={"begin","if","then","while","do","end"}; scaner(); main() { p=0; printf("\n

简易聊天客户端程序

import java.io.*; import javax.swing.*; import java.net.*; import java.awt.*; import java.awt.event.*; public class simpleChatClientA { JTextArea incoming; BufferedReader reader; Socket sock; JTextField outgoing; PrintWriter writer; //build the inter

任务2--安装Intellj IDEA,编写一个简易四则运算小程序,并将代码提交到GitHub

我的GitHub地址为:https://github.com/Orangeyc123 首先呢,我并没有完整的完成任务,我觉得主要问题有以下几个 1.由于之前都没有听说过intellj IDEA这个软件,安装的时候就碰到了好多问题.对于我这个人来说呢,有一点很大的毛病就是对于从来没见过不知道的东西有一种畏惧心理.怕自己装的不对,怕自己有哪一个步骤和别人不一样而产生不同的结果. 比如 之前一直没有遇到过这种情况,显然有些不知所措,不过还好,问了学长以后我想以后出现这种问题应该so easy. 下载并