📄 tcp.c
字号:
/**************************************************************************** **** File: tcp.c**** Author: Mike Borella**** Comments: Dump TCP header information. TCP options section lifted from ** tcpdump.*******************************************************************************/#include <stdio.h>#include <arpa/inet.h>#include <unistd.h>#include "config.h"#include "tcp.h"#include "addrtoname.h"#include "payload.h"/* * TCP options */#ifndef TCPOPT_WSCALE#define TCPOPT_WSCALE 3 /* window scale factor (rfc1072) */#endif#ifndef TCPOPT_ECHO#define TCPOPT_ECHO 6 /* echo (rfc1072) */#endif#ifndef TCPOPT_ECHOREPLY#define TCPOPT_ECHOREPLY 7 /* echo (rfc1072) */#endif#ifndef TCPOPT_TIMESTAMP#define TCPOPT_TIMESTAMP 8 /* timestamps (rfc1323) */#endifextern u_char *packet_end;extern struct arg_t *my_args;/*----------------------------------------------------------------------------**** dump_tcp()**** Parse TCP header and dump fields****----------------------------------------------------------------------------*/void dump_tcp(u_char *bp, int length){ TCPHdr *tp; u_char flags; int hlen, total_hlen; u_short sport, dport, win, urp; u_int seq, ack; /* * Overlay TCP header */ tp = (TCPHdr *) bp; /* * Dump TCP header announcement */ printf("-----------------------------------------------------------------\n"); printf(" TCP Header\n"); printf("-----------------------------------------------------------------\n"); if (length < sizeof(TCPHdr)) { printf("Truncated TCP header: %d bytes\n", length); return; } /* * Grab ports and some fields */ sport = ntohs(tp->th_sport); current_ip_src_port = sport; dport = ntohs(tp->th_dport); current_ip_dst_port = dport; hlen = tp->th_off * 4; seq = ntohl(tp->th_seq); ack = ntohl(tp->th_ack); win = ntohs(tp->th_win); urp = ntohs(tp->th_urp); flags = tp->th_flags; /* * Dump TCP header info */ if (!my_args->t) { printf("Source port: %d", sport); if (sport < 1024) printf(" (%s)\n", tcpport_string(sport)); else printf("\n"); printf("Destination port: %d", dport); if (dport < 1024) printf(" (%s)\n", tcpport_string(dport)); else printf("\n"); if (!my_args->m) { printf("Sequence number: %u\n", seq); printf("Acknowledgement number: %u\n", ack); printf("Header length: %d\n", hlen); printf("Reserved bits: %d\n", tp->th_x2); printf("Flags: "); if (flags & TH_SYN) printf("SYN "); if (flags & TH_FIN) printf("FIN "); if (flags & TH_RST) printf("RST "); if (flags & TH_PUSH) printf("PSH "); if (flags & TH_ACK) printf("ACK "); if (flags & TH_URG) printf("URG "); printf("\n"); printf("Window size: %d\n", win); printf("Checksum: %d\n", ntohs(tp->th_sum)); printf("Urgent pointer: %d\n", urp); printf("Options: "); } } /* * Check header length */ if (hlen > length) { printf("none\nBad header length\n"); return; } /* * Header length and payload length bookkeeping */ length -= hlen; total_hlen = hlen; /* * Handle any options. */ if ((hlen -= sizeof(TCPHdr)) > 0) { u_char *cp; int i, opt, len, datalen; cp = (u_char *) tp + sizeof(TCPHdr); while (hlen > 0) { /* * Check for zero length options */ opt = *cp++; if (opt == TCPOPT_EOL || opt == TCPOPT_NOP) len = 1; else { len = *cp++; /* total including type, len */ if (len < 2 || len > hlen) { printf("Bad option\n"); break; } /* * account for length byte */ hlen --; length --; } /* else */ /* * account for type byte */ hlen --; length --; /* * Handle the rest of the options */ datalen = 0; switch (opt) { case TCPOPT_MAXSEG: datalen = 2; if (!my_args->t) { printf("Maximum segment size = "); printf("%u\n", EXTRACT_16BITS(cp)); } break; case TCPOPT_EOL: if (!my_args->t) { printf("End of options list\n"); } break; case TCPOPT_NOP: if (!my_args->t) { printf("No op\n"); } break; case TCPOPT_WSCALE: datalen = 1; if (!my_args->t) { printf("Window scale = "); printf("%u\n", *cp); } break; case TCPOPT_ECHO: datalen = 4; if (!my_args->t) { printf("Echo = "); printf("%u\n", EXTRACT_32BITS(cp)); } break; case TCPOPT_ECHOREPLY: datalen = 4; if (!my_args->t) { printf("Echo reply = "); printf("%u\n", EXTRACT_32BITS(cp)); } break; case TCPOPT_TIMESTAMP: datalen = 8; if (!my_args->t) { printf("Timestamp = "); printf("%u", EXTRACT_32BITS(cp)); printf(" %u\n", EXTRACT_32BITS(cp + 4)); } break; default: datalen = len - 2; if (!my_args->t) { printf("Option %d:", opt); for (i = 0; i < datalen; ++i) printf("%02x\n", cp[i]); } break; } /* * Account for data printed */ cp += datalen; hlen -= datalen; } } else { if (!my_args->t) printf("none\n"); } /* * print payload if there is one */ if (my_args->p && length > 0) dump_payload((u_char *) bp + total_hlen, length); return; }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -