Liber 000 - Astrum Argentum

Liber 000 - Astrum Argentum Liber 000 - Astrum Argentum

astrumargentum.org
from astrumargentum.org More from this publisher
01.01.2013 Views

dispositivo de comunicação ao qual estamos sendo entregues, ou deixando. struct net_device *dev; /* Device we arrived on/are leaving by */ struct net_device *real_dev; /* For support of point to point protocols (e.g. 802.3ad) over bonding, we must save the physical device that got the packet before replacing skb->dev with the virtual device. */ Finalmente chegamos numa parte conhecida, ai esta o transport layer header :D, muito importante dentro do nosso código. /* Transport layer header */ union { struct tcphdr *th; struct udphdr *uh; struct icmphdr *icmph; struct igmphdr *igmph; struct iphdr *ipiph; struct spxhdr *spxh; unsigned char *raw; } h; Bom como vc já deve ter imaginado(estudar networking no passado vai ser útil pra vc agora), abaixo vemos o network layer header /* Network layer header */ union { struct iphdr *iph; struct ipv6hdr *ipv6h; struct arphdr *arph; struct ipxhdr *ipxh; unsigned char *raw; } nh; Por ultimo, mas não menos importante(a verdade é que neste documento pelo menos será menos importante), vemos o link layer header: /* Link layer header */ union { struct ethhdr *ethernet; unsigned char *raw; } mac; 114

Blz, agora conhecemos o segundo argumento de nossa função de hoking, vamos ver o que mais vem da toca do coelho ;) O terceiro argumento const struct net_device *in é o dispositivo do qual nós chegamos, enquanto const struct net_device *out, é o dispositivo de saída(no caso de NF_IP_LOCAL_OUT ou NF_IP_POST_ROUTING). Esta struct esta declarada em ~/linux/netdevice.h, temos um campo muito interessante que nos pode ser útil que indica o nome da interface sua declaração é: char name[IFNAMSIZ]; O último argumento da função de hoking é o: int (*okfn)(struct sk_buff *) Não mexeremos com esta função, mas para não deixar algo nebuloso vou tentar explicar para que serve esta função, dei uma pesquisada na net e descobri que as hoks do netfilter pode descançar(sleep), em momentos como por exemplo o pacote é passado para o espaço do usuário, neste caso, não seria muito inteligente manter o processo trancado, ou rodando esperando a hok retornar, então as funções de tratamento do netfilter foram divididas em duas, a segunda parte do tratamento, ocorre quando o pacote retorna do espaço do usuário, esta parte é a okfn :), teve uma thread lista do netfilter explicando isto, muito melhor do que eu posso explicar(o próprio rusty que explica hehehehe): http://lists.netfilter.org/pipermail/netfilter/2000-January/003173.html De qualquer forma isto não é importante dentro deste documento, ja que não utilizaremos nada relativo a esta função :). Como vc pode ver esta função retorna um inteiro, este retorno decide o que vai ser feito com o pacote. Seria no iptables o -j, ou o que a hok fará com o pacote. Vamos dar uma olhada no que nossa função pode retornar: Estas definições estão em ~/linux/netfilter.h : #define NF_DROP 0 #define NF_ACCEPT 1 #define NF_STOLEN 2 #define NF_QUEUE 3 #define NF_REPEAT 4 NF_DROP: óbvio faz com que o pacote seja descartado. NF_ACCEPT: Nem um pouco menos óbvio retornando NF_ACCEPT fazemos com que nosso pacote seja aceito. NF_STOLEN: Bom este não é tão óbvio hehehe NF_STOLEN faz com que o 115

dispositivo de comunicação ao qual estamos sendo entregues, ou<br />

deixando.<br />

struct net_device *dev; /* Device we arrived on/are leaving<br />

by */<br />

struct net_device *real_dev; /* For support of point to point<br />

protocols<br />

(e.g. 802.3ad) over bonding, we<br />

must save the<br />

physical device that got the<br />

packet before<br />

replacing skb->dev with the<br />

virtual device. */<br />

Finalmente chegamos numa parte conhecida, ai esta o transport layer<br />

header :D, muito importante dentro do nosso código.<br />

/* Transport layer header */<br />

union<br />

{<br />

struct tcphdr *th;<br />

struct udphdr *uh;<br />

struct icmphdr *icmph;<br />

struct igmphdr *igmph;<br />

struct iphdr *ipiph;<br />

struct spxhdr *spxh;<br />

unsigned char *raw;<br />

} h;<br />

Bom como vc já deve ter imaginado(estudar networking no passado vai<br />

ser útil pra vc agora), abaixo vemos o network layer header<br />

/* Network layer header */<br />

union<br />

{<br />

struct iphdr *iph;<br />

struct ipv6hdr *ipv6h;<br />

struct arphdr *arph;<br />

struct ipxhdr *ipxh;<br />

unsigned char *raw;<br />

} nh;<br />

Por ultimo, mas não menos importante(a verdade é que neste documento<br />

pelo menos será menos importante), vemos o link layer header:<br />

/* Link layer header */<br />

union<br />

{<br />

struct ethhdr *ethernet;<br />

unsigned char *raw;<br />

} mac;<br />

114

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!