Busan IT/공장내 Network2015. 7. 17. 17:36

================================ Outline ====================================

TCP analyzer(진행 중)

----------------------------------------------------------------------------

Source port 부터 Acknowledgment number까지 tcphdr 구조체 포인터를 사용하여 출력해 보자.

 

TCP이외에 필요 없는 정보들을 제외하고 IP주소, Port 번호, Sequence 번호만 출력해보자.




/*** 소스 ***/

#include <stdio.h>
#include <pcap/pcap.h>
#include <net/ethernet.h>
#include <arpa/inet.h>
#include <netinet/ip.h>
#include <netinet/tcp.h>

void printIP(const void *vp);
void printEther(const void *vp);
void hexaview(const void *vp, unsigned int uilen);

int main(void)
{
  char *cpNICNAME;
  char caErrmsg[PCAP_ERRBUF_SIZE];
  pcap_t *stpDS;
  const unsigned char *ucpData;
  struct pcap_pkthdr stInfo;
  struct tcphdr * stTcp;


  cpNICNAME = pcap_lookupdev(caErrmsg);
  if0 == cpNICNAME )
  {
    printf("caErrmsg   : [%s] \n", caErrmsg);
    return 100;
  }
  printf("cpNICNAME   : [%s] \n", cpNICNAME);


  stpDS = pcap_open_live( cpNICNAME , 1500 , 1 , 0 , caErrmsg );

  while(1)
  {
    ucpData = pcap_next(stpDS, &stInfo);
    if(ETH_P_IP != ntohs(*((unsigned short *)(ucpData + 12)) ))
    {
      continue;

    }
    if(IPPROTO_TCP != *(ucpData + 23))
    {
      continue;
    }
    //printf("Packet Length  : %d\n",stInfo.len);

    //printEther(ucpData);

    if( ETH_P_IP == ntohs( *((short *)(ucpData + 12) ) )  )
    {
      printIP(ucpData + sizeof(struct ether_header));
    }

    if(*(ucpData+23== IPPROTO_TCP )
    {
      stTcp = (struct tcphdr*)(ucpData 
          + sizeof(struct ether_header) 
          + (*(ucpData + sizeof(struct ether_header)) & 0x0F ) * 4  );

      printf("Source Port  : %d\n", ntohs(stTcp->source));   
      printf("Dest Port  : %d\n", ntohs(stTcp->dest));   
      printf("Sequence  : %08X\n", ntohl(stTcp->seq));   
      printf("Ack. Sequence  : %08X\n", ntohl(stTcp->ack_seq));  






      printf("------------------------------------------------------\n");
    }


  }
  pcap_close(stpDS);
  return 0;
}

void printIP(const void *vp)
{
  const struct ip *v = vp;
  //printf("IP version  : %d \n", v->ip_v);
  //printf("Header Length  : %d byte \n", v->ip_hl * 4);
  //printf("Type of Service  : 0x%02X \n", v->ip_tos);
  //printf("Total Length  : %d byte \n", ntohs(v->ip_len));
  printf("Src IP     : %s \n", inet_ntoa(v->ip_src));
  printf("Dst IP     : %s \n", inet_ntoa(v->ip_dst));
  /*printf("Protocol   : ");

    switch(v->ip_p)
    {
    case IPPROTO_IP:
    printf("IDummy protocol for TCP");
    break;
    case IPPROTO_ICMP:
    printf("Internet Control Message Protocol");
    break;

    case IPPROTO_IGMP:
    printf("Internet Group Management Protocol");
    break;

    case IPPROTO_IPIP:
    printf("IPIP tunnels (older KA9Q tunnels use 94");
    break;

    case IPPROTO_TCP:
    printf("Transmission Control Protocol");
    break;

    case IPPROTO_EGP:
    printf("Exterior Gateway Protocol");
    break;

    case IPPROTO_PUP:
    printf("PUP protocol");
    break;

    case IPPROTO_UDP :
    printf("User Datagram Protocol");
    break;
    }
    putchar('\n');
   */

}

