Preskočiť na hlavný obsah

Matúš odporúča:

LD_PRELOAD: čo to je a ako to využiť

 Podľa mojich štatistík drtivá väčšina mojich návštevnikov používa Unixu podobný alebo Unixový operačný systém. Čo majú tieto OS spoločné? Všetky majú svoj preloader, ktorý sa využíva na načítanie zdieľaných knižníc. Čo to je? V tomto článku sa budem primárne venovať Linuxu, ale to isté sa dá aj na iných unixových systémoch, len s inými premennými pred cestou ku programu.  Poznámka autora: Funkcie a príkazy sa pravidelne zamiešavajú v tomto článku, ale obidve znamenajú to isté. Keď zapnete napríklad Counter-Strike cez Steam, tak sa toho na pozadí deje veľmi veľa. Schválne si skúste otvoriť terminál a spustiť strace , pričom za ten príkaz dáte cestu k súboru CSka. Uvidíte veľmi veľa systémových volaní, ktoré možu byť napríklad execve, send, recv, atď.. Implementácie týchto príkazov sa skrývajú v zdieľaných knižniciach, ako je napríklad libc.so, kde prípona .so je skratka pre Shared Object, čo je obdoba DLL z Windowsu, ale na Linuxe. Ale čo ak si prednačítame cez premennú LD_PRE...

LD_PRELOAD: čo to je a ako to využiť

 Podľa mojich štatistík drtivá väčšina mojich návštevnikov používa Unixu podobný alebo Unixový operačný systém. Čo majú tieto OS spoločné? Všetky majú svoj preloader, ktorý sa využíva na načítanie zdieľaných knižníc.

Čo to je?

V tomto článku sa budem primárne venovať Linuxu, ale to isté sa dá aj na iných unixových systémoch, len s inými premennými pred cestou ku programu.

 Poznámka autora: Funkcie a príkazy sa pravidelne zamiešavajú v tomto článku, ale obidve znamenajú to isté.

Keď zapnete napríklad Counter-Strike cez Steam, tak sa toho na pozadí deje veľmi veľa. Schválne si skúste otvoriť terminál a spustiť strace, pričom za ten príkaz dáte cestu k súboru CSka. Uvidíte veľmi veľa systémových volaní, ktoré možu byť napríklad execve, send, recv, atď.. Implementácie týchto príkazov sa skrývajú v zdieľaných knižniciach, ako je napríklad libc.so, kde prípona .so je skratka pre Shared Object, čo je obdoba DLL z Windowsu, ale na Linuxe.

Ale čo ak si prednačítame cez premennú LD_PRELOAD, ktorú dáme spolu s jej hodnotou pred cestu k binárnemu súboru, cestu ku našej zdieľanej knižnici s rovnakými definíciami funkcií, ktoré ten daný program volá, ale s inou implementáciou, napríklad s funkciou getline(), ktorá slúži na zaznámenavanie vstupu z klávesnice, pričom to potom odosiela cez curl na server niekde do Ruska to, čo ste tam zadali.

Úúúúú, to vyzerá zaujímavo, ako si urobím vlastnú prednačítanú knižnicu?

Poznámka autora: Celý projekt nájdete na mojom GitLabe.
V prvom rade musíte vedieť programovať v asembleri/céčku/C++/jazyku, ktorý vám nebráni ,,robiť sprostosti˝. Ja, keď som si toto skúšal, tak som najskôr robil definície tých funkcií, ktoré som chcel ,,uniesť˝, v Ruste. Veľmi skoro som zistil, že Rust kvôli jeho prísnosti nie je dobrý na tento projekt. Tak som sa prehovoril, že to budem robiť v C++ hlavne kvôli tomu, že moderné verzie tohto jazyka až príliš nápadne pripomínajú Rust. To ma presvedčilo, a tak som sa s prnou vervou vrhol do nastavovania projektu. 

