2009-08-18 3 views
2

Je suis en train d'assembler un scanner de port en tant qu'exercice d'apprentissage. Mon problème est que j'essaie de définir l'option de taille de segment maximale (MSS) dans l'en-tête TCP. J'ai jeté un oeil à tcp.h, mais j'ai du mal à trouver comment le régler. J'espérais qu'il y aurait une option comme ceci:Définition de la taille de segment maximale dans l'en-tête tcp

tcp_header->mss(32000);

Quelque chose de semblable à ce qui précède était tcp.h mais pas dans le struct droit. Certes, je suis encore assez nouveau pour lire les définitions de structure et je ne pouvais pas faire beaucoup de sens de tcp.h donc à la fin j'ai essayé de virer sur les octets nécessaires à la fin de l'entête TCP:

struct tcphdr *CreateTcpHeader() 
{ 
    struct tcphdr *tcp_header; 

    tcp_header = (struct tcphdr *)malloc(sizeof(struct tcphdr)+4*sizeof(int)); 


    tcp_header->source = htons(SRC_PORT); 
    tcp_header->dest = htons(DST_PORT); 
    tcp_header->seq = htonl(0);    
    tcp_header->ack_seq = htonl(0);   
    tcp_header->res1 = 0; 
    tcp_header->doff = (sizeof(struct tcphdr))/4; 
    tcp_header->syn = 1; 
    tcp_header->window = htons(4096); 
    tcp_header->check = 0; /* Will calculate the checksum with pseudo-header later */ 
    tcp_header->urg_ptr = 0; 


    /*memcpy the mss data onto the end of the tcp header. */ 
    int mssCode = 2; 
    int mssLength = 4; 
    uint16_t mss = htonl(32000); 
    int offset = sizeof(struct tcphdr); 
    memcpy((tcp_header+offset), &mssCode, 1); 
    memcpy((tcp_header+offset+1), &mssLength, 1); 
    memcpy((tcp_header+offset+2), &mss, 2); 

    return (tcp_header); 
} 

Mais après que je l'ai écrit il était clair que ce n'était pas une vraie solution, plus ça ne marche toujours pas: P Alors, y a-t-il un meilleur moyen?

+0

Comment utilisez-vous cet en-tête? L'envoyez-vous avec libnet? – Jonathan

+0

Je n'utilise que des prises brutes. Même avec la nouvelle option mss, mon paquet est toujours ignoré, bien qu'il soit pratiquement identique à celui de nmap. Des idées quelqu'un? – CalumMcCall

+0

En fonction de ce que vous apprenez - C ou réseau, vous pouvez regarder http://www.secdev.org/projects/scapy/ –

Répondre

5

Le struct tcphdr dans tcp.h définit la partie obligatoire de l'en-tête TCP. (Regardez le TCP header et vous pouvez faire correspondre les définitions dans struct tcphdr à vos bits réels à apparaître dans l'en-tête.) Les structures en C ont une taille constante, mais TCP permet des données facultatives. Le champ de longueur d'en-tête (doff dans la structure) est la longueur totale de l'en-tête, y compris les options, vous aurez donc besoin d'ajouter un mot pour expliquer l'option MSS:

tcp_header->doff = (sizeof(struct tcphdr))/4 + 1; 

Définissons une structure pour la MSS Option:

struct tcp_option_mss { 
    uint8_t kind; /* 2 */ 
    uint8_t len; /* 4 */ 
    uint16_t mss; 
} __attribute__((packed)); 

maintenant, vous pouvez remplir la structure, dans l'ordre:

/*memcpy the mss data onto the end of the tcp header. */ 
struct tcp_option_mss mss; 
mss.kind = 2; 
mss.len = 4; 
mss.mss = htons(32000); 

Partons un peu plus loin et définir une structure unique pour votre pa cket, de laisser le compilateur nous aider:

struct tcphdr_mss { 
    struct tcphdr tcp_header; 
    struct tcp_option_mss mss; 
}; 

(. Vous devrez peut-être ajouter une option de fin de liste d'options à la fin, et les options NOP à pad la liste des options 8 octets)

maintenant, nous pouvons mettre tous les morceaux ensemble:

struct tcphdr *CreateTcpHeader() 
{ 
    struct tcphdr_mss *tcp_header; 

    tcp_header = malloc(sizeof(struct tcphdr_mss)); 

    tcp_header->tcp_header.source = htons(SRC_PORT); 
    tcp_header->tcp_header.dest = htons(DST_PORT); 
    tcp_header->tcp_header.seq = htonl(0);    
    tcp_header->tcp_header.ack_seq = htonl(0);   
    tcp_header->tcp_header.res1 = 0; 
    tcp_header->tcp_header.doff = (sizeof(struct tcphdr_mss))/4; 
    tcp_header->tcp_header.syn = 1; 
    tcp_header->tcp_header.window = htons(4096); 
    tcp_header->tcp_header.check = 0; /* Will calculate the checksum with pseudo-header later */ 
    tcp_header->tcp_header.urg_ptr = 0; 

    tcp_header->mss.kind = 2; 
    tcp_header->mss.len = 2; 
    tcp_header->mss.mss = htons(32000); 

    return (tcp_header); 
} 
+0

ah tout est logique maintenant. Merci beaucoup. – CalumMcCall

Questions connexes