www.pudn.com > src.rar > killtcp.c


/* 
  Copyright (c) 1999 Rafal Wojtczuk . All rights reserved. 
  See the file COPYING for license details. 
*/ 
#ifndef WIN32 /* Not supported. */ 
#include  
#endif 
#include "nids.h" 
#include "tcp.h" 
#include "util.h" 
 
#if LIBNET_VER == 0 
#ifndef WIN32 /* Not supported. */ 
#include  
#endif 
static int libnetsock = 0; 
 
void nids_killtcp(struct tcp_stream *a_tcp) 
{ 
	#ifndef WIN32 /* Not supported. */ 
    char buf[IP_H + TCP_H]; 
 
    if (libnetsock == 0) 
	return; 
 
    libnet_build_ip(TCP_H, 0, 12345, 0, 64, IPPROTO_TCP, a_tcp->addr.saddr, 
		    a_tcp->addr.daddr, 0, 0, buf); 
    libnet_build_tcp(a_tcp->addr.source, a_tcp->addr.dest, 
		     a_tcp->client.seq + a_tcp->server.window / 2, 0, 
		     0x4, 32000, 0, 0, 0, buf + IP_H); 
    libnet_do_checksum(buf, IPPROTO_TCP, TCP_H); 
    libnet_write_ip(libnetsock, buf, TCP_H + IP_H); 
 
    libnet_build_ip(TCP_H, 0, 12345, 0, 64, IPPROTO_TCP, a_tcp->addr.daddr, 
		    a_tcp->addr.saddr, 0, 0, buf); 
    libnet_build_tcp(a_tcp->addr.dest, a_tcp->addr.source, 
		     a_tcp->server.seq + a_tcp->client.window / 2, 0, 
		     0x4, 32000, 0, 0, 0, buf + IP_H); 
    libnet_do_checksum(buf, IPPROTO_TCP, TCP_H); 
    libnet_write_ip(libnetsock, buf, TCP_H + IP_H); 
	#endif 
} 
 
int raw_init() 
{ 
	#ifndef WIN32 /* Not supported. */ 
    libnetsock = libnet_open_raw_sock(IPPROTO_RAW); 
    if (libnetsock <= 0) 
	return 0; 
    else 
	return 1; 
	#else 
	return 1; 
	#endif 
} 
#elif LIBNET_VER == 1 
	#ifndef WIN32 /* Not supported. */ 
	#include  
	#endif 
static libnet_ptag_t tcp_tag = LIBNET_PTAG_INITIALIZER, 
    ip_tag = LIBNET_PTAG_INITIALIZER; 
static libnet_t *l = 0; 
int raw_init() 
{ 
	#ifndef WIN32 /* Not supported. */ 
    char errbuf[1024]; 
    l = libnet_init(LIBNET_RAW4,	/* injection type */ 
		    NULL,	/* network interface */ 
		    errbuf);	/* error buffer */ 
 
    if (!l) { 
	printf("%s\n", errbuf); 
	return 0; 
    } else 
	return 1; 
	#else 
		return 1; 
	#endif 
} 
 
void nids_killtcp(struct tcp_stream *a_tcp) 
{ 
	#ifndef WIN32 /* Not supported. */ 
    if (!l) 
	return; 
    tcp_tag = libnet_build_tcp(a_tcp->addr.source, a_tcp->addr.dest, 
			       a_tcp->client.seq + 
			       a_tcp->server.window / 2, 0, 0x4, 32000, 0, 
			       0, LIBNET_TCP_H, NULL, 0, l, tcp_tag); 
    ip_tag = 
	libnet_build_ipv4(LIBNET_TCP_H + LIBNET_IPV4_H, 0, 12345, 0, 64, 
			  IPPROTO_TCP, 0, a_tcp->addr.saddr, 
			  a_tcp->addr.daddr, 0, 0, l, ip_tag); 
    libnet_write(l); 
    tcp_tag = libnet_build_tcp(a_tcp->addr.dest, a_tcp->addr.source, 
			       a_tcp->server.seq + 
			       a_tcp->client.window / 2, 0, 0x4, 32000, 0, 
			       0, LIBNET_TCP_H, NULL, 0, l, tcp_tag); 
    ip_tag = 
	libnet_build_ipv4(LIBNET_TCP_H + LIBNET_IPV4_H, 0, 12345, 0, 64, 
			  IPPROTO_TCP, 0, a_tcp->addr.daddr, 
			  a_tcp->addr.saddr, 0, 0, l, ip_tag); 
    libnet_write(l); 
	#endif 
} 
 
#elif LIBNET_VER == -1 
static int initialized = 0; 
int raw_init() 
{ 
	#ifndef WIN32 /* Not supported. */ 
    initialized = 1; 
    return 1; 
	#else 
		return 1; 
	#endif 
} 
 
void nids_killtcp(struct tcp_stream *a_tcp) 
{ 
	#ifndef WIN32 /* Not supported. */ 
    (void)a_tcp; 
    if (initialized) 
	abort(); 
	#endif 
} 
#elif 
	#error Something wrong with LIBNET_VER 
#endif