void printEther(const void *vp)
{
  int iCnt;

  printf("Dest MAC   : ");
  for(iCnt = 0; iCnt < ETH_ALEN; iCnt++)
  {
    printf("%02X", ((struct ether_header *)vp)->ether_dhost[iCnt]);
    printf(":");
  }
  printf("\b \n");

  printf("Src  MAC   : ");
  for(iCnt = 0; iCnt < ETH_ALEN; iCnt++)
  {
    printf("%02X", ((struct ether_header *)vp)->ether_shost[iCnt]);
    printf(":");
  }
  printf("\b \n");

  printf("Next Layer   : ");

  switch( ntohs( ((struct ether_header *)vp)->ether_type ))
  {
    case ETH_P_LOOP : 
      printf("Ethernet Loopback packet");
      break;
    case ETH_P_PUP : 
      printf("Xerox PUP packet");
      break;
    case ETH_P_PUPAT : 
      printf("Xerox PUP Addr Trans packet");
      break;
    case ETH_P_IP : 
      printf("Internet Protocol packet");
      break;
    case ETH_P_X25 : 
      printf("CCITT X.25");
      break;
    case ETH_P_ARP : 
      printf("Address Resolution packet");
      break;
    case ETH_P_BPQ : 
      printf("G8BPQ AX.25 Ethernet Packet  [ NOT AN OFFICIALLY REGISTERED ID ]");
      break;
    case ETH_P_IEEEPUP : 
      printf("Xerox IEEE802.3 PUP packet");
      break;
    case ETH_P_IEEEPUPAT : 
      printf("Xerox IEEE802.3 PUP Addr Trans packet");
      break;
    case ETH_P_DEC : 
      printf("DEC Assigned proto");
      break;
    case ETH_P_DNA_DL : 
      printf("DEC DNA Dum");
      break;
    case ETH_P_DNA_RC : 
      printf("DEC DNA Remote Console");
      break;
    case ETH_P_DNA_RT : 
      printf("DEC DNA Routing");
      break;
    case ETH_P_LAT : 
      printf("DEC LAT");
      break;
    case ETH_P_DIAG : 
      printf("DEC Diagnostics");
      break;
    case ETH_P_CUST : 
      printf("DEC Customer use");
      break;
    case ETH_P_SCA : 
      printf("DEC Systems Comms Arch");
      break;
    case ETH_P_TEB : 
      printf("Trans Ether Bridging");
      break;
    case ETH_P_RARP : 
      printf("Reverse Addr Res packet");
      break;
    case ETH_P_ATALK : 
      printf("Appletalk DDP");
      break;
    case ETH_P_AARP : 
      printf("Appletalk AARP");
      break;
    case ETH_P_8021Q : 
      printf("802.1Q VLAN Extended Header");
      break;
    case ETH_P_IPX : 
      printf("IPX over DIX");
      break;
    case ETH_P_IPV6 : 
      printf("IPv6 over bluebook");
      break;
    case ETH_P_PAUSE : 
      printf("IEEE Pause frames. See 802.3 31B");
      break;
    case ETH_P_SLOW : 
      printf("Slow Protocol. See 802.3ad 43B");
      break;
    case ETH_P_WCCP : 
      printf("Web-cache coordination protocol defined in draft-wilson-wrec-wccp-v2-00.txt");
      break;
    case ETH_P_PPP_DISC : 
      printf("PPPoE discovery messages");
      break;
    case ETH_P_PPP_SES : 
      printf("PPPoE session messages");
      break;
    case ETH_P_MPLS_UC : 
      printf("MPLS Unicast traffic");
      break;
    case ETH_P_MPLS_MC : 
      printf("MPLS Multicast traffic");
      break;
    case ETH_P_ATMMPOA : 
      printf("MultiProtocol Over ATM");
      break;
    case ETH_P_LINK_CTL : 
      printf("HPNA, wlan link local tunnel");
      break;
    case ETH_P_ATMFATE : 
      printf("Frame-based ATM Transport over Ethernet");
      break;
    case ETH_P_PAE : 
      printf("Port Access Entity (IEEE 802.1X)");
      break;
    case ETH_P_AOE : 
      printf("ATA over Ethernet");
      break;
    case ETH_P_8021AD : 
      printf("802.1ad Service VLAN");
      break;
    case ETH_P_TIPC : 
      printf("TIPC");
      break;
    case ETH_P_8021AH : 
      printf("802.1ah Backbone Service Tag");
      break;
    case ETH_P_1588 : 
      printf("IEEE 1588 Timesync");
      break;
    case ETH_P_FCOE : 
      printf("Fibre Channel over Ethernet");
      break;
    case ETH_P_TDLS : 
      printf("TDLS");
      break;
    case ETH_P_FIP : 
      printf("FCoE Initialization Protocol");
      break;
    case ETH_P_QINQ1 : 
      printf("deprecated QinQ VLAN [ NOT AN OFFICIALLY REGISTERED ID ]");
      break;
    case ETH_P_QINQ2 : 
      printf("deprecated QinQ VLAN [ NOT AN OFFICIALLY REGISTERED ID ]");
      break;
    case ETH_P_QINQ3 : 
      printf("deprecated QinQ VLAN [ NOT AN OFFICIALLY REGISTERED ID ]");
      break;
    case ETH_P_EDSA : 
      printf("Ethertype DSA [ NOT AN OFFICIALLY REGISTERED ID ]");
      break;
    case ETH_P_AF_IUCV : 
      printf("IBM af_iucv [ NOT AN OFFICIALLY REGISTERED ID ]");
      break;
    case ETH_P_802_3 : 
      printf("Dummy type for 802.3 frames");
      break;
    case ETH_P_AX25 : 
      printf("Dummy protocol id for AX.25");
      break;
    case ETH_P_ALL : 
      printf("Every packet (be careful!!!)");
      break;
    case ETH_P_802_2 : 
      printf("802.2 frames");
      break;
    case ETH_P_SNAP : 
      printf("Internal only");
      break;
    case ETH_P_DDCMP : 
      printf("DEC DDCMP: Internal only");
      break;
    case ETH_P_WAN_PPP : 
      printf("Dummy type for WAN PPP frames");
      break;
    case ETH_P_PPP_MP : 
      printf("Dummy type for PPP MP frames");
      break;
    case ETH_P_LOCALTALK : 
      printf("Localtalk pseudo type");
      break;
    case ETH_P_CAN : 
      printf("Controller Area Network");
      break;
    case ETH_P_PPPTALK : 
      printf("Dummy type for Atalk over PPP");
      break;
    case ETH_P_TR_802_2 : 
      printf("802.2 frames");
      break;
    case ETH_P_MOBITEX : 
      printf("Mobitex (kaz@cafe.net)");
      break;
    case ETH_P_CONTROL : 
      printf("Card specific control frames");
      break;
    case ETH_P_IRDA : 
      printf("Linux-IrDA");
      break;
    case ETH_P_ECONET : 
      printf("Acorn Econet");
      break;
    case ETH_P_HDLC : 
      printf("HDLC frames");
      break;
    case ETH_P_ARCNET : 
      printf("1A for ArcNet :-)");
      break;
    case ETH_P_DSA : 
      printf("Distributed Switch Arch.");
      break;
    case ETH_P_TRAILER : 
      printf("Trailer switch tagging");
      break;
    case ETH_P_PHONET : 
      printf("Nokia Phonet frames");
      break;
    case ETH_P_IEEE802154 : 
      printf("IEEE802.15.4 frame");
      break;
    case ETH_P_CAIF : 
      printf("ST-Ericsson CAIF protocol");
      break;
  }
  putchar('\n');

}



 

 

반응형

'Busan IT > 공장내 Network' 카테고리의 다른 글

Three-way Handshake, fork 함수, execl 함수  (0) 2015.07.24
TCP analyzer  (0) 2015.07.22
TCP 추출(진행중)  (0) 2015.07.16
Echo Server/Client  (0) 2015.07.15
Echo Server, Echo Client(진행 중)  (0) 2015.07.14
Posted by newind2000