CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
可用分押宝游戏火热进行中... 专题改版:Java Web 专题
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  VC/MFC >  网络编程

怎么获取客户端socket发包和接包的内容?如股票软件,聊天软件等

楼主blueone(柱子)2005-04-04 13:53:33 在 VC/MFC / 网络编程 提问

怎样可以截取客户端软件发送和接收包?  
  现在有个股票客户端软件   输入代码就可以得到股票信息  
  我怎样才能知道客户端发送的包和接收包的内容  
  有这样的代码或工具吗? 问题点数:0、回复次数:9Top

1 楼clicksoft(好啊)回复于 2005-04-04 14:36:19 得分 0

抓包软件啊Top

2 楼signoft(晴天)回复于 2005-04-04 15:05:01 得分 0

拦截别人的包有两种方式:  
  一、编写原始套接字,可以得到所有的连接的数据  
  二、使用Api   Hook,挂接其他程序的收发函数,然后自己处理数据后再转发。这种方式你可以参照《windows核心编程》,网上也可以查找api   hook找到资料Top

3 楼oyljerry(【勇敢的心】→ ㊣提拉米苏√㊣)回复于 2005-04-04 15:07:55 得分 0

snifferTop

4 楼jhonguy()回复于 2005-04-04 15:13:32 得分 0

可以用spi,相当于API   Hook,把SPI的DLL替换成自己,你就能够在应用程序发包,收包前进行处理。Top

5 楼Caps77(厉兵秣马)回复于 2005-04-04 15:20:08 得分 0

http://www.cnpaf.net/2004/8-4/215738.html  
   
  下一个iris,抓取该端口的包,自己解析,如果加了密,可能就不容易了Top

6 楼keiy()回复于 2005-04-04 15:45:06 得分 0

