abclinuxu.cz AbcLinuxu.cz itbiz.cz ITBiz.cz HDmag.cz HDmag.cz abcprace.cz AbcPráce.cz
AbcLinuxu hledá autory!
Inzerujte na AbcPráce.cz od 950 Kč
Rozšířené hledání
×

9.12. 20:11 | Nová verze

Byl vydán Debian 9.3, tj. třetí opravná verze Debianu 9 s kódovým názvem Stretch a Debian 8.10, tj. desátá opravná verze Debianu 8 s kódovým názvem Jessie. Řešeny jsou především bezpečnostní problémy, ale také několik vážných chyb. Instalační média Debianu 9 a Debianu 8 lze samozřejmě nadále k instalaci používat. Po instalaci stačí systém aktualizovat.

Ladislav Hagara | Komentářů: 0
9.12. 00:44 | Nová verze

Po 6 měsících vývoje od vydání verze 0.13.0 byla vydána verze 0.14.0 správce balíčků GNU Guix a na něm postavené systémové distribuce GuixSD (Guix System Distribution). Na vývoji se podílelo 88 vývojářů. Přibylo 1 211 nových balíčků. Jejich aktuální počet je 6 668. Aktualizována byla také dokumentace.

Ladislav Hagara | Komentářů: 2
8.12. 21:33 | Nová verze

Po půl roce vývoje od vydání verze 5.9 byla vydána nová stabilní verze 5.10 toolkitu Qt. Přehled novinek na wiki stránce. Současně byla vydána nová verze 4.5.0 integrovaného vývojového prostředí (IDE) Qt Creator nebo verze 1.10 nástroje pro překlad a sestavení programů ze zdrojových kódů Qbs.

Ladislav Hagara | Komentářů: 0
7.12. 11:11 | Komunita

Naprostá většina příjmů Mozilly pochází od výchozích webových vyhledávačů ve Firefoxu. Do konce listopadu 2014 měla Mozilla globální smlouvu se společností Google. Následně bylo místo jedné globální smlouvy uzavřeno několik smluv s konkrétními vyhledávači pro jednotlivé země. V USA byla podepsána pětiletá smlouva s vyhledávačem Yahoo. Dle příspěvku na blogu Mozilly podala společnost Yahoo na Mozillu žalobu ohledně porušení této

… více »
Ladislav Hagara | Komentářů: 0
7.12. 05:55 | Zajímavý článek

V Londýně probíhá konference věnovaná počítačové bezpečnosti Black Hat Europe 2017. Průběžně jsou zveřejňovány prezentace. Videozáznamy budou na YouTube zveřejněny o několik měsíců. Zveřejněna byla například prezentace (pdf) k přednášce "Jak se nabourat do vypnutého počítače, a nebo jak v Intel Management Engine spustit vlastní nepodepsaný kód". Dle oznámení na Twitteru, aktualizace vydaná společností Intel nevylučuje možnost útoku.

Ladislav Hagara | Komentářů: 5
7.12. 04:44 | Komunita

Virtualizační nástroj GNOME Boxy ve Fedoře 27 umožňuje jednoduše stáhnout a nainstalovat Red Hat Enterprise Linux, který je pro vývojáře zdarma. Vývojová verze GNOME Boxy již umožňuje jednoduše stáhnout a nainstalovat další linuxové distribuce. Ukázka na YouTube. Seznam distribucí a jejich verze, nastavení a cesty k ISO obrazům je udržován v knihovně a databázi libosinfo (GitLab).

Ladislav Hagara | Komentářů: 0
7.12. 03:33 | Nová verze

Google Chrome 63 byl prohlášen za stabilní (YouTube). Nejnovější stabilní verze 63.0.3239.84 tohoto webového prohlížeče přináší řadu oprav a vylepšení. Vylepšeny byly také nástroje pro vývojáře. Opraveno bylo 37 bezpečnostních chyb.

Ladislav Hagara | Komentářů: 9
6.12. 22:55 | Pozvánky

