高手请进:怎么样解析固定端口上收发的数据包中的内容(在线等)

原创 2004年07月18日 17:47:00

怎么样解析固定端口上收发的数据包中的内容??

我是利用Sniffer的原理,监测所有收发的数据包,然后去掉相关的头部,得到包中的数据.将其转化为字符串类型.

我在机器上装了个邮件服务器,试着检测在25端口和110端口上的数据包.我认为可以把 user ,pass, mail from, rcpt to等命令相关的数据解析出来.可我试了好久,都没有结果.

当我从局域网中别的机子拷个 .txt文件 或者 向别的机子拷个 txt文件时,文件肯定是被打成几个包发送,但第一个包(文件最前面的一部分数据)是监测到了,而且大小都正确,但解析出的字符串却是空串,后面的几个包完全正确.

这个问题让我郁闷了好久,烦请大家帮我解决一下.

使用的代码如下:

 SOCKET        sock;
 WSADATA       wsd;//wsd为指向WSADATA结构的指针
 DWORD  dwBytesRet;
 int pCount=0;
 unsigned int  optval = 1;
 unsigned char *datatcp=NULL;
 unsigned char *dataudp=NULL;
 int lentcp=0, lenudp;

 WSAStartup(MAKEWORD(2,1),&wsd);//初始化WINSOCK
 if((sock=socket(AF_INET,SOCK_RAW,IPPROTO_IP))==SOCKET_ERROR)// 创建原始套接字
  exit(1);

 char FAR name[MAX_HOSTNAME_LAN];
 gethostname(name, MAX_HOSTNAME_LAN);//获取本机名

 struct hostent FAR * pHostent;
 pHostent = (struct hostent * )malloc(sizeof(struct hostent));
 pHostent = gethostbyname(name);//获取给定主机名的IP地址

 SOCKADDR_IN sa;
 sa.sin_family = AF_INET;//填充SOCKADDR_IN结构
 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);

 WSAIoctl(sock, SIO_RCVALL, &optval, sizeof(optval), NULL, 0, &dwBytesRet, NULL, NULL);

 struct udphdr *pUdpheader;
 struct ipheader *pIpheader;
 struct tcpheader *pTcpheader;
 char szSourceIP[MAX_ADDR_LEN], szDestIP[MAX_ADDR_LEN];
 SOCKADDR_IN saSource, saDest;

 

 while(1)
 {
  char RecvBuf[65535] = {0};
  
  pIpheader=(struct ipheader *)RecvBuf;//pIpheader指向IP包头部
  pTcpheader=(struct tcpheader *)(RecvBuf+sizeof(struct ipheader));//pTcpheader指向TCP包头部
  pUdpheader=(struct udphdr *)(RecvBuf+sizeof(struct ipheader));//pUdpheader指向UDP包头部

  memset(RecvBuf, 0, sizeof(RecvBuf));

  recv(sock, RecvBuf, sizeof(RecvBuf), 0);//从套接字接收数据

  saSource.sin_addr.s_addr = pIpheader->ip_src;//信源端口
  strncpy(szSourceIP, inet_ntoa(saSource.sin_addr), MAX_ADDR_LEN);//szSourceIP中放的是数据的信源IP地址,用点分

十进制表示

  saDest.sin_addr.s_addr = pIpheader->ip_dst;//信宿端口
  strncpy(szDestIP, inet_ntoa(saDest.sin_addr), MAX_ADDR_LEN);//szDestIP中放的是数据的信宿IP地址,用点分十进制

表示

  lentcp =(ntohs(pIpheader->ip_len)-(sizeof(struct ipheader)+sizeof(struct tcpheader)));//TCP数据包长度=IP包总

长度-IP头长度-TCP头长度 
  lenudp =(ntohs(pIpheader->ip_len)-(sizeof(struct ipheader)+sizeof(struct udphdr)));//UCP数据包长度=IP包总长

度-IP头长度-UDP头长度 

  if((pIpheader->ip_p)==IPPROTO_TCP&&lentcp!=0)//若这个数据包采用的是TCP协议
  {
 
   pCount++; 
   datatcp=(unsigned char *)RecvBuf+sizeof(struct ipheader)+sizeof(struct tcpheader);

   CString temp="";
   CString sourceIp(szDestIP);
   CString destIP(szSourceIP);

   int destPort = ntohs(pTcpheader->dport);
   int sourcePort = ntohs(pTcpheader->sport);
   temp.Format("%d",destPort);

   CString s;
   s.Format("%d", sourcePort);
 
   MessageBox("协议:TCP /nIP源地址:"+sourceIp + "  源端口:"+s + "/n目的地址:" + destIP +"目的端口:"

+temp);


     temp.Format("%d",lentcp);
   MessageBox("tcp包的长度:"+temp);


   CString data="";
   for(int i=0;i<lentcp;i++)
   {
    temp = (CString)(*(char*)(datatcp+i));
    data.Append(temp);
   }
  
   CString ss(data);
   MessageBox(data);

  if( (pIpheader->ip_p)==IPPROTO_UDP&&lentcp!=0)
  {
   //pCount++; 
   //dataudp=(unsigned char *) RecvBuf+sizeof(struct ipheader)+sizeof(struct udphdr);
   //printf("-UDP-/n");
   //printf("/nDestination address->%s/n",szDestIP);
   //printf("/nDestination port->%d/n",ntohs(pTcpheader->dport));
   //printf("dataudp address->%x/n",dataudp);
   //printf("size of ipheader->%i/n",sizeof(struct ipheader));
   //printf("size of udpheader->%i/n",sizeof(struct udphdr));
   //printf("size of the hole packet->%i/n",ntohs(pIpheader->ip_len));
   //printf("/nchar Packet%i []=/"",pCount,lenudp);
   //for (int x=0;x<lenudp;x++)
   //{
   // printf("//x%.2x",*(dataudp+x));
   // if (x%10==0)
   // {      
   //  printf("/"");
   //  printf("/n/"");
   // }
   //}
   //printf("/";/n/n/n");
   //for (int x2=0;x2<lenudp;x2++)
   //{
   // if( *(dataudp+x2)<=127&&*(dataudp+x2)>=0)
   //  printf("%c",*(dataudp+x2));
   // else
   //  printf(".");
   //}
   //printf("/n/n");
   //printf("*******************************************/n");
  }
 }
  

SSL与ActiveX

来源:http://www.ccw.com.cn/cio/research/info/htm2005/20050620_060ZT.asp               我们认为,SSL VPN网关对应...
  • bluesky_521
  • bluesky_521
  • 2005年06月26日 22:56
  • 762

高手请进在线等待

因此某笔被全网广播以后请给出思想什么是命令行,进行Kmeans聚类当 m 近似 1 时.又了解金融的多方面人才root right = helperarray, m1, end,local.norma...
  • zhiboxu9716
  • zhiboxu9716
  • 2017年01月26日 17:31
  • 52

基于UDP的数据包收发程序(C#语言描述)

题目 摘要: 1)按照UDP协议数据包发送方式实现用户端之间的通信。 2)统计包的发送和接收数,计算数据包的丢失数。 3)设计美观易用的图形界面。   关键字:      UDP协议、数据包、通信、图...
  • u012677972
  • u012677972
  • 2015年07月03日 10:21
  • 975

