Obfuscation (från latin obfuscare - att obscure, obscure; och engelska obfuscate - för att göra icke-uppenbar, förvirrande, förvirrande) eller kodobfuskation - bringar källkoden eller den körbara koden för programmet till en form som bevarar dess funktionalitet, men gör det svårt att analysera, förstå algoritmerna för arbete och modifiering under dekompilering .
"Obfuskera" koden kan utföras både på nivån för namn på programkomponenter och på nivån för programalgoritmer . För att skapa obfuskerad assemblertext kan specialiserade kompilatorer användas som använder icke-uppenbara eller odokumenterade funktioner i programexekveringsmiljön . Det finns också speciella program som producerar obfuscation, som kallas obfuscators ( eng. obfuscator ).
Svårighet att dekompilera / felsöka och undersöka program för att upptäcka funktionalitet;
Svårigheter att dekompilera proprietär programvara för att förhindra omvänd konstruktion eller kringgående av DRM- och licensverifieringssystem ;
Svårigheter att knäcka programvara ;
Optimering av programmet för att minska storleken på körkoden och (om ett icke- kompilerat språk används) för att påskynda arbetet;
Demonstration av språkets icke-uppenbara möjligheter och programmerarens kvalifikationer (om det görs manuellt och inte med verktyg);
I JavaScript , VBScript och liknande skriptspråk är källkoden för programmet tillgänglig för användaren . I det här fallet kan formatering av texten och byte av namn göra texten mindre läsbar.
Källtext på C- språk :
int COUNT = 100 ; float TAX_RATE = 0,2 ; för ( int i = 0 ; i < ANTAL ; i ++ ) { moms [ i ] = ursprungspris [ i ] * TAX_RATE ; pris [ i ] = ursprungspris [ i ] + moms [ i ]; }Kod efter obfuskation [1] :
för ( int a = 0 ; a < 100 ; a ++ ){ b [ a ] = c [ a ] * 0,2 ; d [ a ] = c [ a ] + b [ a ];}Mer komplext exempel:
char * M , A , Z , E = 40 , J [ 40 ], T [ 40 ]; main ( C ){ för ( * J = A = scanf ( M = "%d" , & C ); --E ; _ J [ E ] = T [ E ] = E ) printf ( "._" ); för (;( 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 , "_." : "|" ];}Som regel minskar obfuskering på nivån för maskinkod exekveringshastigheten och ökar följaktligen exekveringstiden för programmet. Därför används den på säkerhetskritiska , men inte hastighetskritiska ställen i programmet, som att kontrollera registreringskoden [2] .
Det enklaste sättet att fördunkla maskinkoden är att infoga inaktiva konstruktioner i den (som or ax, ax).
Till skillnad från konventionella programmeringsspråk som C++ eller Pascal som kompilerar till maskinkod , kompilerar Java-språken , NetP och .NET - plattformsspråken källkod till mellankod ( bytecode ) som innehåller tillräckligt med information för att rekonstruera källkoden på ett adekvat sätt. Av denna anledning används mellanliggande kodobfuskering för dessa språk.
Som nämnts ovan är det ganska enkelt att dekompilera Java- och .NET-program. I det här fallet ger obfuscatorn ovärderlig hjälp till dem som vill dölja sin kod från nyfikna ögon. Ofta, efter obfuskering, kompileras inte den dekompilerade koden om.
HTML -obfuskation hjälper spammare : på en e- postklient som kan visa HTML läses texten, men anti-spam-filtret , som hanterar den ursprungliga HTML-filen, skickar det oönskade meddelandet utan att känna igen den förbjudna raden i det.
Det enklaste exemplet på obfuskerad HTML:
< b > Mash </ b >< b > ina </ b >Vid visning kommer användaren att se ordet " Maskin ", medan det i källkoden dissekeras och uppfattas som två separata ord.
I tolkade språk tar obfuskerad kod mindre utrymme än källkoden och går ofta snabbare än källkoden. Moderna obfuscatorer ersätter också konstanter med siffror, optimerar arrayinitieringskod och utför andra optimeringar som är problematiska eller omöjliga på källnivån.
Problemet med storleksminskning är viktigt, till exempel vid programmering för mobiltelefoner i J2ME , där storleken på programmet är kraftigt begränsad. JavaScript-obfuskering minskar storleken på HTML- filer och påskyndar därmed laddningen.
Skydda källkoden från att redigeras i vinstsyfte.
Obfuskationskod kan bli mer plattforms- eller kompilatorberoende.
Obfuscatorn hindrar en utomstående från att ta reda på vad koden gör, men hindrar också utvecklaren från att felsöka den. Vid felsökning måste du stänga av obfuscatorn.
Även om obfuskering hjälper till att göra ett distribuerat system säkrare, bör det inte begränsas till det. Obfuskation är säkerhet genom dunkel . Ingen av de befintliga obfuscatorerna garanterar komplexiteten i dekompileringen och ger inte säkerhet på nivån för moderna kryptografiska system. Det är ganska troligt att ett effektivt skydd är omöjligt (åtminstone i någon speciell klass av problem som ska lösas).
En modern obfuscator är ett komplext programpaket. Ofta, trots noggrann design och testning , kryper buggar in i obfuscators. Så det finns en chans som inte är noll att koden som passeras genom obfuscatorn inte kommer att fungera alls. Och ju mer komplext programmet som utvecklas, desto större är sannolikheten.
De flesta mellankodspråk kan skapa eller anropa objekt efter deras klassnamn . Moderna obfuscatorer låter dig rädda dessa klasser från att byta namn, men sådana begränsningar minskar programmens flexibilitet.