Obfuszkáció ( latin obfuscare - homályos, homályos; és angol obfuscate - nem nyilvánvaló, zavaró, zavaró) vagy kód obfuszkáció - a program forráskódjának vagy végrehajtható kódjának olyan formába hozása, amely megőrzi a funkcionalitását, de teszi azt nehéz elemezni, megérteni a munka és a dekompiláció során történő módosítás algoritmusait .
A kód "elzavarása" végrehajtható mind a programkomponensek nevei, mind a programalgoritmusok szintjén . Obfuszkált assembler szövegek létrehozásához speciális fordítók használhatók, amelyek a programvégrehajtási környezet nem nyilvánvaló vagy nem dokumentált szolgáltatásait használják . Vannak speciális programok is, amelyek obfuszkációt generálnak, ezeket obfuszkátoroknak nevezik ( eng. obfuscator ).
Nehézségek a programok visszafordításában / hibakeresésében és vizsgálatában a funkcionalitás felfedezése érdekében;
A védett szoftver visszafordításának nehézségei a DRM és licencellenőrző rendszerek visszafejtésének vagy megkerülésének megakadályozása érdekében ;
Szoftver feltörésének nehézségei ;
A program optimalizálása a futó kód méretének csökkentése és (ha nem lefordított nyelv használata esetén) a munka felgyorsítása érdekében;
A nyelv nem nyilvánvaló lehetőségeinek és a programozó képzettségének bemutatása (ha kézzel, és nem eszközökkel történik);
JavaScriptben , VBScriptben és hasonló szkriptnyelvekben a program forráskódja elérhető a felhasználó számára . Ebben az esetben a szöveg formázása és a nevek cseréje kevésbé olvashatóvá teheti a szöveget.
Forrásszöveg C nyelven :
int COUNT = 100 ; float TAX_RATE = 0,2 ; for ( int i = 0 ; i < COUNT ; i ++ ) { adó [ i ] = eredeti ár [ i ] * TAX_RATE ; ár [ i ] = eredeti_ár [ i ] + adó [ i ]; }Kód a homályosítás után [1] :
for ( int a = 0 ; a < 100 ; a ++ ) { b [ a ] = c [ a ] * 0,2 ; d [ a ] = c [ a ] + b [ a ];}Bonyolultabb példa:
char * M , A , Z , E = 40 , J [ 40 ], T [ 40 ]; main ( C ){ for ( * J = A = scanf ( M = "%d" , & C ); --E ; _ J [ E ] = T [ E ] = E ) printf ( "._" ); for (;( A -= Z =! Z ) || ( printf ( " \n |" ) , A = 39 , C -- ) ; Z || printf ( M )) M [ Z ] = Z [ A - ( E = A [ J - Z ]) &&! C & A == T [ A ] | 6 << 27 < rand () ||! C &! Z ? J [ T [ E ] = T [ A ]] = E , J [ T [ A ] = A - Z ] = A , "_." : "|" ];}Általános szabály, hogy a gépi kód szintjén történő obfuszkálás csökkenti a végrehajtás sebességét, és ennek megfelelően megnöveli a program végrehajtási idejét. Ezért a program biztonságkritikus , de nem sebességkritikus helyein használják, például a regisztrációs kód ellenőrzésekor [2] .
A gépi kód elhomályosításának legegyszerűbb módja inaktív konstrukciók beszúrása (például or ax, ax).
Ellentétben a hagyományos programozási nyelvekkel, mint például a gépi kódra fordító C++ vagy Pascal , a Java nyelv , a NetP és a .NET platformnyelvek a forráskódot köztes kódba ( bytecode ) fordítják, amely elegendő információt tartalmaz a forráskód megfelelő rekonstruálásához. Emiatt ezeknél a nyelveknél köztes kódzavarást alkalmaznak.
Mint fentebb említettük, a Java és .NET programok visszafejtése meglehetősen egyszerű. Ebben az esetben az obfuszkátor felbecsülhetetlen segítséget nyújt azoknak, akik el akarják rejteni kódjukat a kíváncsi szemek elől. Az obfuszkálás után gyakran nem fordítják újra a visszafejtett kódot.
A HTML obfuszkáció segíti a spamküldőket : a HTML megjelenítésére képes levelezőprogramban a szöveg beolvasásra kerül, de az eredeti HTML-fájllal foglalkozó anti-spam szűrő úgy továbbítja a kéretlen üzenetet, hogy nem ismeri fel benne a tiltott sort.
A legegyszerűbb példa az obfuszkált HTML-re:
< b > Mash </ b >< b > ina </ b >Megtekintéskor a felhasználó a " Gép " szót fogja látni, míg a forráskódban ez feldarabolódik és két külön szóként érzékelhető.
Az értelmezett nyelveken az obfuszkált kód kevesebb helyet foglal el, mint a forráskód, és gyakran gyorsabban fut, mint a forráskód. A modern obfuszkátorok a konstansokat számokra cserélik, optimalizálják a tömb inicializálási kódját és egyéb olyan optimalizációkat hajtanak végre, amelyek problémás vagy lehetetlenek a forrás szintjén.
A méretcsökkentés problémája fontos például, amikor mobiltelefonokra programozunk J2ME - ben , ahol a program mérete erősen korlátozott. A JavaScript obfuszkáció csökkenti a HTML - fájlok méretét, és így felgyorsítja a betöltést.
A forráskód védelme a haszonszerzés céljából történő szerkesztéstől.
Az obfuszkációs kód inkább platform- vagy fordítófüggővé válhat.
Az obfuszkátor megakadályozza, hogy egy kívülálló megtudja, mit csinál a kód, de megakadályozza a fejlesztőt a hibakeresésben. Hibakereséskor ki kell kapcsolni az obfuszkátort.
Noha a homályosítás segít az elosztott rendszer biztonságosabbá tételében, nem korlátozódhat erre . Az elhomályosítás biztonság a homályon keresztül . A meglévő obfuszkátorok egyike sem garantálja a dekompiláció bonyolultságát, és nem nyújt biztonságot a modern kriptográfiai sémák szintjén. Valószínű, hogy a hatékony védelem lehetetlen (legalábbis a megoldandó problémák bizonyos osztályaiban).
A modern obfuszkátor egy összetett szoftvercsomag. A gondos tervezés és tesztelés ellenére gyakran hibák kúsznak be az obfuszkátorokba. Tehát nem nulla esély van arra, hogy az obfuszkátoron áthaladó kód egyáltalán nem fog működni. És minél összetettebb a fejlesztés alatt álló program, annál nagyobb ez a valószínűség.
A legtöbb köztes kódnyelv képes objektumokat létrehozni vagy meghívni osztálynevük alapján . A modern obfuszkátorok lehetővé teszik, hogy megmentse ezeket az osztályokat az átnevezéstől, de az ilyen korlátozások csökkentik a programok rugalmasságát.