Portál AbcLinuxu, 28. května 2024 17:39

Zvrhlé hříčky s knihovnami pro céčko

29.9.2006 16:33 | Přečteno: 2151× | IT | poslední úprava: 29.9.2006 18:15

Dnes jsem absolvoval již druhou přednášku jednoho z velice zajímavých předmětů na FI MUNI aneb "Unix – programování a správa systému". Je to jeden z předmětů, kde se člověk konečně dozví nějaké praktické detaily (o programovování pod UNIXem...) a ne jen obecné teoretické blafy nebo IMHO věci, které by měly být náplní středoškolské informatiky. Dnes jsme věnovali část přednášky knihovnám a po zjištění, že pomocí LD_PRELOAD lze programům podstrčit "poupravené" funkce, jsem se vrhl na přepisování printf a scanf :-).

LD_PRELOAD je proměnná shellu, do které lze umístit název knihovny, která má být dynamicky přilinkovaná jako první ke spuštěnému programu. Co to v praxi znamená? Že pokud knihovna obsahuje nějaké funkce, které jsou v jiné dynamicky načítané knihovně, pak budou tyto "odstíněny" naší novou verzí... Řekl jsem si, že většina programů se mnou nekomunikuje dostatečně přívětivě a tak jsem si zkusil napsat printf a scanf tak, aby byl ke mně počítač milejší ;-). Postup je jednoduchý. Nejdříve napíšeme zdroják s nově definovanými funkcemi. Třeba libhell.c:

#include <stdio.h>
#include <stdarg.h>

int printf(const char *format, ...) {
   va_list args;

   va_start(args, format);
   vfprintf(stdout, "[Hello my boss!] :-) ", NULL);
   vfprintf(stdout, format, args);
   va_end(args);
   return vfprintf(stdout, "(-: [You're the best user!]\n", NULL);
}

int scanf(const char *fmt, ...)
{
   int rc;
   va_list args;

   va_start(args, fmt);

   vfprintf(stdout, "(?) ;-) [Tell me something nice, my darling.]: ", NULL);
   rc = vfscanf(stdin, fmt, args);
   vfprintf(stdout, "    :-O [Thank you, boss!]\n", NULL);

   va_end(args);

   return rc;
}

To bychom měli to podstatné. Teď to ještě zkompilovat a nainstalovat. To uděláme s pomocí libtool: libtool --mode=compile gcc -g -O -c libhell.c; libtool --mode=link gcc -g -O -o libhell.la libhell.lo -rpath /usr/local/lib. Tak, knihovna je zkompilovaná a slinkovaná, takže ji už jen nakopírujeme do /usr/local/lib: cp libhell.la .libs/libhell.so* /usr/local/lib/.

Naše nová a uživatelsky přívětivější ;-) implementace funkcí printf a scanf je na světě (dokonce i v našem počítači), ale ještě jsme ji nepodstrčili žádnému programu. Nicméně není to nic těžkého. Bashi řekneme export LD_PRELOAD="/usr/local/lib/libhell.so" a schválně si zkuste spustit "hello world" nebo jiný program, který používá přepsané funkce... Já jsem se nejvíc nasmál, když jsem provedl změny v libhell.c, spustil libtool a ten mi místo příkazů, které spouští, vypisoval jen "Burn in hell!" – to byla původní implementace :-D.

       

Hodnocení: 100 %

        špatnédobré        

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

Komentáře

Nástroje: Začni sledovat (1) ?Zašle upozornění na váš email při vložení nového komentáře. , Tisk

Vložit další komentář

29.9.2006 16:52 12345 | skóre: 41 | blog:
Rozbalit Rozbalit vše Re: Zvrhlé hříčky s knihovnami pro céčko
Odpovědět | Sbalit | Link | Blokovat | Admin
Pěkné :-)

Nemělo by místo „Say me something…“ být „Tell me something…“ ?
29.9.2006 17:07 Kyosuke | skóre: 28 | blog: nalady_v_modre
Rozbalit Rozbalit vše Re: Zvrhlé hříčky s knihovnami pro céčko
Jojo … :-) Ale tomuhle příkladu teda říkám „zvrhlost“… :-D Myslím, že se najde hromada užitečnějších využití, třeba mnou kdysi zmíněná knihovna libtrash a podobně. :-)
29.9.2006 18:05 VícNežNic | skóre: 42 | blog: Spáleniště | Ne dost daleko
Rozbalit Rozbalit vše Re: Zvrhlé hříčky s knihovnami pro céčko
Tohle je ještě pitomější použití než to které tam bylo uvedeno jako příklad :-)
Copak toho není dost?
29.9.2006 18:10 Kyosuke | skóre: 28 | blog: nalady_v_modre
Rozbalit Rozbalit vše Re: Zvrhlé hříčky s knihovnami pro céčko
Tsss!!! :-D
29.9.2006 18:12 VícNežNic | skóre: 42 | blog: Spáleniště | Ne dost daleko
Rozbalit Rozbalit vše Re: Zvrhlé hříčky s knihovnami pro céčko
Myslel jsem to v tomhle blogu oproti tomu v přednášce. Koš je právě užitečné použití :-)
Copak toho není dost?
29.9.2006 18:21 Lukáš Rýdlo | skóre: 18 | blog: Silný kafe | Brno
Rozbalit Rozbalit vše Re: Zvrhlé hříčky s knihovnami pro céčko
To mi lichotí :-D.

