怎样可以截取客户端软件发送和接收包?
现在有个股票客户端软件 输入代码就可以得到股票信息
我怎样才能知道客户端发送的包和接收包的内容
有这样的代码或工具吗?

解决方案 »

  1.   

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

  2.   

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

  3.   

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

  4.   

    我写的一个基与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();}
      

  5.   

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

  6.   

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