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 11:44 | Nová verze

Linux Kodachi, linuxová distribuce zaměřená na bezpečnost a ochranu soukromí, byl vydán ve verzi 7.0. Vychází z Xubuntu 18.04. Přehled novinek v changelogu.

Ladislav Hagara | Komentářů: 0
dnes 11:22 | Humor

Linus Torvalds se v rámci oznámení o vydání Linuxu 5.7-rc7 pochlubil vylepšením svého hlavního počítače: Poprvé za 15 let není uvnitř Intel, není to ještě ARM, je to AMD Threadripper 3970x, allmodconfig je třikrát rychlejší.

Ladislav Hagara | Komentářů: 9
dnes 11:11 | Komunita

PGCon 2020, tj. konference vývojářů a uživatelů databázového systému PostgreSQL, proběhne online od úterý 26. května do pátku 29. května. Na programu jsou zajímavé přednášky i tutoriály. Sledovat je lze zdarma a bez registrace.

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

Po třech a půl letech od vydání verze 016 byla vydána nová verze 017 alternativní linuxové distribuce GoboLinux. Podrobnosti v představení nové verze a v poznámkách k vydání. GoboLinux nedodržuje standardní hierarchii souborového systému (FHS), nýbrž jsou jednotlivé programy instalovány do vlastních adresářů.

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

Byla vydána nová major verze 6.0 multiplatformní digitální pracovní stanice pro práci s audiem (DAW) Ardour. Přehled novinek i s náhledy v oficiálním oznámení.

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

Sxmo aneb Simple X Mobile je uživatelské rozhraní pro mobilní telefon PinePhone vycházející z projektu suckless aneb "softwaru, který štve méně". Využívá dlaždicového správce oken dwm, dynamické menu dmenu, emulátor terminálu st nebo webový prohlížeč surf. Videoukázky.

Ladislav Hagara | Komentářů: 12
včera 08:00 | Nová verze

Krita, tj. svobodný program pro skicování, malování a úpravu obrázků, je nově k dispozici (Google Play) také pro operační systémy Android a ChromeOS. Zatím se jedná o beta verzi.

Ladislav Hagara | Komentářů: 1
včera 02:00 | Komunita

Roy Schestowitz se na blogu Techrights dlouhodobě zabývá kauzami Microsoftu souvisejícími s open source a Linuxem. V současné době upozorňuje na četnost článků o Microsoftu v sekci Linux na webu ZDNet nebo že web Softpedia opustil Marius Nestor, který psal o linuxových novinkách, a příslušnou sekci po něm převzal „Microsoft Editor“ Bogdan Popa. Připomíná také dřívější podobné případy.

Fluttershy, yay! | Komentářů: 9
23.5. 09:00 | Nová verze

Po dvou letech od vydání verze 2.94 byla vydána nová major verze 3.00 multiplatformního BitTorrent klienta Transmission (Wikipedie). Přehled novinek na GitHubu. Zdůraznit lze například vylepšenou podporu IPv6.

Ladislav Hagara | Komentářů: 7
23.5. 07:00 | Nová verze

Byla vydána nová verze 13.0 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í i s náhledy v příspěvku na blogu.

Ladislav Hagara | Komentářů: 0
Kdy přecházíte na nové vydání distribuce/OS?
 (13%)
 (13%)
 (22%)
 (7%)
 (4%)
 (41%)
Celkem 308 hlasů
 Komentářů: 0
Rozcestník

LD_PRELOAD a ioctl()

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