nf_hook_opsprimeiro atribuimos a .hooknum o valor de NF_IP_LOCAL_IN(pacotes chegando na maquina) hulk.hooknum = NF_IP_LOCAL_IN; Primeira regra da hook a ser obedecida hulk.priority = NF_IP_PRI_FIRST;Apontamos .hook para nossa funcao hulk.hook = hookfunc;E definimos a familia da hook hulk.pf = PF_INET; Utilizando a funcao nf_register_hook(nf_hook_ops *), inserimos nossa hook dentro do netfilter nf_register_hook(&hulk);Retornamos 0 indicando que o modulo foi carregado com sucesso return 0; }Esta funcao e responsavel por arrumar nossa bagunca, em todo modulo acharemos uma destas:void cleanup_module() {Desregistramos nossa hook, e deixamos o kernel viver em paz hehehehe nf_unregister_hook(&hulk); }Bom como vcs puderam ver por este nosso primeiro teste, nao e dificil construir hooks uteis dentro do netfilter seguindo mais ou menos o exemplo que dei acima.Vamos a segunda parte da primeira parte deste paper :DE se quizermos rejeitar pacote para um determinado protocolo??Maos a obra!!#define __KERNEL__#define MODULE#include #include #include #include #include #include #include #include static struct nf_hook_ops hulk;unsigned int hookfunc(unsigned int hooknum, struct sk_buff **skb, const struct net_device *in, const struct net_device *out, int (*okfn)(struct sk_buff *)) { struct sk_buff *sk = *skb; if(sk->nh.iph->protocol == IPPROTO_TCP) { return NF_DROP; } return NF_ACCEPT; } int init_module() { hulk.hooknum = NF_IP_LOCAL_IN; hulk.priority = NF_IP_PRI_FIRST; hulk.hook = hookfunc; hulk.pf = PF_INET; nf_register_hook(&hulk); return 0; }void cleanup_module() { nf_unregister_hook(&hulk); } Resultado do bixo rodando:bash-2.05b# gcc -c -O3 teste_protocol.cbash-2.05b# insmod teste_protocol.oWarning: loading teste_protocol.o will taint the kernel: no license See http://www.tux.org/lkml/#export-tainted for information about tainted modulesModule teste_protocol loaded, with warningsbash-2.05b# popa3d -Dbash-2.05b# telnet localhost 110Trying 127.0.0.1... bash-2.05b#Como vemos acima apos carregar o modulo nao foi possivel conectar na maquina mostrando que nosso modulo teve sucesso! :)como ja conhecemos a rotina de registro de hooks nao vou explica-la novamente, irei explicar somente a funcao de hooking :)Blz abrimos a funcao:unsigned int hookfunc(unsigned int hooknum, struct sk_buff **skb, const struct net_device *in, const struct net_device *out, int (*okfn)(struct sk_buff *)) {Declaramos outro ponteiro para uma struct sk_buff e deferenciamos um nivel o ponteiro do **skb struct sk_buff *sk = *skb; Vcs podem ver os membros de iph em ~/linux/ip.h e a definicao de IPPROTO_TCP em ~/linux/in.h, fazemos uma comparacao para ver se obedece a nossa exigencia (procotolo tcp). if(sk->nh.iph->protocol == IPPROTO_TCP) { obedencendo DROPAMOS o pacote. return NF_DROP; } Nao obedecendo deixamos o pacote viver em paz(aceitamos) return NF_ACCEPT; } Por ultimo mas nao menos importante!Vamos ver como selecionar pacotes por endereco :)por fim este codigo esta quase identico ao do bioforge estou escrevendo a um tempao e estou cansado ja..#define __KERNEL__#define MODULE#include #include #include #include #include #include #include #include static struct nf_hook_ops hulk; unsigned char *loopback = "\x7f\x00\x00\x01";unsigned int hookfunc(unsigned int hooknum, struct sk_buff **skb, const struct net_device *in, const struct net_device *out, int (*okfn)(struct sk_buff *)) { struct sk_buff *sk = *skb; if(sk->nh.iph->saddr == (unsigned int *)loopback) { return NF_DROP; } return NF_ACCEPT; } int init_module() { hulk.hooknum = NF_IP_LOCAL_IN; hulk.priority = NF_IP_PRI_FIRST; hulk.hook = hookfunc; hulk.pf = PF_INET; nf_register_hook(&hulk); return 0; }void cleanup_module() { nf_unregister_hook(&hulk); } Como sempre compilamos e testamos :)bash-2.05b# gcc -c -O3 teste_sa.cbash-2.05b# insmod teste_sa.oWarning: loading teste_sa.o will taint the kernel: no license See http://www.tux.org/lkml/#export-tainted for information about tainted modulesModule teste_sa loaded,