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í
×
dnes 12:33 | Zajímavý projekt

Kernel.org představil lore.kernel.org, tj. archiv diskusního listu vývojářů linuxového jádra LKML (Linux Kernel Mailing List) s řadou zajímavých funkcí. Archiv běží na softwaru Public Inbox.

Ladislav Hagara | Komentářů: 0
dnes 10:55 | Nová verze

Po devíti měsících vývoje od vydání verze 10.0 byla vydána verze 11.0 open source alternativy GitHubu, tj. softwarového nástroje s webovým rozhraním umožňujícího spolupráci na zdrojových kódech, GitLab (Wikipedie). Představení nových vlastností v příspěvku na blogu a na YouTube.

Ladislav Hagara | Komentářů: 0
včera 20:44 | Nová verze

Po více než 3 měsících vývoje od vydání verze 238 oznámil Lennart Poettering vydání verze 239 správce systému a služeb systemd (GitHub, NEWS).

Ladislav Hagara | Komentářů: 6
včera 15:00 | Nová verze

Bylo oznámeno vydání nové stabilní verze 1.28 a beta verze 1.29 open source textového editoru Atom (Wikipedie). Přehled novinek i s náhledy v příspěvku na blogu. Podrobnosti v poznámkách k vydání. Atom 1.28 je postaven na Electronu 2.0.

Ladislav Hagara | Komentářů: 1
včera 14:00 | Nová verze

Byla vydána nová verze 2.3.0 multiplatformního svobodného frameworku pro zpracování obrazu G'MIC (GREYC's Magic for Image Computing, Wikipedie). Přehled novinek i s náhledy na PIXLS.US.

Ladislav Hagara | Komentářů: 0
včera 13:00 | Komunita

Akční RPG hra Shadowrun Returns Deluxe, kterou lze hrát i na Linuxu je nyní zdarma na Humble Bundle. Hra vyšla díky kampani na Kickstarteru v roce 2013.

tajny_007 | Komentářů: 0
včera 01:00 | Nová verze

Byla vydána verze 1.27 programovacího jazyka Rust (Wikipedie). Z novinek je nutno zmínit podporu SIMD (Single Instruction Multiple Data). Podrobnosti v poznámkách k vydání. Vyzkoušet Rust lze například na stránce Rust by Example.

Ladislav Hagara | Komentářů: 7
21.6. 16:22 | IT novinky

CEO Intelu Brian Krzanich rezignoval (tisková zpráva). Oficiálním důvodem je "vztah na pracovišti". S okamžitou platností se dočasným CEO stal Robert Swan.

Ladislav Hagara | Komentářů: 39
21.6. 14:11 | Komunita

Konsorcium Linux Foundation ve spolupráci s kariérním portálem Dice.com zveřejnilo 2018 Open Source Jobs Report. Poptávka po odbornících na open source neustále roste.

Ladislav Hagara | Komentářů: 1
21.6. 12:44 | Zajímavý článek

Na stránkách linuxové distribuce Ubuntu Studio byla publikována příručka Ubuntu Studio Audio Handbook věnována vytváření, nahrávaní a úpravě zvuků a hudby nejenom v Ubuntu Studiu. Jedná se o živý dokument editovatelný na jejich wiki.

Ladislav Hagara | Komentářů: 0
Jak čtete delší texty z webových stránek?
 (78%)
 (22%)
 (4%)
 (7%)
 (2%)
 (10%)