Spolek OpenAlt zve příznivce otevřených technologií a otevřeného přístupu na 147. brněnský sraz, který proběhne v pátek 15. prosince od 18:00 hodin v restauraci Severka na rohu Tučkové a Zahradníkové.

Ladislav Hagara | Komentářů: 0
6.12. 22:33 | Komunita

V roce 2013 byl představen projekt Debsources, jehož cílem bylo a je poskytnout webové rozhraní ke zdrojovým kódům balíčků obsažených v Debianu. Projekt doteď běžel na doméně debian.net. Dnes bylo oznámeno, že projekt byl přesunut na oficiální infrastrukturu Debianu. Služba Debian Sources nově běží na doméně debian.org. V plánů je řada vylepšení. Již dnes je ke službě k dispozici API a procházet lze také patche a licence.

Ladislav Hagara | Komentářů: 0
6.12. 05:55 | IT novinky

Hodnota Bitcoinu, decentralizované kryptoměny, překonala hranici 12 000 dolarů. Před týdnem byla překonána hranice 10 000 dolarů [reddit].

Ladislav Hagara | Komentářů: 153
Jak se vás potenciálně dotkne trend odstraňování analogového audio konektoru typu 3,5mm jack z „chytrých telefonů“?
 (8%)
 (1%)
 (1%)
 (1%)
 (75%)
 (14%)