应用Wireshark抓取HTTP数据包并分析包内内容

打开Wireshark,选择无线网络连接接口,并在Capture Options的设置中设置Capture Filter为host 加上所要访问的主机的IP地址,这里我选择了host 106.187....
  • hsz_zl
  • hsz_zl
  • 2015年08月14日 22:45
  • 7128

集线器端口上的电涌如何解决

打开系统属性-硬件-设备管理-通用串行总线控制器,在下面所列的前几个比较长的项逐项右击,点击属性,在高级标签下,检查在最后一行”不要通知我USB错误(D)”前的方框是否打上勾,如没有打勾,打上即可!以...
  • lemonhere
  • lemonhere
  • 2014年02月12日 16:58
  • 91

openVswitch(OVS)源代码分析之工作流程(收发数据包)

加载网卡时把网卡绑定到openVswitch端口上(ovs-vsctl add-port br0 eth0),绑定后每当有数据包过来时,都会调用该函数,把数据包传送给这个函数去处理。而不是像开始那样(...
  • YuZhiHui_No1
  • YuZhiHui_No1
  • 2014年09月16日 22:52
  • 8541

高手请进-----

‘\r’  这个转义字符到底怎么用哦?? 那位大侠可以告诉我啊
  • wangtaotao618
  • wangtaotao618
  • 2012年11月13日 22:18
  • 121

python解析发往本机的数据包示例 (解析数据包)

tcp.py # -*- coding: cp936 -*- import socket from struct import * from time import ctime,sleep from ...
  • liweiminlining
  • liweiminlining
  • 2016年05月24日 17:04
  • 542

原始套接字,接收所有数据的设置方法,及代码。

在看一本安全编程书的时候读到原始套接字地方,自己也尝试写了下来,将遇到的一个问题发出来。 // 原始套接字数据的接收.cpp : 定义控制台应用程序的入口点。 // #include "stdaf...
  • Stay_Deep
  • Stay_Deep
  • 2015年03月20日 09:13
  • 491

高手请进

    我现在感到非常的迷茫,希望大家可以帮助我,表示非常的感谢!    我是计算机的一名大4学生,年龄谈不上小了,按理应该可以很好的规划自己的生活,但我发现我没有这个能力,很可悲!这可能使自身能力不...
  • arrong22
  • arrong22
  • 2004年11月15日 09:10
  • 432
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:高手请进:怎么样解析固定端口上收发的数据包中的内容(在线等)
举报原因:
原因补充:

(最多只允许输入30个字)