我写的一个基与console的抓包程序,供参考:  
   
  #include   <winsock2.h>  
  #include   <ws2tcpip.h>  
  #include   <windows.h>  
   
   
  typedef   struct   _TCP   {  
        WORD   SrcPort;   //   源端口  
        WORD   DstPort;   //   目的端口  
        DWORD   SeqNum;   //   顺序号  
        DWORD   AckNum;   //   确认号  
        BYTE   DataOff;   //   TCP头长  
        BYTE   Flags;   //   标志(URG、ACK等)  
        WORD   Window;   //   窗口大小  
        WORD   Chksum;   //   校验和  
        WORD   UrgPtr;   //   紧急指针  
    }   TCP;  
  typedef   TCP   *LPTCP;  
  typedef   TCP   UNALIGNED   *   ULPTCP;  
   
  typedef   struct   _IP   {  
        union   {  
              BYTE   Version;   //   版本  
              BYTE   HdrLen;   //   IHL  
                  };  
        BYTE   ServiceType;   //   服务类型  
        WORD   TotalLen;   //   总长  
        WORD   ID;   //   标识  
        union{   WORD   Flags;   //   标志  
              WORD   FragOff;   //   分段偏移  
                };  
        BYTE   TimeToLive;   //   生命期  
        BYTE   Protocol;   //   协议  
        WORD   HdrChksum;   //   头校验和  
        DWORD   SrcAddr;   //   源地址  
        DWORD   DstAddr;   //   目的地址  
        BYTE   Options;   //   选项  
      }   IP;  
  typedef   IP   *   LPIP;  
   
   
  char   *GetProtocolTxt(BYTE   p)  
  {  
   
  switch   (p)  
      {  
      case   IPPROTO_IP:  
            return     "IPPROTO_IP:";  
      case   IPPROTO_ICMP:  
            return     "IPPROTO_ICMP:";  
      case   IPPROTO_IGMP:  
            return     "IPPROTO_IGMP:";  
      case   IPPROTO_GGP:  
            return     "IPPROTO_GGP:";  
      case   IPPROTO_TCP:  
            return     "IPPROTO_TCP:";  
      case   IPPROTO_PUP:  
            return     "IPPROTO_PUP:";  
      case   IPPROTO_UDP:  
            return     "IPPROTO_UDP:";  
      case   IPPROTO_IDP:  
            return     "IPPROTO_IDP:";  
      case   IPPROTO_IPV6:  
            return     "IPPROTO_IPV6:";  
      case   IPPROTO_ND:  
            return     "IPPROTO_ND:";  
      case   IPPROTO_ICLFXBM:  
            return     "IPPROTO_ICLFXBM:";  
      case   IPPROTO_RAW:  
            return     "IPPROTO_RAW:";  
      case   IPPROTO_MAX:  
            return     "IPPROTO_MAX:";  
      case   IPPORT_ECHO:  
            return     "IPPORT_ECHO:";  
      case   IPPORT_DISCARD:  
            return     "IPPORT_DISCARD:";  
      case   IPPORT_SYSTAT:  
            return     "IPPORT_SYSTAT:";  
      case   IPPORT_DAYTIME:  
            return     "IPPORT_DAYTIME:";  
      case   IPPORT_NETSTAT:  
            return     "IPPORT_NETSTAT:";  
      case   IPPORT_FTP:  
            return     "IPPORT_FTP:";  
      case   IPPORT_TELNET:  
            return     "IPPORT_TELNET:";  
      case   IPPORT_SMTP:  
            return     "IPPORT_SMTP:";  
      case   IPPORT_TIMESERVER:  
            return     "IPPORT_TIMESERVER:";  
      case   IPPORT_NAMESERVER:  
            return     "IPPORT_NAMESERVER:";  
      case   IPPORT_WHOIS:  
            return     "IPPORT_WHOIS:";  
      case   IPPORT_MTP:  
            return     "IPPORT_MTP:";  
      case   IPPORT_TFTP:  
            return     "IPPORT_TFTP:";  
      case   IPPORT_FINGER:  
            return     "IPPORT_FINGER:";  
      case   IPPORT_TTYLINK:  
            return     "IPPORT_TTYLINK:";  
      case   IPPORT_SUPDUP:  
            return     "IPPORT_SUPDUP:";  
      case   IPPORT_EXECSERVER:  
            return     "IPPORT_EXECSERVER:";  
      case   IPPORT_LOGINSERVER:  
            return     "IPPORT_LOGINSERVER:";  
      case   IPPORT_CMDSERVER:  
            return     "IPPORT_CMDSERVER:";  
      case   IPPORT_EFSSERVER:  
            return     "IPPORT_EFSSERVER:";  
      case   IPPORT_RESERVED:  
            return     "IPPORT_RESERVED:";  
      case   IMPLINK_IP:  
            return     "IMPLINK_IP:";  
      case   IMPLINK_LOWEXPER:  
            return     "IMPLINK_LOWEXPER:";  
      default:  
            return   "UNNOW";  
      }  
  }  
   
  #define   TRACE   printf  
   
  #define   SIO_RCVALL   _WSAIOW(IOC_VENDOR,1)  
   
  void   main()  
  {  
      //   检查   Winsock   版本号,WSAData为WSADATA结构对象  
      WSADATA   wsaData;  
      SOCKET     sock   ;  
      int   flag=true;  
      char   LocalName[100];  
      hostent   *pHost;  
      SOCKADDR_IN   addr_in;  
      char   RecvBuf[4096];  
      #define   BUFFER_SIZE   4096  
      IP   ip;  
      TCP   tcp;  
   
   
      WSAStartup(MAKEWORD(2,   2),&wsaData);  
      //   创建原始套接字  
      sock   =   socket(AF_INET,   SOCK_RAW,   IPPROTO_RAW);  
      //   设置IP头操作选项,其中flag   设置为ture,亲自对IP头进行处理  
      setsockopt(sock,   IPPROTO_IP,   IP_HDRINCL,   (char*)&flag,   sizeof(flag));  
      //   获取本机名  
      gethostname((char*)LocalName,   sizeof(LocalName)-1);  
      //   获取本地   IP   地址  
      pHost   =   gethostbyname((char*)LocalName);  
      //   填充SOCKADDR_IN结构  
      addr_in.sin_addr   =   *(in_addr   *)pHost->h_addr_list[0];   //IP  
      addr_in.sin_family   =   AF_INET;  
      addr_in.sin_port   =   htons(57274);  
      //   把原始套接字sock   绑定到本地网卡地址上  
      bind(sock,   (PSOCKADDR)&addr_in,   sizeof(addr_in));  
      //   dwValue为输入输出参数,为1时执行,0时取消  
      DWORD   dwValue   =   1;  
      //   设置   SOCK_RAW   为SIO_RCVALL,以便接收所有的IP包。其中SIO_RCVALL  
      //   的定义为:   #define   SIO_RCVALL   _WSAIOW(IOC_VENDOR,1)  
      ioctlsocket(sock,   SIO_RCVALL,   &dwValue);  
   
      // 前面的工作基本上都是对原始套接字进行设置,在将原始套接字设置完毕,使其能按预期目的工作时,就可以通过recv()函数从网卡接收数据了,接收到的原始数据包存放在缓存RecvBuf[]中,缓冲区长度BUFFER_SIZE定义为65535。然后就可以根据前面对IP数据段头、TCP数据段头的结构描述而对捕获的数据包进行分析:  
      int   i,j;  
      unsigned   char   c;  
      while   (true)  
      {  
      //   接收原始数据包信息  
          memset(   RecvBuf,0x0,BUFFER_SIZE);  
          int   ret   =   recv(sock,   RecvBuf,   BUFFER_SIZE,   0);  
          if   (ret   >   0)  
          {  
                  //   对数据包进行分析,并输出分析结果  
                  ip   =   *(IP*)RecvBuf;  
                  tcp   =   *(TCP*)(RecvBuf   +   ip.HdrLen);  
                  if   (ip.DstAddr!=0xffffffffu)  
  //                 if   (ip.DstAddr==0x7200A8C0u)  
  //                 if   (ip.SrcAddr   ==0x7200A8C0u)  
                  {  
                      TRACE("协议:   %s\n",GetProtocolTxt(ip.Protocol));  
                      TRACE("IP源地址:   %s\n",inet_ntoa(*(in_addr*)&ip.SrcAddr));  
                      TRACE("IP目标地址:   %s\n",inet_ntoa(*(in_addr*)&ip.DstAddr));  
                      TRACE("TCP源端口号:   %d\n",tcp.SrcPort);  
                      TRACE("TCP目标端口号:%d\n",tcp.DstPort);  
                      TRACE("数据包长度:   %d\n",ntohs(ip.TotalLen));  
                      TRACE("长度:%x   %x   %x   %x\n",ip.HdrLen,tcp.DataOff,sizeof(ip),sizeof(tcp));  
                      TRACE("长度:%d   %d   %d   %d\n\n",ip.HdrLen,tcp.DataOff,sizeof(ip),sizeof(tcp));  
   
                      printf("0000:");  
                      for(i=0;i<ntohs(ip.TotalLen);i++)  
                      {  
                          printf("%02x   ",   (unsigned   char   )RecvBuf[i]);  
                          if   ((i+1)%16==0)  
                            {  
                                  putchar('   ');  
                                  for(j=0;j<16;j++)  
                                  {  
                                          c=     RecvBuf[i-(15-j)];  
                                          if   (isprint(c))  
                                                putchar(c);  
                                                else  
                                                putchar('.');  
   
                                  }  
                                  printf("\n%04x:",i+1);  
                            }  
                      }  
                if   (((i=ntohs(ip.TotalLen)%16))!=0)  
                  {  
                        for(j=0;j<16-i;j++)  
                                  printf("       ");  
                        putchar('   ');            
                        for(j=0;j<i;j++)  
                                  {  
                                          c=     RecvBuf[ntohs(ip.TotalLen)-i+j];  
                                          if   (isprint(c))  
                                                putchar(c);  
                                                else  
                                                putchar('.');  
   
                                  }  
                    }  
                      printf("\n");  
              }  
          }  
      }  
      getchar();  
   
  }  
   
  Top

