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 10:11 | Komunita

Mozilla.cz informuje, že na začátku června Mozilla spustila novou platformu Ideas.Mozilla.Org pro sběr zpětné vazby, ale také návrhů na nové funkce a obecně komunikaci s uživateli. Nejkomentovanější návrhy se týkají kompaktního rozhraní, vzhledu s vyšším kontrastem a barevného vzhledu podle systému.

Ladislav Hagara | Komentářů: 0
včera 17:11 | Nová verze Fluttershy, yay! | Komentářů: 0
včera 10:33 | Nová verze

Mozilla.cz informuje o aktualizovaném českém slovníku pro kontrolu pravopisu pro Firefox, Thunderbird i SeaMonkey. K dispozici je na na serverech s doplňky (Firefox, Thunderbird, SeaMonkey).

Ladislav Hagara | Komentářů: 0
včera 10:11 | Nová verze

Byla vydána verze 0.52.1 open source počítačové hry Unvanquished (Wikipedie). Nově lze instalovat také z Flathubu. Unvanquished je fork počítačové hry Tremulous.

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

Watchy jsou open source hodinky postaveny na ESP32-PICO-D4 s e-papírovým displejem s rozlišením 200x200 pixelů, s Wi-Fi a Bluetooth LE. Předobjednat je lze na Crowd Supply za 59 dolarů.

Ladislav Hagara | Komentářů: 2
20.6. 22:11 | Nová verze

OASIS oznamuje zveřejnění nejnovějšího standardu OASIS, který byl schválen členy 27. dubna 2021: Open Document Format for Office Applications (OpenDocument) Version 1.3. Formát OpenDocument je volně dostupný otevřený formát souborů dokumentů založený na XML pro kancelářské aplikace, který se používá pro dokumenty obsahující text, tabulky, grafy a grafické prvky. OpenDocument Format v1.3 je aktualizací mezinárodní normy verze 1.2

… více »
Zdeněk Crhonek | Komentářů: 4
19.6. 20:11 | Nová verze

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

Ladislav Hagara | Komentářů: 34
19.6. 16:33 | Nová verze

Tým pro zajištění kvality LibreOffice (QA) oznamuje, že LibreOffice 7.2 Beta1 je k dispozici k testování! LibreOffice 7.2 bude vydán jako finální verze v polovině srpna 2021, přičemž LibreOffice 7.2 Beta1 je druhou předběžnou verzí od zahájení vývoje verze 7.2 na konci listopadu 2020. Od předchozí verze LibreOffice 7.2 Alpha1 bylo do úložiště kódu odesláno 1163 revizí a opraveno 221 problémů. Podívejte se do poznámek k vydání, kde najdete nové funkce obsažené v této verzi LibreOffice.

Zdeněk Crhonek | Komentářů: 0
19.6. 00:33 | Zajímavý projekt

Rodina open source vstupních zařízení Ploopy se rozrostla o Ploopy Mini Trackball. Stavebnici lze předobjednat za 69,99 CAD (1 210 CZK).

Ladislav Hagara | Komentářů: 0
18.6. 15:44 | Nová verze

Byla vydána beta verze Linux Mintu 20.2 s kódovým jménem Uma. Na blogu Linux Mintu jsou hned tři oznámení. První o vydání Linux Mintu s prostředím Cinnamon, druhé o vydání Linux Mintu s prostředím MATE a třetí o vydání Linux Mintu s prostředím Xfce. Stejným způsobem jsou rozděleny také poznámky k vydání (Cinnamon, MATE, Xfce) a přehled novinek s náhledy (Cinnamon, MATE, Xfce). Linux Mint 20.2 bude podporován až do roku 2025.

Ladislav Hagara | Komentářů: 0
Používáte kalkulačku?
 (10%)
 (32%)
 (62%)
 (26%)
 (12%)
Celkem 251 hlasů
 Komentářů: 25, poslední 18.6. 07:59
Rozcestník

LD_PRELOAD a ioctl()

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