abclinuxu.cz AbcLinuxu.cz itbiz.cz ITBiz.cz HDmag.cz HDmag.cz abcprace.cz AbcPráce.cz
Inzerujte na AbcPráce.cz od 950 Kč
Rozšířené hledání
×
    dnes 13:44 | IT novinky

    Na blogu Raspberry Pi byl představen Raspberry Pi AI Kit určený vlastníkům Raspberry Pi 5, kteří na něm chtějí experimentovat se světem neuronových sítí, umělé inteligence a strojového učení. Jedná se o spolupráci se společností Hailo. Cena AI Kitu je 70 dolarů.

    Ladislav Hagara | Komentářů: 0
    dnes 13:22 | Nová verze

    Byla vydána nová verze 14.1 svobodného unixového operačního systému FreeBSD. Podrobný přehled novinek v poznámkách k vydání.

    Ladislav Hagara | Komentářů: 0
    dnes 12:55 | Zajímavý software

    Společnost Kaspersky vydala svůj bezplatný Virus Removal Tool (KVRT) také pro Linux.

    Ladislav Hagara | Komentářů: 0
    dnes 12:33 | Nová verze

    Grafický editor dokumentů LyX, založený na TeXu, byl vydán ve verzi 2.4.0 shrnující změny za šest let vývoje. Novinky zahrnují podporu Unicode jako výchozí, export do ePub či DocBook 5 a velké množství vylepšení uživatelského rozhraní a prvků editoru samotného (např. rovnic, tabulek, citací).

    Fluttershy, yay! | Komentářů: 0
    dnes 12:00 | Nová verze

    Byla vydána (𝕏) nová verze 7.0 LTS open source monitorovacího systému Zabbix (Wikipedie). Přehled novinek v oznámení na webu, v poznámkách k vydání a v aktualizované dokumentaci.

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

    Organizace Apache Software Foundation (ASF) vydala verzi 22 integrovaného vývojového prostředí a vývojové platformy napsané v Javě NetBeans (Wikipedie). Přehled novinek na GitHubu. Instalovat lze také ze Snapcraftu a Flathubu.

    Ladislav Hagara | Komentářů: 0
    včera 17:00 | IT novinky

    Společnost AMD na veletrhu Computex 2024 představila (YouTube) mimo jiné nové série procesorů pro desktopy AMD Ryzen 9000 a notebooky AMD Ryzen AI 300.

    Ladislav Hagara | Komentářů: 0
    včera 16:22 | Nová verze

    OpenCV (Open Source Computer Vision, Wikipedie), tj. open source multiplatformní knihovna pro zpracování obrazu a počítačové vidění, byla vydána ve verzi 4.10.0 . Přehled novinek v ChangeLogu. Vypíchnout lze Wayland backend pro Linux.

    Ladislav Hagara | Komentářů: 0
    včera 14:00 | Zajímavý software

    Národní superpočítačové centrum IT4Innovations s partnery projektu EVEREST vydalo sadu open source vývojových nástrojů EVEREST SDK pro jednodušší nasazení aplikací na heterogenních vysoce výkonných cloudových infrastrukturách, zejména pro prostředí nabízející akceleraci pomocí FPGA.

    Ladislav Hagara | Komentářů: 0
    včera 13:22 | IT novinky

    Společnost Valve aktualizovala přehled o hardwarovém a softwarovém vybavení uživatelů služby Steam. Podíl uživatelů Linuxu aktuálně činí 2,32 %. Nejčastěji používané linuxové distribuce jsou Arch Linux, Ubuntu, Linux Mint a Manjaro Linux. Při výběru jenom Linuxu vede SteamOS Holo s 45,34 %. Procesor AMD používá 75,04 % hráčů na Linuxu.

    Ladislav Hagara | Komentářů: 20
    Rozcestník

    LD_PRELOAD a ioctl()

    6.3.2009 01:02 | Přečteno: 2517× | 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.