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 02:00 | Pozvánky

Konference OpenAlt 2018 (dříve LinuxAlt a Openmobility) proběhne již o víkendu 3. a 4. listopadu na FIT VUT v Brně. Motto konference je "Otevřeným přístupem k otevřené společnosti". Připraveno je 8 tracků přednášek a workshopů. Pořadatelé připravili výběr toho nejzajímavějšího.

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

Bylo vydáno RFC 8484 řešící posílání DNS dotazů a získávání DNS odpovědí přes protokol HTTPS (DoH, DNS over HTTPS). V aktuálních verzích Firefoxu je DoH ve výchozím nastavení zakázáno. Povolit jej lze v about:config změnou hodnoty network.trr.mode (Trusted Recursive Resolver). V srpnu zveřejnila Mozilla výsledky experimentu s DNS přes HTTPS ve Firefoxu Nightly.

Ladislav Hagara | Komentářů: 37
19.10. 13:00 | Komunita

Při prvním spuštění Ubuntu 18.04 LTS (Bionic Beaver) je spuštěn nástroj Ubuntu Report. Pokud uživatel souhlasí, jsou pomocí tohoto nástroje odeslány do Canonicalu informace o daném počítači (doba instalace, počet procesorů, rozlišení displeje, velikost paměti, časová zóna, ...). V červnu byly zveřejněny první statistiky. Podrobnější statistiky jsou nově k dispozici na samostatné stránce.

Ladislav Hagara | Komentářů: 12
19.10. 01:00 | Pozvánky

O víkendu probíhá v Košicích pravidelné setkání příznivců otevřených technologií OSS Víkend. Na programu je řada zajímavých přednášek a workshopů.

Ladislav Hagara | Komentářů: 0
19.10. 00:11 | Nová verze

Byla vydána nová verze 1.3 otevřeného, licenčními poplatky nezatíženého, univerzálního ztrátového formátu komprese zvuku Opus (Wikipedie) a jeho referenční implementace libopus. Vylepšena byla například detekce, zda se jedná o řeč nebo o hudbu. Přidána byla podpora prostorového zvuku (immersive audio) dle plánovaného RFC 8486. Podrobnosti a zvukové ukázky na demo stránce.

Ladislav Hagara | Komentářů: 0
18.10. 22:33 | Nová verze

Bylo vydáno Ubuntu 18.10 s kódovým názvem Cosmic Cuttlefish (Kosmická sépie). Ke stažení jsou Ubuntu Desktop a Server, Ubuntu Cloud Images, Ubuntu Netboot, Kubuntu, Lubuntu a Lubuntu Alternate, Ubuntu Budgie, Ubuntu Kylin, Ubuntu MATE, Ubuntu Studio a Xubuntu. Podrobnosti v poznámkách k vydání.

Ladislav Hagara | Komentářů: 3
18.10. 18:33 | Nová verze

Byl vydán PostgreSQL ve verzi 11.0. Přehled novinek v poznámkách k vydání.

Ladislav Hagara | Komentářů: 0
18.10. 17:33 | IT novinky

Nadace Raspberry Pi představila na svém blogu Raspberry Pi TV HAT, tj. rozšíření jednodeskového počítače Raspberry Pi umožňující příjem televizního vysílání DVB-T a DVB-T2. Cena rozšíření je 21,50 $.

Ladislav Hagara | Komentářů: 11
18.10. 17:07 | Nová verze

Vychází OpenBSD 6.4. Z řady novinek namátkou: podpora dalších architektur (arm64 např. dostal z Linuxu vypůjčený ovladač radeondrm), hypervizor vmm podporuje i qcow2 disky a šablony, jádro dokáže automaticky přepínat mezi dostupnými bezdrátovými sítěmi, sítě pracují o něco efektivněji, z bezpečnosti „přísaha byla doplněna odhalením“ (pledge(2) lze vhodně doplnit pomocí unveil(2)), SMT je ve výchozím stavu vypnutý, ale lze jej zapnout. Syntaxe nastaveni OpenSMTPD se změnila. S vydáním vychází také nová verze LibreSSL - 2.8.2.

Daniel Čižinský | Komentářů: 5
17.10. 23:15 | IT novinky

Firma Raptor Computing Systems, která stojí také za pracovní stanicí Talos II, představila levnější desku Blackbird s podporou jednoho 4-/8jádrového CPU POWER9 Sforza a formátem microATX; bližší specifikace jsou ve wiki výrobce.

Fluttershy, yay! | Komentářů: 30
Přispíváte osobně k vývoji svobodného softwaru?
 (40%)
 (43%)
 (25%)
 (22%)
 (11%)
 (36%)
Celkem 277 hlasů
 Komentářů: 16, poslední dnes 03:42
Rozcestník

LD_PRELOAD a ioctl()

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