m8xlmus Δημοσ. 12 Δεκεμβρίου 2008 Δημοσ. 12 Δεκεμβρίου 2008 Καλησπέρα παιδιά, προσπαθώ να γράψω ένα προγραμα σε C και εδώ και 2 μερες με ταλαιπωρεί κάτι πολύ κουφό. Το πρόγραμμα είναι αναλυτής δικτύου και χρησιμοποιώ winpcap αλλά το πρόβλημα είναι γενικής φύσεως(..πιστεύω). Λοιπόν ο κώδικας μου είναι ο εξής: /* το μέγεθος (σε bytes) των διευθύνσεων ethernet */ #define ETHER_ADDR_LEN 6 /* το μέγεθος των επικεφαλίδων ethernet */ #define ETHER_H_LEN 14 /* ARP Header */ typedef struct { u_short arp_ht; /* hardware type */ u_short arp_pt; /* protocol type */ u_char arp_hs; /* hardware size */ u_char arp_ps; /* protocol size */ u_short arp_op; /* operation code */ #define ARP_REQ 0x0001 /* op request */ #define ARP_REPLY 0x0002 /* op reply */ u_char arp_smac[ETHER_ADDR_LEN]; /* <<<<<--- εδώ αρχίζει το κουφό */ u_long arp_src; /* sender's ip address */ u_char arp_dmac[ETHER_ADDR_LEN]; u_long arp_dst; }arp_h; και στο "κυρίως" πρόγραμα χρησιμοποιώ την παράνω δομή (όπως και πολλές άλλες) για να πάρω τις πληροφορίες που θέλω από το ολοκληρωμένο πακέτο (const u_char *pkt_data) : void afunction(....., ....., const u_char *pkt_data){ const arp_h *arph; arph = (arp_h*) (pkt_data + ETHER_H_LEN); : : printf("...") : κτλ } Αν τώρα τα bytes πχ που δείχνει ο (pkt_data + ETHER_H_LEN) είναι αυτά: 00000 00 00 00 00 00 00 00 00 dd dd dd dd dd dd ee ee 00010 ee ee bb bb bb bb bb bb cc cc cc cc θα περιμέναμε: arph->arp_smac == dd dd dd dd dd dd , και arph->arp_src == ee ee ee ee , κτλ κτλ.. Έλα όμως που για κάποιο περίεργο λόγο: ναι μεν arph->arp_smac == dd dd dd dd dd dd , αλλά arph->arp_src == ee ee bb bb (πηδάει 2 bytes) Αν όμως αντικαταστήσω το u_long arp_smac; με u_char arp_smac[4]; όλα κομπλέ!! ..αν πάλι αντί για u_long το δηλώσω u_int πάλι τα ίδια!! ...???? Δέν έχω εμπειρία στη C/C++ άλλα απ' όσο ξέρω και απ' ότι βλέπω (με την sizeof) το μέγεθος ενός u_long/u_int είναι 4 bytes! Δεν θα έπρεπε να έχει το ίδιο αποτέλεσμα με ένα πίνακα χαρακτήρων 4 bytes?? Την ίδια ακριβώς τεχνική τη χρησιμοποιώ 10δες φορές στο πρόγραμμα μου και δεν έχω κανένα πρόβλημα. Μπορώ να του δηλώσω u_char[] αφού του αρέσει καλύτερα αλλά με ανυσηχεί λίγο γιατί στην πορεία δεν θα ξέρω..."πετυχε το typecast ή δεν πέτυχε? ισχύουν αυτα που βλέπω στην οθόνη ή όχι?". Ευχαριστώ πολύ για το χρόνο σας!
Evgenios1 Δημοσ. 13 Δεκεμβρίου 2008 Δημοσ. 13 Δεκεμβρίου 2008 erp request etc... τι φτιαχνεις? wifi craker? nice
alkisg Δημοσ. 13 Δεκεμβρίου 2008 Δημοσ. 13 Δεκεμβρίου 2008 Πρέπει είτε να το κάνεις packed, αλλά ο τρόπος εξαρτάται από τον compiler. Για παράδειγμα για gcc είναι: __attribute__ ((packed)) Θεωρία: http://en.wikipedia.org/wiki/Data_structure_alignment
m8xlmus Δημοσ. 13 Δεκεμβρίου 2008 Μέλος Δημοσ. 13 Δεκεμβρίου 2008 Χε! Alkisg πάνω στο άρθρο έιχα πέσει ψάχνοντας για το συγκεκριμένο θέμα αλλά δεν φαντάστηκα ότι ήταν η απάντηση! Τελικά δεν είναι και τόσο παράδοξο ε... Thanx...
Προτεινόμενες αναρτήσεις
Αρχειοθετημένο
Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.