简易的sniffer程序
真的非常简易,这个程序不过抓一些发送到本机的数据包,然后显示出来它们的一些信息罢了。
程序很easy!
#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; //源port
WORD DestinationPort; //目的port
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; //源port
WORD DestinationPort; //目的port
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("源port :%d\n", ntohs(pTcpheader->SourcePort));
printf("目地ip地址 :%s\n", destIP);
printf("目的port :%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("源port :%d\n", ntohs(pUdpheader->SourcePort));
printf("目的IP地址 :%s\n", destIP);
printf("目的port :%d\n", ntohs(pUdpheader->DestinationPort));
printf("IP头部大小 :%d\n", (pIpheader->HeaderLength)* 4);
printf("UDP头部大小:%d\n", sizeof(UDPHeader));
Sleep(1000);//假设不休眠一下的话,速度会很的快!
pCount++;
} }/*while*/
system("pause");
}
简易的sniffer程序的更多相关文章
- 基于 libpcap库的sniffer程序
基于 libpcap库的sniffer程序 Libpcap库是WireSharek和Tcpdump抓包程序的基础,利用libcap我们自己也可以实现自己的抓包程序,在网络上实时抓包分析,或者利用处理的 ...
- simple-todo: 一个简易的 todo 程序 - django版
今天无意间看到 simple-todo: 一个简易的 todo 程序 - web.py 中文教程 ,然后发现竟然有好多的版本 http://simple-is-better.com/news/tag ...
- 如何用 Python 写一个简易的抽奖程序
不知道有多少人是被这个头图骗进来的:) 事情的起因是这样的,上周有同学问小编,看着小编的示例代码敲代码,感觉自己也会写了,如果不看的话,七七八八可能也写的出来,但是一旦自己独立写一段程序,感觉到无从下 ...
- jpcap 配置方法,问题解决,模拟sniffer程序。(附JAVA程序,jar,dll包等环境)
博文链接 http://www.cnblogs.com/xckk/p/4609444.html 一. Eclipse环境下安装与配置Jpcap 相关源程序.jpcap jar包,dll包,帮助文档 ...
- C语言 linux环境基于socket的简易即时通信程序
转载请注明出处:http://www.cnblogs.com/kevince/p/3891033.html ——By Kevince 最近在看linux网络编程相关,现学现卖,就写了一个简易 ...
- [计算机网络]简易http server程序
好久没输出了,知识还是要写下总结才能让思路更加清晰.最近在学习计算机网络相关的知识,来聊聊如何编写一个建议的HTTP服务器. 这个http server的实现源代码我放在了我的github上,有兴趣的 ...
- 一个简易的WebServer程序
现在这个公司的it管理真不知道说什么了,我主要从事.net方向的开发,公司电脑配置还是win7了,可是自己没有安装iis的权限,it也拒绝安装,想玩玩web安全都不行.于是乎决定开发一个window ...
- 任务02——安装 Intellj IDEA,编写一个简易四则运算小程序,并将代码提交到 GitHub
github地址:https://github.com/ErhuoHome/First.git 安装jdk与intellij idea没有太大问题,以前安装过eclipse 在程序方面,由于对真分数的 ...
- WCF 双向通讯实例-简易的聊天程序
源码下载 程序分四个部分: 1.原理 使用WCF的nettcp绑定.nettcp绑定类似原来的RPC,即.net remoting,只是在WCF提供统一协定,同一服务可以拥有多种客户端. 2.代码展示 ...
随机推荐
- BestCoder Round #50 (div.1) 1003 The mook jong (HDU OJ 5366) 规律递推
题目:Click here 题意:bestcoder 上面有中文题目 分析:令f[i]为最后一个木人桩摆放在i位置的方案,令s[i]为f[i]的前缀和.很容易就能想到f[i]=s[i-3]+1,s[i ...
- Ubuntu设置为命令行登录
root@ubuntu:~# vi /etc/default/grub 改: #GRUB_CMDLINE_LINUX_DEFAULT="quiet splash" GRUB_CMD ...
- 引入工程报包导入异常:import javax.servlet.annotation.WebFilter;
引入工程报包导入异常:import javax.servlet.annotation.WebFilter; (2013-02-21 16:38:00) 分类: java 今天上午导入了一个项目,用 ...
- (转)Free函数的参数一定要是malloc返回的那个指针
Free函数的参数一定要是malloc返回的那个指针 之前认为只要free的参数在malloc分配的区域之内就可以了, 现在发现不对的.在嵌入式里分配堆都是按照块来的,只要在这个块内系统就能识别, ...
- django-model-utils
一个普通例子: todos = Todo.objects.filter(owner=request.user).filter(is_done=False).filter(priority=1) 弊端: ...
- 基于visual Studio2013解决C语言竞赛题之0519最大值
题目
- oracle dg坏境主库redolog改动大小
--备库standby 主库四个redolog 曾经都是50M大小 SQL> alter database recover managed standby database cancel; ...
- Python笔记之基本的语法
1 变量和赋值 Python是动态类型语言,不须要预先声明变量的类型.变量的类型在赋值的那一刻被初始化. Python变量名是大写和小写敏感的,即"cAsE"与"CaSe ...
- android页面切换效果
两种方式: 在activity的自定义主题中定义切换方式: overridePendingTransition()方法 自定义主题: 在项目的res/values/styles.xml中添加样式 &l ...
- 【译】在ASP.NET中创建PDF-iTextSharp起步
原文 [译]在ASP.NET中创建PDF-iTextSharp起步 .Net framework 中自身并不包含可以和pdf打交道的方法.所以,当你需要你的ASP.Net Web应用程序中包含创建或与 ...