Celkem 246 hlasů
 Komentářů: 39, poslední 21.6. 17:44
    Rozcestník

    LD_PRELOAD a ioctl()

    6.3.2009 01:02 | Přečteno: 2076× | Programování | Výběrový blog | poslední úprava: 10.3.2009 13:29

    Občas se hodí zavolat vlastní verzi ioctl() bez rekompilace binárky (např. pro ladící účely a teprve poté zavolat reálné ioctl()), jako ukázku přikládám návrat MAC adresy:

    $ ./get_mac 
    00:0a:e4:a9:36:d8
    $ LD_PRELOAD="libwrap_ioctl.so.1.0" ./get_mac 
    0a:0b:0c:0d:0e:0f
    

    Makefile:

    all: libwrap_ioctl.so get_mac
    
    libwrap_ioctl.so: ioctlw.c
    	gcc -Wall -fPIC -shared -Wl,-soname,libwrap_ioctl.so.1           \
    		-I/usr/lib/oss/include -I/usr/include                        \
    		-o libwrap_ioctl.so.1.0 -ldl ioctlw.c
    
    get_mac: get_mac.c
    	gcc -Wall -o get_mac get_mac.c
    

    ioctlw.c:

    #define _GNU_SOURCE
    #include <dlfcn.h>
    #include <stdlib.h>
    #include <stdio.h>
    #include <string.h>
    #include <net/if.h>
    
    #define SIOCGIFHWADDR   0x8927      /* Get hardware address     */
    
    static int (*next_ioctl)(int fd, int request, void *data) = NULL;
    
    int ioctl(int fd, int request, void *data)
    {
        struct ifreq ifr;
        char *msg;
    
        if (request == SIOCGIFHWADDR) {
            memcpy(&ifr, data, sizeof(struct ifreq));
    
            ifr.ifr_hwaddr.sa_data[0] = 0x0A; 
            ifr.ifr_hwaddr.sa_data[1] = 0x0B;
            ifr.ifr_hwaddr.sa_data[2] = 0x0C;
            ifr.ifr_hwaddr.sa_data[3] = 0x0D;
            ifr.ifr_hwaddr.sa_data[4] = 0x0E;
            ifr.ifr_hwaddr.sa_data[5] = 0x0F;
    
            memcpy(data, &ifr, sizeof(struct ifreq));
            return 0;
        }
    
        if (next_ioctl == NULL) {
            fprintf(stderr, "ioctl: wrapping ioctl\n");
            fflush(stderr);
    
            next_ioctl = dlsym(RTLD_NEXT, "ioctl");
    
            fprintf(stderr, "next_ioctl = %p\n", next_ioctl);
            fflush(stderr);
    
            if ((msg = dlerror()) != NULL) {
                fprintf(stderr, "ioctl: dlopen failed: %s\n", msg);
                fflush(stderr);
                exit(1);
            }
            else {
                fprintf(stderr, "ioctl: wrapping done\n");
            }
    
            fflush(stderr);
        }
    
        return next_ioctl(fd, request, data);
    }
    
    //void *dlsym(void *handle, const char *symbol)
    //{
    //    void* result = __libc_dlsym(handle, symbol);
    //
    //    printf("%s\n", symbol);
    //
    //    return result;
    //}
    

    get_mac.c

    #include <stdio.h>
    #include <string.h>
    #include <sys/types.h>
    #include <sys/socket.h>
    #include <sys/ioctl.h>
    #include <netinet/in.h>
    #include <net/if.h>
    
    int main()
    {
       int fd;
       struct ifreq ifr;
      
       fd = socket(AF_INET, SOCK_DGRAM, 0);
      
       ifr.ifr_addr.sa_family = AF_INET;
       strncpy(ifr.ifr_name, "eth0", IFNAMSIZ-1);
      
       ioctl(fd, SIOCGIFHWADDR, &ifr);
      
       close(fd);
      
       /* display result */
       printf("%.2x:%.2x:%.2x:%.2x:%.2x:%.2x\n",
               (unsigned char)ifr.ifr_hwaddr.sa_data[0],
               (unsigned char)ifr.ifr_hwaddr.sa_data[1],
               (unsigned char)ifr.ifr_hwaddr.sa_data[2],
               (unsigned char)ifr.ifr_hwaddr.sa_data[3],
               (unsigned char)ifr.ifr_hwaddr.sa_data[4],
               (unsigned char)ifr.ifr_hwaddr.sa_data[5]);
      
       return 0;
    }
    

    Zdroje:

    Using LD_PRELOAD libraries and glibc backtrace function for debugging
    Simple sample of getting MAC address information
    Wrapping dlsym()

           

    Hodnocení: 88 %

            špatnédobré        

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

    Komentáře

    Vložit další komentář

    6.3.2009 07:45 ...
    Rozbalit Rozbalit vše Re: LD_PRELOAD a ioctl()
    LD_PRELOAD je sikovna vec. Zrovna vcera som si tak pisal firewall pre jedneho guesta vo vserveri, ktory sa inak k iptables nedostane. Pridal som LD_PRELOAD na kniznicu s vlastnym connect, send, recv, sento, recvfrom a mozem si kontrolovat koho pustim a koho nie. Iptables to nie je, ale lepsie ako nic.
    Jardík avatar 6.3.2009 18:48 Jardík | skóre: 40 | blog: jarda_bloguje
    Rozbalit Rozbalit vše Re: LD_PRELOAD a ioctl()
    Hlavně iptables nenastavíš pro jednotlivé programy (?), ale s LD_PRELOAD to půjde (až na nefunkčnost s rootem).
    Věřím v jednoho Boha.
    9.3.2009 23:25  
    Rozbalit Rozbalit vše Re: LD_PRELOAD a ioctl()
    Nevedeli by ste o nejakom riešení pre staticky linkované binárky? Potreboval by som presne to isté - meniť MAC adresu, ale tu mi, žiaľ, LD_PRELOAD nepomôže.

    Ďakujem.
    Fuky avatar 10.3.2009 00:50 Fuky | skóre: 52 | blog: 4u
    Rozbalit Rozbalit vše Re: LD_PRELOAD a ioctl()

    Funkce ioctl() je v libc:

    $ readelf -a /lib/i686/cmov/libc.so.6 |grep ioctl
      1361: 000d8040    63 FUNC    WEAK   DEFAULT   11 ioctl@@GLIBC_2.0
    

    Co říká:

    $ ldd tvoje_binarka
    	linux-gate.so.1 =>  (0xb7f30000)
    	libc.so.6 => /lib/i686/cmov/libc.so.6 (0xb7db8000)
    	/lib/ld-linux.so.2 (0xb7f31000)
    

    Myslím, že i Tvá binárka bude využívat libc, i když ostatní knihovny jsou přilinkovány staticky.

    11.3.2009 15:29
    Rozbalit Rozbalit vše Re: LD_PRELOAD a ioctl()

    Žiaľ, nie. Nesie so sebou vlastnú C knižnicu, ldd na ňu vôbec nefunguje.

    Jardík avatar 16.3.2009 21:43 Jardík | skóre: 40 | blog: jarda_bloguje
    Rozbalit Rozbalit vše Re: LD_PRELOAD a ioctl()
    Já myslel, že alespoň s jednou knihovnou to musí být slinkované vždy - a tou je ld-linux.so.*
    Věřím v jednoho Boha.
    17.3.2009 12:46 petr_p | skóre: 59 | blog: pb
    Rozbalit Rozbalit vše Re: LD_PRELOAD a ioctl()
    ptrace(2) a přepisovat výsledky volání systému.

    Založit nové vláknoNahoru

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