资源简介
有C++编写的,网络抓包程序,将本机网卡至于混杂模式,可分析的数据包有UDP,TCP,以及IP包
代码片段和文件信息
#include “HdFuns.h“
#include
#include
#include “DataStruct.h“
void AnalyzeIpPackets(char *buff)
{
PIPHEADER pIphdr = (PIPHEADER)buff;
in_addr source dest;//源地址和目的地址
char szSourceIp[32] szDestIp[32];
printf(“\n-----------------------------------\n“);
source.S_un.S_addr = pIphdr->ipSourceAdd;//源IP
dest.S_un.S_addr = pIphdr->ipDestination;//目的IP
::strcpy(szSourceIp ::inet_ntoa(source));
::strcpy(szDestIp ::inet_ntoa(dest));
printf(“Soure IP:%s\n“szSourceIp);
printf(“Destination IP:%s\n“szDestIp);
//IP头长度
int nIpHeaderLen = (pIphdr->ipVersion & 0xf) * sizeof(ULONG);
switch(pIphdr->ipProtocol)
{
case IPPROTO_TCP://TCP
AnalyzeTcpPackets(buff + nIpHeaderLen);
break;
case IPPROTO_UDP://UDP
AnalyzeUdpPackets(buff + nIpHeaderLen);
break;
case IPPROTO_ICMP:
break;
}
}
void AnalyzeTcpPackets(char *buff)
{
PTCPHEADER pTcpHdr = (PTCPHEADER)buff;
printf(“Protocol:TCP\n“);
//输出端口号
printf(“Source Port:%d\n“::ntohs(pTcpHdr->sourcePort));
printf(“Destination Port:%d\n“::ntohs(pTcpHdr->destPort));
::memset(szText ‘ ‘ nRet);
int dataLen = nRet - sizeof(IPHEADER) - sizeof(TCPHEADER);//计算数据的长度
::memcpy(szText &buff[sizeof(TCPHEADER)] dataLen);//将数据包中的数据拷贝到缓冲区中
for (int i = 0; i < dataLen; i++)
{
//按字节分析数据
if (szText[i] < 0 )
{
szText[i] = -szText[i];
}
printf(“%X “ szText[i]);
}
switch(::ntohs(pTcpHdr->destPort))
{
case 21:
break;
case 80:
case 8080:
break;
}
}
void AnalyzeUdpPackets(char *buff)
{
printf(“Protocol:UDP\n“);
PUDPHEADER pUdpHdr = (PUDPHEADER)buff;
printf(“Source Port:%d\n“::ntohs(pUdpHdr->sourcePort));
printf(“Source Port:%d\n“::ntohs(pUdpHdr->destinationPort));
::memset(szText ‘ ‘ nRet);//清空缓冲区
int dataLen =nRet - sizeof(UDPHEADER) - sizeof(IPHEADER);
::memcpy(szText buff + sizeof(UDPHEADER) dataLen);
for (int i = 0; i < dataLen; i++)
{
if (szText[i] < 0 )
{
szText[i] = -szText[i];
}
printf(“%X “ szText[i]);
}
}
//主函数内容
#include “InitSocket.h“
#include
#include “HdFuns.h“
#include
using namespace std;
CInitSocket initSock;
int nRet;
int main(void)
{
SOCKET sRaw = ::socket(AF_INET SOCK_RAW IPPROTO_IP);//原始套接字
char szHostName[56];//主机名
SOCKADDR_IN localAddr;//本地地址
struct hostent *pHost;
::gethostname(szHostName 56);//获取主机名
if ((pHost = ::gethostbyname((char*)szHostName)) == NULL)
{
return 0;
}
localAddr.sin_family = AF_INET;
localAddr.sin_port = ::htons(0);
::memcpy(&localAddr.sin_addr.S_un.S_addr pHost->h_addr_list[0] pHost->h_length);
cout<<“Bind to interface :“<<::inet_ntoa(localAddr.sin_addr)< if (::bind(sRaw (PSOCKADDR)&localAddr sizeof(localAddr)) == SOCKET_ERROR)
{
return 0;
}
DWORD dwValue = 1;
if (::ioctlsocket(sRaw SIO_RCVALL &dwValue) != 0)//设置网卡为混杂模式
{
return 0;
}
char buff[1024];
while(true)
{
nRet = ::recv(sRaw buff 1024 0);/
属性 大小 日期 时间 名称
----------- --------- ---------- ----- ----
文件 3247 2009-04-22 15:21 Sniffer\1.cpp
文件 3341 2009-04-22 15:06 Sniffer\1.dsp
文件 510 2009-04-22 15:22 Sniffer\1.dsw
文件 33792 2009-04-22 15:22 Sniffer\1.ncb
文件 48640 2009-04-22 15:22 Sniffer\1.opt
文件 1079 2009-04-22 15:21 Sniffer\1.plg
文件 1312 2009-04-22 14:44 Sniffer\DataStruct.h
文件 380844 2009-04-22 15:21 Sniffer\Debug\1.ilk
文件 57089 2009-04-22 15:21 Sniffer\Debug\1.obj
文件 3643536 2009-04-22 15:06 Sniffer\Debug\1.pch
文件 590848 2009-04-22 15:21 Sniffer\Debug\1.pdb
文件 249898 2009-04-22 15:21 Sniffer\Debug\Sniffer.exe
文件 197632 2009-04-22 15:21 Sniffer\Debug\vc60.idb
文件 135168 2009-04-22 15:21 Sniffer\Debug\vc60.pdb
文件 250 2009-04-22 14:46 Sniffer\HdFuns.h
文件 580 2009-04-22 14:45 Sniffer\InitSocket.h
目录 0 2009-04-22 19:26 Sniffer\Debug
目录 0 2009-04-22 15:22 Sniffer
----------- --------- ---------- ----- ----
5347766 18
- 上一篇:C++版的rinex文件读取源代码
- 下一篇:欧拉法求解微分方程组
评论
共有 条评论