Celkem 943 hlasů
 Komentářů: 45, poslední 1.12. 19:00
    Rozcestník

    Dotaz: Cteni DNS headeru v C pomoci pcap

    tomes.io avatar 16.1.2014 23:38 tomes.io | skóre: 12 | blog: tomesh
    Cteni DNS headeru v C pomoci pcap
    Přečteno: 602×
    Ahoj, mam za ukol z DNS paketu (krom jineho) vytisknout nasledujici informace z DNS headeru:
    obsah dotazu (queries) – name, type, class
    obsah odpovědí (answers) – name, type, class, TTL, address
    
    Asi by to melo vypadat nejak takto :
    
        Transaction ID: 0x241a
    
       Questions: 1
        Answer RRs: 3
        Authority RRs: 0
        Additional RRs: 0
        Queries
            www.google.com: type A, class IN
                Name: www.google.com
                Type: A (Host address)
                Class: IN (0x0001)
        Answers
            www.google.com: type CNAME, class IN, cname www.l.google.com
                Name: www.google.com
                Type: CNAME (Canonical name for an alias)
                Class: IN (0x0001)
                Time to live: 3 days, 21 hours, 52 minutes, 57 seconds
                Data length: 18
                Primary name: www.l.google.com
            www.l.google.com: type A, class IN, addr 66.249.89.99
                Name: www.l.google.com
                Type: A (Host address)
                Class: IN (0x0001)
                Time to live: 3 minutes, 47 seconds
                Data length: 4
                Addr: 66.249.89.99
            www.l.google.com: type A, class IN, addr 66.249.89.104
                Name: www.l.google.com
                Type: A (Host address)
                Class: IN (0x0001)
                Time to live: 3 minutes, 47 seconds
                Data length: 4
                Addr: 66.249.89.104
    
    Priznam se, ze tomu zatim moc nerozumim, z toho, co jsem si nastudoval jsem schopny dat dohromady jen zakladni info, typ, class, TTL, adresu. Zatim nechpu jak ziskat jmeno, jak rozlisit dns pakety (query nebo answer). Nejak se tomu nemuzu dostat pod kuzi. Zatim jsem napsal fci na tisknuti packetu, vyuzivajici pcap, ktera dostava z main funkce packet (prikladam jeste dalsi pomocne fce, ktere fuknce print_packet() vyuziva:
    
    void print_mac(unsigned char* mac){
    	int i;
    	for(i=0; i<6; i++){
    		if(i!=0) printf(":");
    		printf("%X",mac[i]);
    	}
    }
    
    char* print_url(char data[]){
    	int i=0;
    	int toread = data[0];
    	int start = 0;
    	i++;
    
    	while(toread != 0){
    		//printf(".");
    		// print everything bettween the dots
    		for(; i<=start+toread; i++)
    			printf("%c",data[i]);	
    		// next chunk
    		toread = data[i];
    		start = i;
    		i++;
    	}
    	// return a char* to the first non-url char
    	return &data[i];
    }
    
    
    
    int sizeofUrl(char data[]){
    	int i = 0;
    	int toskip = data[0];
    
    	// skip each set of chars until (0) at the end
    	while(toskip!=0){
    		i += toskip+1;
    		toskip = data[i];
    	}
    	// return the length of the array including the (0) at the end
    	return i+1;
    }
    
    void printRRType(int i){
    	switch(i){
    		case 1:
    			printf("IPv4 address record");
    			break;
    		case 15:
    			printf("MX mail exchange record");
    			break;
    		case 18:
    			printf("AFS database record");
    			break;
    		case 28:
    			printf("IPv6 address record");
    			break;
    		default:
    			printf("unknown (%d)",i);
    	}
    }
    
    void print_packet(void *pack) {
        char *tab = "   ";
        // listening with an eth header	
        packet_desc* pd = (packet_desc*) pack;
    
        int numRRs = ntohs(pd->dns.qdcount) + ntohs(pd->dns.ancount) + ntohs(pd->dns.nscount) + ntohs(pd->dns.arcount);
        int i;
    	
        for (i = 0; i < numRRs; i++) {
            static_RR *RRd = (static_RR*) ((void*) pd->data + sizeofUrl(pd->data));
            int type = ntohs(RRd->type);
            int clas = ntohs(RRd->clas);
            int ttl = (uint32_t) ntohl(RRd->ttl);
            uint8_t *rd = (void*) (&RRd->rdlength + sizeof (uint16_t));
    
            printf("L2(MAC):\n");
            
            printf("%ssource MAC:", tab);
            print_mac(pd->eth.shost);
            printf("\n");
            printf("%sdestination MAC:",tab);
            print_mac(pd->eth.dhost);   
            printf("\n");
            
            printf("L3(IP):\n");
            printf("%ssource:%s\n", tab, inet_ntoa(pd->ip.src));
            printf("%sdest:%s\n", tab, inet_ntoa(pd->ip.dst));
    
            printf("L4:(UDP)\n");
            printf("%ssource port:%d\n", tab, ntohs(pd->udp.sport));
            printf("%sdest port:%d\n", tab, ntohs(pd->udp.dport));
    
            printf("DNS:\n");
            printf("%sid:%d\n", tab, ntohs(pd->dns.id));
            printf("%s# questions:%d\n", tab, ntohs(pd->dns.qdcount));
            printf("%s# answers:%d\n", tab, ntohs(pd->dns.ancount));
    
            printf("RESOURCE RECORDS\n");
                    
            printf("\n");
            printf("%stype(%d):", tab, type);
            //printf("%sflags:%d\n", tab, ntohs(pd->dns.flags));
            printRRType(ntohs(RRd->type));
            printf("\n");
            printf("%sclass:%d\n", tab, clas);
            printf("%sTTL:%d\n", tab, ttl);
            printf("%saddress:", tab);
            printf("%d.%d.%d.%d\n", rd[0], rd[1], rd[2], rd[3]);
    
            printf("+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++\n");
    
        }
    
    }
    
    Pro zpracovani packetu mam nasledujici struktury, jakozto hlavicky headeru jednotlivych vrstev sitove logiky:
    
    
    #define ETHER_ADDR_LEN	6
    
    typedef u_int tcp_seq;
    
    struct ether_header {
        unsigned char dhost[ETHER_ADDR_LEN]; // Destination host address
        unsigned char shost[ETHER_ADDR_LEN]; // Source host address
        unsigned short type; // IP? ARP? RARP? etc
    };
    
    struct ip_header {
        unsigned char vhl; // version << 4 | header length >> 2
        unsigned char tos; // type of service
        unsigned short len; // total length
        unsigned short id; // identification
        unsigned short off; // fragment offset field
        unsigned char ttl; // time to live
        unsigned char prot; // protocol
        unsigned short sum; // checksum
        struct in_addr src;
        struct in_addr dst; // source and dest address 
    };
    
    struct udp_header {
        unsigned short sport; // source port
        unsigned short dport; // destination port
        unsigned short length; // udp length
        unsigned short checksum; // udp checksum
    };
    
    struct dns_header {
        unsigned short id;
        unsigned short flags;
        unsigned short qdcount;
        unsigned short ancount;
        unsigned short nscount;
        unsigned short arcount;
    };
    
    typedef struct {
        uint16_t type;
        uint16_t clas;
        uint32_t ttl;
        uint16_t rdlength;
    } static_RR;
    
    typedef struct {
        struct ether_header eth;
        struct ip_header ip;
        struct udp_header udp;
        struct dns_header dns;
        char data[0];
    } packet_desc;
    
    #endif
    
    Potrebuji tedy nejak vydolovat hostname z jednotlivych packetu a rozlisit je podle toho, zda jsou query, nebo answer a jejich obsah vypsat, jak bylo uvedeno na zacatku.

    Moz by me pomohla jakaloliv rada, protoz ted jsme v tom hodne zamotany a nevim jak dal. Snad nejak upravit struktury?

    Řešení dotazu:


    Odpovědi

    Michy avatar 17.1.2014 11:01 Michy | skóre: 11 | Praha
    Rozbalit Rozbalit vše Re: Cteni DNS headeru v C pomoci pcap
    Jestli dobře chápu, kam směřuje dotaz, tak doporučuju přečíst si pozorně RFC 1035 a kouknout na arpa/nameser_compat.h. Je třeba mít stále na paměti, že síťové protokoly obvykle posílají vícebytové hodnoty v big endian, zatímco x86 architektura pracuje s little endian pořadím bytů. Potom je to už celkem triviální záležitost.
    tomes.io avatar 17.1.2014 13:34 tomes.io | skóre: 12 | blog: tomesh
    Rozbalit Rozbalit vše Re: Cteni DNS headeru v C pomoci pcap
    S endianitou problem neni, funkce
    ntohs()
    prevede sitovy big endian na little endian (resp na byte order, ktery pouziva pocitac, na kterem program bezi).
    tomes.io avatar 17.1.2014 13:31 tomes.io | skóre: 12 | blog: tomesh
    Rozbalit Rozbalit vše Re: Cteni DNS headeru v C pomoci pcap
    Nasel jsem tohle a myslim ,ze je to peresne ta funkce, kterou potrebuji.

    Jen by me zajimalo v te fci
    void handleDNS(struct sniff_dns* dns, int size);
    ten parametr size. Co to ma presne byt? Velikost ceho?
    Michy avatar 17.1.2014 16:24 Michy | skóre: 11 | Praha
    Rozbalit Rozbalit vše Re: Cteni DNS headeru v C pomoci pcap
    Odhadoval bych to na velikost paměti alokované pro uložení odchyceného dns paketu, tedy kolik dat maximálně se může vejít do oblasti, kam ukazuje pointer dns.
    tomes.io avatar 18.1.2014 23:24 tomes.io | skóre: 12 | blog: tomesh
    Rozbalit Rozbalit vše Re: Cteni DNS headeru v C pomoci pcap
    Myslite
     sizeof(pd->dns)
    ? To neprochazi, kdyz to mam ve fci, ktera tiskne paket:
    
    #define SIZE_DNS sizeof(struct dns_header)
    
    void print_packet(void *pack) {
        char *tab = "   ";
        // listening with an eth header	
        packet_desc* pd = (packet_desc*) pack;
        ........................
        ........................
        handleDNS(&pd->dns, sizeof(pd->dns));
    }
    
    
    to mi ve odkazovane funkci:
    void handleDNS(struct dns_header* dns, int size)
    { 
        // point past  /* IMPORTANT   * this is detected by port number, so could be bad data   * therefore treat everything as a hint   * and don't go over size   */ 
        int i; 
        int j=0; 
        int psize=size-SIZE_DNS; 
        if(psize<=0){   
            printf("WARNING: Too small to be DNS\n"); 
        } 
    
    ............
    ...........
    
    }
    
    vyhodi:
    WARNING: Too small to be DNS
    A nasledne segfault

    Pripominam, ze dns header:
    struct dns_header {
        unsigned short id;
        unsigned short flags;
        unsigned short qdcount;
        unsigned short ancount;
        unsigned short nscount;
        unsigned short arcount;
    };
    
    Je soucasti struktury packetu:
    typedef struct {
        struct ether_header eth;
        struct ip_header ip;
        struct udp_header udp;
        struct dns_header dns;
        char data[0];
    } packet_desc;
    
    19.1.2014 00:51 Šangala | skóre: 56 | blog: Dutá Vrba - Wally
    Rozbalit Rozbalit vše Re: Cteni DNS headeru v C pomoci pcap
    Dáváš tam sice ukazatel na struct sniff_dns* dns, ale musí to obsahovat celý záznam a to size udává jak je to celé veliké včetně sniff_dns, která je na začátku. Rozhodně tam němůže být sizeof(pd->dns), to nemáš žádný obsah jen hlavičku sniff_dns...

    To, že trpíš stihomamem, ještě neznamená, že po tobě nejdou. ⰞⰏⰉⰓⰀⰜⰉ ⰗⰞⰅⰜⰘ ⰈⰅⰏⰉ ⰒⰑⰎⰉⰁⰕⰅ ⰏⰉ ⰒⰓⰄⰅⰎ ·:⁖⁘⁙†
    tomes.io avatar 19.1.2014 12:40 tomes.io | skóre: 12 | blog: tomesh
    Rozbalit Rozbalit vše Re: Cteni DNS headeru v C pomoci pcap
    Promin, ale tomu vubec nerozumim.
    musí to obsahovat celý záznam
    Co je je to "to" co musi obsahovat cely zaznam? Tomu fakt nerozumim. Co je mysleno tim celym zaznamem, cela struktura
    typedef struct {
        struct ether_header eth;
        struct ip_header ip;
        struct udp_header udp;
        struct dns_header dns;
        char data[0];
    } packet_desc;
    To mi nedava smysl, protoze do funkce ma jit jen ukazatel na dns header, nevim co chces rict, priklad by asi pomohl vic.
    tomes.io avatar 19.1.2014 13:03 tomes.io | skóre: 12 | blog: tomesh
    Rozbalit Rozbalit vše Re: Cteni DNS headeru v C pomoci pcap
    Asi uz asi chapu, myslis size ze bude velikost celeho headru, takze kdyz mam fcim ze ktere se teprve vola funkce print_packet():
    void packet_callback(unsigned char *useless, const struct pcap_pkthdr* pkthdr, const unsigned char* packet) {
        packet_desc *pd = (packet_desc*) packet;
        int time = pkthdr->ts.tv_sec * 1000000.0 + pkthdr->ts.tv_usec;
        ;
        printf("received at %d a packet: %d/%d\n", time, pkthdr->caplen, pkthdr->len);
        print_packet(pd, pkthdr->len);
        printf("\n");
    }
    
    
    tak je ten parametr size, ktery vyzaduje funkce parse_DNS() myslen pkthdr->len?
    19.1.2014 13:07 Šangala | skóre: 56 | blog: Dutá Vrba - Wally
    Rozbalit Rozbalit vše Re: Cteni DNS headeru v C pomoci pcap

    Předem zapomeň na to, že vím co to má přesně dělat (tak moc jsem to nestudoval) a že vím jak vypadají ty packety :).

    Ale řádek 93 (v odkazovaném) s spočítá ofset za sniff_dns a v řádku 97 se nastaví ukazatel payload na tuto oblast co je za sniff_dns a kde se vyčítají ty další informace.

    size = size of memeory block vvvvvvvvvv
    ----------------------------------------
        dns−> ---------------------
               u_short dns_id;          
               u_short dns_flags;          
               u_short dns_qdc;          
               u_short dns_anc;          
               u_short dns_nsc;         
               u_short dns_arc; 
    payload−> --------------------- // ((u_char*) dns) + SIZE_DNS ; SIZE_DNS = sizeof(struct sniff_dns)
               Parsovaná DATA       
    ----------------------------------------
    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    
    V tom bloku paměti za tou strukturou se jede a čte i pomocí fce parseDomain(), které to předává ukazatel na tuto oblast a aktuální offset v ní.

    Ten ukazatel dns by mohl být klidně void *, ale takto je to zjednodušené, protože pro údaje o hlavbičce nemusíš přetypovávat.
    Zápis ((u_char*) dns) + SIZE_DNS provede přetypování ukazatele na u_char* a pak přičte velikost struktury a protože je ukazatel typu u_char* (unsigned char *), tak se přičte SIZE_DNS*sizeof(unigned char), tedy počet bytů, tedy to pak ukazuje na data za tou strukturou. (jestli je můj výklad moc zmatený, tak pointerová aritmetika to je :))

    To, že trpíš stihomamem, ještě neznamená, že po tobě nejdou. ⰞⰏⰉⰓⰀⰜⰉ ⰗⰞⰅⰜⰘ ⰈⰅⰏⰉ ⰒⰑⰎⰉⰁⰕⰅ ⰏⰉ ⰒⰓⰄⰅⰎ ·:⁖⁘⁙†
    tomes.io avatar 19.1.2014 14:17 tomes.io | skóre: 12 | blog: tomesh
    Rozbalit Rozbalit vše Re: Cteni DNS headeru v C pomoci pcap
    Diky, ted uz vim k cemu slouzi payload, aspon neco.

    Nicmene, asi jsem blej fakt, porad nevim, co presne mam jako parametr size predat funkci handleDNS(). Tenhle ukol je evidentne nad me sily...
    tomes.io avatar 19.1.2014 14:44 tomes.io | skóre: 12 | blog: tomesh
    Rozbalit Rozbalit vše Re: Cteni DNS headeru v C pomoci pcap
    Aha, uz asi vim, size je pozice resp adresa v pameti na oblast, kde zacina ten sniff_dns header?

    19.1.2014 07:54 dusko
    Rozbalit Rozbalit vše Re: Cteni DNS headeru v C pomoci pcap
    skusil by som sa inspirovat: https://github.com/gamelinux/passivedns
    tomes.io avatar 19.1.2014 14:26 tomes.io | skóre: 12 | blog: tomesh
    Rozbalit Rozbalit vše Re: Cteni DNS headeru v C pomoci pcap
    Tak jinak, vychazel jsem ztohodle Je to parser, ktery je vcelku jednoduchy a chapu ho.

    Umi tisknout DSN answer, kterou ma ve strukture :
    typedef struct {
            uint16_t type;
            uint16_t clas;
            uint32_t ttl;
            uint16_t rdlength;
    } static_RR;
    
    Ve funkci pro tisknuti packetu pak tuto strukturu dostane timto prikazem:
    static_RR* RRd = (static_RR*)((void*)pd->data + sizeofUrl(pd->data));
    
    Mohl bych udelat neco podobneho, kdyz bych si nadefinoval strukturu pro DNS query? napriklad takto:
    typedef struct
    {
        unsigned short qtype;
        unsigned short qclass;
    }query;
    

    Založit nové vláknoNahoru

    Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

    ISSN 1214-1267   www.czech-server.cz
    © 1999-2015 Nitemedia s. r. o. Všechna práva vyhrazena.