Jinak s tím "Tell me...": aspoň vidíte, proč jsem dostal za vstupní text z angliny jen 17 bodů z 50 ;-). Díky za korekci :-)
θηριον ειμι
29.9.2006 18:29 VícNežNic | skóre: 42 | blog: Spáleniště | Ne dost daleko
Rozbalit Rozbalit vše Re: Zvrhlé hříčky s knihovnami pro céčko
No já dostal takřka dvakrát tolik a taky bych tam dal Tell me, tak nevím.
Copak toho není dost?
29.9.2006 19:21 Lukáš Rýdlo | skóre: 18 | blog: Silný kafe | Brno
Rozbalit Rozbalit vše Re: Zvrhlé hříčky s knihovnami pro céčko
;-) Ale ono tam má být "Tell me". Já tam měl původně "Say me" a pak jsem to opravil ;-). Holt se musím ještě hodně učit :-D
θηριον ειμι
29.9.2006 19:25 VícNežNic | skóre: 42 | blog: Spáleniště | Ne dost daleko
Rozbalit Rozbalit vše Re: Zvrhlé hříčky s knihovnami pro céčko
Aha. Nějak mi dneska není vůbec dobře, tak mi to asi myslí ještě hůř než normálně.
Copak toho není dost?
29.9.2006 19:27 Kyosuke | skóre: 28 | blog: nalady_v_modre
Rozbalit Rozbalit vše Re: Zvrhlé hříčky s knihovnami pro céčko
Což o to, ono to nemusí být vyloženě špatně … :-) Viz třeba tohle:
A: „Say me something.“

B: „As you wish: Me something.“
:-D :-D
29.9.2006 19:40 Lukáš Rýdlo | skóre: 18 | blog: Silný kafe | Brno
Rozbalit Rozbalit vše Re: Zvrhlé hříčky s knihovnami pro céčko
No vida! Takže jsem to měl vlastně úplně správně a vy jste mě jen zmátli :-D :-D :-D
θηριον ειμι
29.9.2006 17:05 MaV | skóre: 6 | Brno
Rozbalit Rozbalit vše Re: Zvrhlé hříčky s knihovnami pro céčko
Odpovědět | Sbalit | Link | Blokovat | Admin
Tak to jsme se museli na přednášce potkat :-)
S tim, že je to hodně zajímavej předmět souhlasím, hlavně se už ale těším na druhou část, která se bude věnovat víc správě systému.
Ale takhle si hrát s LD_PRELINK by mě fakt nenapadlo ;-)
29.9.2006 17:07 MaV | skóre: 6 | Brno
Rozbalit Rozbalit vše Re: Zvrhlé hříčky s knihovnami pro céčko
Samozřejmě jsem myslel LD_PRELOAD
29.9.2006 17:12 k3 | skóre: 15 | blog:  
Rozbalit Rozbalit vše Re: Zvrhlé hříčky s knihovnami pro céčko
takovehle veci se obcas pouzivaji u re :)
29.9.2006 18:19 Lukáš Rýdlo | skóre: 18 | blog: Silný kafe | Brno
Rozbalit Rozbalit vše Re: Zvrhlé hříčky s knihovnami pro céčko
Tak to jsme se museli na přednášce potkat :-)
JJ, byl jsem překvapen, že nás tam bylo dneska (vzhledem ke včerejšímu státnímu svátku a zítřejšímu výkendu) tolik :-D. Asi to poukazuje nejen na fakt, že nejsou dostupné videozáznamy, jak říkal pan Kasprzak :-D

Jinak já si s tím hrál, protože jsem čekal, až se mi provede dist-upgrade mého slackware ;-)
θηριον ειμι
Zdenek.Z avatar 29.9.2006 17:18 Zdenek.Z | skóre: 14
Rozbalit Rozbalit vše Re: Zvrhlé hříčky s knihovnami pro céčko
Odpovědět | Sbalit | Link | Blokovat | Admin
Jen bych si dovolil malou poznámku:
:%s/\(#include \)\(.*\)/\1<\2>/
A UNIXpass byl dobrý předmět. Bohužel jsem si z časových důvodů loni nemohl zapsat dvojku, ale už se těším na příští semestr.
29.9.2006 18:15 Lukáš Rýdlo | skóre: 18 | blog: Silný kafe | Brno
Rozbalit Rozbalit vše Re: Zvrhlé hříčky s knihovnami pro céčko
Ej karamba -- řvalo to na mně, že tam mám blbej "tag", tak jsem ty závorky umazal a zapomněl doplnit entity... Dikec ;-)
θηριον ειμι
30.9.2006 15:13 ondracch | skóre: 19 | blog: Mozková kreč
Rozbalit Rozbalit vše Re: Zvrhlé hříčky s knihovnami pro céčko
Odpovědět | Sbalit | Link | Blokovat | Admin
Konečně blog o něčem. Jen tak dál.
Proč myslíš, že nemůžeš žít jinak? Pořád Tvořím...

Založit nové vláknoNahoru

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.