7 楼Practise_Think(时代“过客”)回复于 2005-04-04 19:05:54 得分 0

用RAW   SOCKET吧,如果不是特别情况就不要替换ws2_32.dll了,搞这个东西比较麻烦,如果搞不好其他的网络程序可能运行不正常,要是只是用抓包这个功能的话就不用自己做工具了,直接在网上找一抓包工具,有些还附带有包分析功能很优秀的!!Top

8 楼somexing(somexing)回复于 2005-04-05 09:02:40 得分 0

直接用SnifferTop

9 楼goodheartppl(goodheart)回复于 2005-04-07 09:45:24 得分 0

一、编写原始套接字,可以得到所有的连接的数据  
  二、使用Api   Hook,挂接其他程序的收发函数,然后自己处理数据后再转发。这种方式你可以参照  
  三、SNIFFER  
  四、替换WINDOWS的winsock2.dll   ,然后所有的数据都可知道Top

相关问题

  • Socket编程,聊天软件的问题求助
  • 我想用socket写一个局域网的聊天软件?
  • 聊天软件
  • 高手请进!!如何用socket实现多点通信,就像聊天软件一样。UP者有分
  • 局域网聊天软件
  • 局域网聊天软件的问题
  • 求局域网聊天软件
  • C#开发视频聊天软件
  • 哪里能获取DirectX Media SDK开发包
  • 接收到UDP广播包时,如何获取发包者的IP?

关键词

  • ipv6
  • 客户
  • 端口
  • tcp
  • 软件
  • 数据
  • word
  • ip
  • 分析
  • 数据包

得分解答快速导航

  • 帖主:blueone

相关链接

  • Visual C++类图书
  • Visual C++类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
世纪乐知(北京)网络技术有限公司 版权所有, 京 ICP 证 020026 号
北京创新乐知广告有限公司 提供技术支持
Copyright © 2000-2007, CSDN.NET, All Rights Reserved
GongshangLogo