Ubuntu下GCC之libpcap库数据库通信协议解析基础框架(3)

struct db_tns_accept//0x02
{
 u_short ns_vr;
 u_short ser_opt;
// u_char ser_opt2;//no need
 u_short SDU_size;
 u_short TDU_size;
 u_short hardware;
 u_short data_length;
 u_short offset;
 u_char flag0;
 u_char flag1;
};

struct db_tns_reject//0x04
{
 u_char usr_refuse_reason;
 u_char sys_refuse_reason;
 u_char data_length;
};

struct db_tns_redirect//0x05
{
 u_short data_length;
 u_char data;//
};

struct db_tns_marker//0x0c
{
 //u_char data_length[3];
 u_char type;
 u_char data_byte0;
 u_char data_byte1;
};

struct db_tns_data
{
 u_short data_flag;//Data Flag
 
};
/*sqlserver header-tds protocol*/
/*DB2 header-db2 protocol*/
/*sybase header-npgsql protocol*/
/*Postgresql header-tds protocol*/

/*protocol define end*/

/*function define start*/
void
got_ethernet_packet(u_char *args, const struct pcap_pkthdr *header, const u_char *packet);

void
got_ip_package(u_char *args,const struct pcap_pkthdr *header,const u_char *packet);

void
got_tcp_package(u_char *args,const struct pcap_pkthdr *header,const u_char *packet,int size_ip);

void
got_udp_package(u_char *args,const struct pcap_pkthdr *header,const u_char *packet,int size_ip);

void
got_mysql_package(u_char *args,const struct pcap_pkthdr *header,const u_char *packet,int size_tcp);

void
got_tns_package(u_char *args,const struct pcap_pkthdr *header,const u_char *packet,int size_tcp);

void
got_data_package(u_char *args,const struct pcap_pkthdr *header,const u_char *packet,int size_header);

void
print_payload(const u_char *payload, int len);

void
print_hex_ascii_line(const u_char *payload, int len, int offset);

void
print_app_banner(void);

void
print_app_usage(void);

void
put_in_file(const u_char *buff,int len);
/*function define end*/

/*function implement start*/

/*
 * app name/banner
 */
void
print_app_banner(void)
{

printf("%s - %s\n", APP_NAME, APP_DESC);
 printf("%s\n", APP_COPYRIGHT);
 printf("%s\n", APP_DISCLAIMER);
 printf("\n");

return;
}

/*
 * print help text
 */
void
print_app_usage(void)
{

printf("Usage: %s [interface]\n", APP_NAME);
 printf("\n");
 printf("Options:\n");
 printf("    interface    Listen on <interface> for packets.\n");
 printf("\n");

return;
}

/*
 * print data in rows of 16 bytes: offset   hex   ascii
 *
 * 00000   47 45 54 20 2f 20 48 54  54 50 2f 31 2e 31 0d 0a   GET / HTTP/1.1..
 */
void
print_hex_ascii_line(const u_char *payload, int len, int offset)
{

int i;
 int gap;
 const u_char *ch;

/* offset */
 printf("%05d   ", offset);
 
 /* hex */
 ch = payload;
 for(i = 0; i < len; i++) {
  printf("%02x ", *ch);
  ch++;
  /* print extra space after 8th byte for visual aid */
  if (i == 7)
   printf(" ");
 }
 /* print space to handle line less than 8 bytes */
 if (len < 8)
  printf(" ");
 
 /* fill hex gap with spaces if not full line */
 if (len < 16) {
  gap = 16 - len;
  for (i = 0; i < gap; i++) {
   printf("   ");
  }
 }
 printf("   ");
 
 /* ascii (if printable) */
 ch = payload;
 for(i = 0; i < len; i++) {
  if (isprint(*ch))
   printf("%c", *ch);
  else
   printf(".");
  ch++;
 }

printf("\n");

return;
}

/*
 * print packet payload data (avoid printing binary data)
 */
void
print_payload(const u_char *payload, int len)
{

int len_rem = len;
 int line_width = 16;   /* number of bytes per line */
 int line_len;
 int offset = 0;     /* zero-based offset counter */
 const u_char *ch = payload;

if (len <= 0)
  return;

/* data fits on one line */
 if (len <= line_width) {
  print_hex_ascii_line(ch, len, offset);
  return;
 }

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:http://www.heiqu.com/ppjzz.html