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 21:22 | Nová verze

Byla vydána verze 1.32 programovacího jazyka Rust (Wikipedie). Podrobnosti v poznámkách k vydání. Vyzkoušet Rust lze například na stránce Rust by Example.

Ladislav Hagara | Komentářů: 0
dnes 15:44 | Komunita

V říjnu byla změněna licence u multiplatformní dokumentové databáze MongoDB z GNU AGPLv3 na SSPL (Server Side Public License). Dle právníku se nejedná o svobodnou licenci. Databáze MongoDB tak nebude obsažena ve Fedoře, v Red Hat Enterprise Linuxu ani například v Debianu.

Ladislav Hagara | Komentářů: 7
dnes 02:22 | Nová verze

Byla vydána verze 2.0 svobodné aplikace určené pro fotografování a ovládání digitálních fotoaparátů z počítače Entangle. Kódové jméno této nejnovější verze je Sodium.

Ladislav Hagara | Komentářů: 2
dnes 01:22 | Nová verze

Byla vydána verze 2.18 svobodného webového prohlížeče pracujícího v grafickém i textovém módu Links (Wikipedie). Přehled novinek v seznamu změn. Links letos slaví 20 let. První veřejná verze 0.80 byla zveřejněna 24. listopadu 1999.

Ladislav Hagara | Komentářů: 4
včera 16:55 | Zajímavý článek

Vývojáři postmarketOS (GitLab) hodnotí 600 dnů vývoje tohoto v květnu 2017 představeného operačního systému pro chytré telefony vycházejícího z optimalizovaného a nakonfigurovaného Alpine Linuxu s vlastními balíčky [reddit].

Ladislav Hagara | Komentářů: 2
včera 15:55 | Bezpečnostní upozornění

Společnost Oracle vydala čtvrtletní bezpečnostní aktualizaci svých softwarových produktů (CPU, Critical Patch Update). Opraveno bylo celkově 284 bezpečnostních chyb. V Oracle Java SE je například opraveno 5 bezpečnostních chyb. Všechny jsou vzdáleně zneužitelné bez autentizace. V Oracle MySQL je opraveno 30 bezpečnostních chyb. Vzdáleně zneužitelných bez autentizace jsou 3 z nich.

Ladislav Hagara | Komentářů: 0
včera 15:44 | Komunita

Na YouTube byly zveřejněny komunitní videozáznamy přednášek z konference OpenAlt 2018. Letošní OpenAlt proběhne o víkendu 2. a 3. listopadu opět na FIT VUT v Brně.

Ladislav Hagara | Komentářů: 0
včera 10:33 | Komunita

Mozilla.cz informuje (en), že program Firefox Test Pilot se příští týden uzavře. Program sloužil téměř tři roky pro testování nových funkcí pro Firefox. Díky němu dnes máme stránku nového panelu, Screenshots pro vytváření snímků stránek, bezpečné sdílení souborů Send, doplněk pro lepší práci a přihlašování k více účtům nebo připravovaný správce hesel Lockbox. Tyto funkce pokračují dál, ale samotný Firefox Test Pilot bude 22. ledna 2019

… více »
Ladislav Hagara | Komentářů: 0
15.1. 21:45 | Zajímavý projekt

Humble Bundle v rámci akce Double Fine Presents nabízí skupinu multiplatformních her bez DRM za vlastní cenu: Mountain, 140 a THOTH (jako jediná nikoliv pro Linux), za nadprůměrnou cenu navíc GNOG a Escape Goat 2 a za aspoň $10 Gang Beasts a Everything. Platbu lze rozdělit mezi vývojáře, Humble Bundle a charitu. Akce probíhá do 29. ledna.

Fluttershy, yay! | Komentářů: 2
15.1. 17:22 | Nová verze

Laboratoře CZ.NIC vydaly novou verzi 4.12.0 aplikace Datovka, tj. svobodné multiplatformní desktopové aplikace pro přístup k datovým schránkám a k trvalému uchovávání datových zpráv v lokální databázi.

Ladislav Hagara | Komentářů: 0
Používáte USB Type-C?
 (19%)
 (16%)
 (10%)
 (12%)
 (37%)
 (3%)
 (45%)
Celkem 380 hlasů
 Komentářů: 0
Rozcestník

LD_PRELOAD a ioctl()

6.3.2009 01:02 | Přečteno: 2120× | 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.
19.11.2018 09:00 the impossible quiz
Rozbalit Rozbalit vše susu
A good topic and worthy of attention. thanks abnjd has provided the impossible quiz

Založit nové vláknoNahoru

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