Najskôr som si vyhliadol funkcie, ktorým by som chcel prepísať definíciu cez túto premennú. Konkrétne som si vyhliadol funkcie execv, execve, execvp a execvpe. Skopíroval som si ich definície do extern "C" bloku v hlavičkovom súbore softexecenv.h. Potom som si vytvoril triedu SoftExecEnv, kde som urobil wrapper funkciu our_exec, ktorú som tam aj implementoval. Následne som si vytvoril implementačný súbor softexecenv.cpp pre implementáciu tých štyroch funkcií, ktoré som zadefinoval v hlavičkovom súbore spomenutom pred chvíľou.

Nakoniec som si vytvoril Makefile súbor na uľahčenie zostavovania našej zdieľanej knižnice a príkladný program v jazyku C, ktorý volá funkciu execvpe.

Záver

LD_PRELOAD je premenná, ktorá má veľmi veľa potenciálnych a aj zlých využití. Naozaj vám ju odporúčam začať používať s vašou knižnicou.

Ak sa vám tento článok páčil, tak nezabudnite dať srdiečko a repost na LinkedIne, hviezdičku a boost na Mastodone a upvote a crosspost na Lemmy. Verím, že ak budem mať čas a vyhliadnem si nejakú zaujímavú funkciu, ktorá je na linuxových distribúciach, tak o nej určite napíšem.
Posledné slovo: Pre túto sériu (zatiaľ článok o initramfs a tento) som sa nechal inšpirovať YouTuberom Nir Lichtman, ktorý robí veľmi podrobné analýzy linuxového jadra apod. Má namierené ku 100 000 odoberateľom, čiže mu choďte dať odber, zaslúži si to.

Komentáre

Fanúšikmi milované články

Re-recenzia NixOS: Ako sa používa?

 Asi pred rokom som napísal kontroverzný článok  na kontroverziu v NixOS. Áno, viem, je to paradox. Potom som prešiel na Fedoru od napísania tohoto článku, pričom ju stále používam na mojom Macu, lebo tam mám dôležité veci. Ale teraz po roku som sa rozhodol, že NixOS vyskúšam znova, tentokrát ale ako používateľ, ktorý nesleduje dianie okolo NixOS (na fórum tejto distribúcie som sa prihlásil iba teraz, aby som mohol ľahšie dohľadať príspevok a skopírovať odkaz naň). Poďme sa pozrieť, ako som si ho nastavil. Poznámka autora: Aktuálnu konfiguráciu nájdete na https://gitlab.com/TenTypekMatus/nixos .  Čo to je? NixOS je linuxová distribúcia, ktorá je nemenná, a ktorá sa konfiguruje pomocou jazyka, ktorý sa volá Nix, ale k nemu sa ešte dostaneme. Je to metadistribúcia, ktorú si môžete nakonfigurať tak, ako vy chcete. Inštalácia Poznámka autora: Kroky inštalácie sú v inštalátore NixOS iné než tie, ktoré budem popisovať. Ja i...

Ako a prečo som si nainštaloval GSI na môj telefón

 Asi pred rokom som  napísal článok o samsungových telefónoch , kde som ich skritizoval za neštandardný prístup flashovania alternatívnych operačných systémov a za nutnosť používať Odinovské .tar súbory. Ale to sa všetko zmenilo. Som starší, múdrejši, a rozumnejší, ako som bol vtedy. Plus pribudlo veľmi veľa návodov a zdrojov, z ktorých sa dá čerpať pre túto tému. Tak sa poďme spolu pozrieť na to, ako som si dal GSI na môj telefón. Poznámka: GSI je skratka pre Generic System Image (generický obraz operačného systému). Viac si o tomto formáte môžete prečítať  tu. Prečo? Primárnym dôvodom, prečo som sa rozhodol toto spraviť, je, že na predinštalovanom Androide, ktorý dostanete spolu so zariadením, je príliš veľa softvérového odpadu. Máte tam aplikácie od Samsungu, Googlu a z nejakého dôvodu aj od Microsoftu a Mety. Pri Samsungu je logické, prečo tam chcú mať svoje aplikácie. Pri Googli taktiež, plus je to aj tým, že tam máte mobilné služby od Googlu.  Ale nechápem, nač...

