首页 / 操作系统 / Linux / Ubuntu下GCC之libpcap库数据库通信协议解析基础框架代码
Ubuntu下GCC之libpcap库数据库通信协议解析基础框架代码:/* * dbaudit.c * * dbaudit example of TCP/IP packet capture using libpcap. * * Version 0.1 (2011-09-20) * Copyright (c) 2011 The dbaudit Group * * This software is intended to be used as a practical example and * demonstration of the libpcap library; available at: * http://www.linuxidc.com/ * **************************************************************************** * * Example compiler command-line for GCC: * gcc -Wall -o dbaudit dbaudit.c -lpcap * **************************************************************************** * * Code Comments * * This section contains additional information and explanations regarding * comments in the source code. It serves as documentaion and rationale * for why the code is written as it is without hindering readability, as it * might if it were placed along with the actual code inline. References in * the code appear as footnote notation (e.g. [1]). * * 1. Ethernet headers are always exactly 14 bytes, so we define this * explicitly with "#define". Since some compilers might pad structures to a * multiple of 4 bytes - some versions of GCC for ARM may do this - * "sizeof (struct sniff_ethernet)" isn"t used. * * 2. Check the link-layer type of the device that"s being opened to make * sure it"s Ethernet, since that"s all we handle in this example. Other * link-layer types may have different length headers (see [1]). * * 3. This is the filter expression that tells libpcap which packets we"re * interested in (i.e. which packets to capture). Since this source example * focuses on IP and TCP, we use the expression "ip", so we know we"ll only * encounter IP packets. The capture filter syntax, along with some * examples, is documented in the tcpdump man page under "expression." * Below are a few simple examples: * * Expression Description * ---------- ----------- * ip Capture all IP packets. * tcp Capture only TCP packets. * tcp port 80 Capture only TCP packets with a port equal to 80. * ip host 10.1.2.3 Capture all IP packets to or from host 10.1.2.3. * **************************************************************************** * *//*include start*/ #define APP_NAME "fdbaudit" #define APP_DESC "dbaudit example using libpcap" #define APP_COPYRIGHT "Copyright (c) 2011 dbaudit" #define APP_DISCLAIMER "THERE IS ABSOLUTELY NO WARRANTY FOR THIS PROGRAM."#include <pcap.h> #include <stdio.h> #include <string.h> #include <stdlib.h> #include <ctype.h> #include <errno.h> #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h>//#define OFFLINE //when read offline file #define MAX_S 1024//copy to file /*include end*//*protocol define start*/ /* default snap length (maximum bytes per packet to capture) */ #define SNAP_LEN 1518/* ethernet headers are always exactly 14 bytes [1] */ #define SIZE_ETHERNET 14/* Ethernet addresses are 6 bytes */ #define ETHER_ADDR_LEN 6/* Ethernet header */ struct db_ethernet { u_char ether_dhost[ETHER_ADDR_LEN]; /* destination host address */ u_char ether_shost[ETHER_ADDR_LEN]; /* source host address */ u_short ether_type; /* IP? ARP? RARP? etc */ };/* IP header */ struct db_ip { u_char ip_vhl; /* version << 4 | header length >> 2 */ u_char ip_tos; /* type of service */ u_short ip_len; /* total length */ u_short ip_id; /* identification */ u_short ip_off; /* fragment offset field */ #define IP_RF 0x8000 /* reserved fragment flag */ #define IP_DF 0x4000 /* dont fragment flag */ #define IP_MF 0x2000 /* more fragments flag */ #define IP_OFFMASK 0x1fff /* mask for fragmenting bits */ u_char ip_ttl; /* time to live */ u_char ip_p; /* protocol */ u_short ip_sum; /* checksum */ struct in_addr ip_src,ip_dst; /* source and dest address */ }; #define IP_HL(ip) (((ip)->ip_vhl) & 0x0f) #define IP_V(ip) (((ip)->ip_vhl) >> 4)/* TCP header */ typedef u_int tcp_seq;struct db_tcp { u_short th_sport; /* source port */ u_short th_dport; /* destination port */ tcp_seq th_seq; /* sequence number */ tcp_seq th_ack; /* acknowledgement number */ u_char th_offx2; /* data offset, rsvd */ #define TH_OFF(th) (((th)->th_offx2 & 0xf0) >> 4) u_char th_flags; #define TH_FIN 0x01 #define TH_SYN 0x02 #define TH_RST 0x04 #define TH_PUSH 0x08 #define TH_ACK 0x10 #define TH_URG 0x20 #define TH_ECE 0x40 #define TH_CWR 0x80 #define TH_FLAGS (TH_FIN|TH_SYN|TH_RST|TH_ACK|TH_URG|TH_ECE|TH_CWR) u_short th_win; /* window */ u_short th_sum; /* checksum */ u_short th_urp; /* urgent pointer */ };/* UDP header */ struct db_udp//udp protocol { u_int16_t udp_source_port; u_int16_t udp_destination_port; u_int16_t udp_length; u_int16_t udp_checksum; };/* mysql header */ struct db_mysql { u_int8_t mysql_header_length; u_int16_t unknow1; u_int8_t packet_num; u_int8_t qry; u_int16_t q1; u_int16_t q2; u_int16_t q3; }; /*Oracle header-tns protocol*/struct db_tns { u_short length;//package length u_short packet_checksum;// u_char type;//tns type u_char flag;//status u_short header_checksum; };struct db_tns_connect//0x01 { u_short ns_vr; u_short ns_compatible_ver; u_short ser_opt; // u_char ser_opt2; u_short SDU_size; u_short TDU_size; u_short NT_protocol_ch; // u_char NT_protocol_ch2; u_short max_packets; u_short hardware; u_short data_length; u_short offset; u_int32_t max_data; u_char flag0; u_char flag1; /* if not jdbc,use offet to override these; */ u_int32_t item; u_int32_t item2; u_char id[8]; u_char unkonwn[8]; // u_char *buff; //no need };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
/* 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("
");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; } /* data spans multiple lines */ for ( ;; ) { /* compute current line length */ line_len = line_width % len_rem; /* print line */ print_hex_ascii_line(ch, line_len, offset); /* compute total remaining */ len_rem = len_rem - line_len; /* shift pointer to remaining bytes to print */ ch = ch + line_len; /* add offset */ offset = offset + line_width; /* check if we have line width chars or less */ if (len_rem <= line_width) { /* print last line and get out */ print_hex_ascii_line(ch, len_rem, offset); break; } }return; } /* putting buffer into buffer.txt */ void put_in_file(const u_char *buff,int len) { u_char tmp[MAX_S]; FILE *buffer; memcpy(tmp,buff,len); buffer=fopen("buffer.txt","ab");//append binary if(buffer==NULL) printf("FILE OPEN/CREATE FAIL
"); else{ fwrite(tmp,sizeof(u_char),len,buffer); fwrite("
",sizeof(char),1,buffer); fclose(buffer); }