Koniec NixOS: Kontroverzie a čo ďalej?

 Kto nebol na internete asi skoro celý mesiac, tak nevie, čo sa deje, ale pre tých, čo to nevedia, tak to priblížim. Dvadsiatého šiestého apríla bol publikovaný  tento blogový článok  od Eelca Dostru, človeka, ktorý napísal svoju diplomovú prácu na Nix, a ktorý kritizuje komunitu, ktorá sa vytvorila okolo Nixu. NixCon + (vložte nejakú zbrojársku spoločnosť sem) = nezáujem Keď sa zistilo, že Anduril, čo je vlastne zbrojárska spoločnosť, bude sponzorovať NixCon, čo je akcia, kde sa stretávajú ľudia, aby mohli odprezentovať svoje projekty, zážitky a skúsenosti s Nixom/s NixOS. A Anduril je zbrojárska firma, ktorá vyrába drony s umelou inteligenciou, ktoré sú nasadené na americko-mexickej hranici na prevenciu migrantov. Prečo je to zlé? Linuxové komunity (a NixOS najviac) sú ľudia, ktorí sú v drvivej väčšine prípadov proti zbrojárskym spoločnostiam. Bohužiaľ, organizátori nestiahli tohoto sponzora z akcie. Nasilu pretlačené ,,vločky˝ Eelco je známy aj svojou netrpezlivos...

Initramfs: Čo to je a ako to využiť v náš prospech

 Podľa mojich štatistík, ktoré si pozerám, tak mojou druhou najväčšou skupinou su tí, ktorí sú na nejakej linuxovej distribúcií (mne sa to tam zobrazuje iba ako ,,Linux˝). Prečo som práve toto napísal? Lebo práve táto skupina ľudí nepriamo štartuje svoj systém cez niečo, čo sa volá initramfs. Poďme sa to pozrieť na to, čo to je a ako to využiť v náš prospech. Čo to je? V skratke je initramfs pico-operačný systém, ktorý je skomprimovaný cez program, ktorý sa volá cpio, a ktorý sa pri spustení systému rozbalí do operačnej pamäte. Je to starý, ale spoľahlivý spôsob, ako skomprimovať súbory a používa sa od nepamäti. Väčšinou sa komprimuje do formátu, ktorý sa volá Gzip. Initramfs sa využíva na rôzne veci. Či už na resetovanie hesla, pripojenia obskúrne nastaveného média (napríklad 40 diskov, ktoré sú v MergerFS zväzku (MergerFS = súborový systém, ktorý slúži na vytvorenie jedného superdisku z viacero menších diskov) zašifrované cez LUKS + polovica diskov má iný súborový systém), alebo ...

MatuushOS: Status update + plány do budúcna

 Neskutočné sa stalo skutočným: Vyšiel nový Status update pre môj operačný systém, ktorý sa volá MatuushOS. Tentokrát mám veľmi veľa noviniek, ktoré sa udiali na tomto operačnom systéme. Čiže sa na ne poďme vrhnúť. Recenv O Recenve som rozprával už predtým v  článku o Initramfs , ale tým, že vás mám rád, tak vám zhrniem, čo to je.  Recenv je veľmi minimálne obnovovacie prostredie, ktoré sa nastavuje cez parametre, ktoré sa predávajú linuxovému jadru. Cezeň sa dá aktualizovať/obnoviť operačný systém. Pri jeho tvorení som sa inšpiroval obnovovacím procesom, ktorý je vo Windowse, MacOS a na Androide. Ale načo vytvárať ďaľší aktualizačný systém, keď existuje systemd-sysupdate a bootc? Preto, lebo MatuushOS je 100% bez systemd. Toto rozhodnutie bolo urobené z dôvodu, že systemd je  napísané v céčku , čo je jazyk, kde sa stráca produktivita z dôvodu trápenia sa so zostavovacím systémom a ktorý je 50 rokov starý , čiže vôbec nie je podľa mňa vhodný na nové projekty. A áno, ...