Obfuscation (fra latin obfuscare - at obscure, obscure; og engelsk obfuscate - at gøre ikke-oplagt, forvirrende, forvirrende) eller kode obfuscation - bringer kildekoden eller den eksekverbare kode for programmet til en form, der bevarer dets funktionalitet, men gør det vanskeligt at analysere, forstå algoritmerne for arbejde og modifikation under dekompilering .
"Obfuscing" af koden kan udføres både på niveau med navne på programkomponenter og på niveau med programalgoritmer . For at skabe sløret assembler-tekst kan der bruges specialiserede kompilatorer , der bruger ikke-oplagte eller udokumenterede funktioner i programafviklingsmiljøet . Der er også specielle programmer, der producerer obfuscation, kaldet obfuscators ( eng. obfuscator ).
Besvær med at dekompilere / fejlfinde og undersøge programmer for at opdage funktionalitet;
Vanskeligheder ved at dekompilere proprietær software for at forhindre reverse engineering eller omgåelse af DRM- og licensverifikationssystemer ;
svært ved at knække software ;
Optimering af programmet for at reducere størrelsen af den kørende kode og (hvis der anvendes et ikke- kompileret sprog) for at fremskynde arbejdet;
Demonstration af sprogets ikke-indlysende muligheder og programmørens kvalifikationer (hvis det gøres manuelt og ikke med værktøjer);
I JavaScript , VBScript og lignende scriptsprog er programmets kildekode tilgængelig for brugeren . I dette tilfælde kan formatering af teksten og udskiftning af navne gøre teksten mindre læsbar.
Kildetekst på C -sprog :
int COUNT = 100 ; float TAX_RATE = 0,2 ; for ( int i = 0 ; i < ANTAL ; i ++ ) { skat [ i ] = original_pris [ i ] * TAX_RATE ; pris [ i ] = originalpris [ i ] + moms [ i ]; }Kode efter sløring [1] :
for ( int a = 0 ; a < 100 ; a ++ ) { b [ a ] = c [ a ] * 0,2 ; d [ a ] = c [ a ] + b [ a ];}Mere komplekst eksempel:
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 , "_." : "|" ];}Som regel reducerer tilsløring på maskinkodeniveau hastigheden af eksekveringen og øger følgelig programmets eksekveringstid. Derfor bruges den på sikkerhedskritiske , men ikke hastighedskritiske steder i programmet, såsom kontrol af registreringskoden [2] .
Den enkleste måde at sløre maskinkode på er at indsætte inaktive konstruktioner i den (såsom or ax, ax).
I modsætning til konventionelle programmeringssprog som C++ eller Pascal , der kompilerer til maskinkode , kompilerer Java-sproget , NetP og .NET platformsprogene kildekode til mellemkode ( bytecode ), der indeholder nok information til at rekonstruere kildekoden tilstrækkeligt. Af denne grund bruges mellemkodeobfuskation for disse sprog.
Som nævnt ovenfor er det ret nemt at dekompilere Java- og .NET-programmer. I dette tilfælde giver obfuscatoren uvurderlig hjælp til dem, der ønsker at skjule deres kode fra nysgerrige øjne. Ofte, efter sløring, bliver den dekompilerede kode ikke genkompileret.
HTML - obfuskation hjælper spammere : på en e-mail-klient , der er i stand til at vise HTML, læses teksten, men anti-spam-filteret , som behandler den originale HTML-fil, sender den uønskede besked uden at genkende den forbudte linje i den.
Det enkleste eksempel på sløret HTML:
< b > Mash </ b >< b > ina </ b >Ved visning vil brugeren se ordet " Machine ", mens det i kildekoden er dissekeret og opfattet som to separate ord.
På fortolkede sprog fylder sløret kode mindre end kildekoden og kører ofte hurtigere end kildekoden. Moderne obfuscatorer erstatter også konstanter med tal, optimerer array -initialiseringskode og udfører andre optimeringer, der er problematiske eller umulige på kildeniveau.
Problemet med størrelsesreduktion er vigtigt, for eksempel ved programmering til mobiltelefoner i J2ME , hvor størrelsen af programmet er stærkt begrænset. JavaScript-obfuskation reducerer størrelsen af HTML- filer og fremskynder dermed indlæsningen.
Beskyttelse af kildekoden mod at blive redigeret for profit.
Obfuskationskode kan blive mere platform- eller compilerafhængig.
Obfuscatoren forhindrer en udenforstående i at finde ud af, hvad koden laver, men forhindrer også udvikleren i at fejlsøge den. Ved fejlfinding skal du slukke for obfuscatoren.
Selvom sløring hjælper med at gøre et distribueret system mere sikkert, bør det ikke være begrænset til det. Tilsløring er sikkerhed gennem uklarhed . Ingen af de eksisterende obfuscatorer garanterer kompleksiteten af dekompilering og giver ikke sikkerhed på niveau med moderne kryptografiske ordninger. Det er ret sandsynligt, at effektiv beskyttelse er umulig (i det mindste i en bestemt klasse af problemer, der skal løses).
En moderne obfuscator er en kompleks softwarepakke. På trods af omhyggeligt design og test , kryber fejl ofte ind i obfuscatorer. Så der er en ikke-nul chance for, at koden, der føres gennem obfuscatoren, slet ikke virker. Og jo mere komplekst programmet er under udvikling, jo større er denne sandsynlighed.
De fleste mellemkodesprog kan oprette eller kalde objekter ved deres klassenavne . Moderne obfuscatorer giver dig mulighed for at redde disse klasser fra at omdøbe, men sådanne begrænsninger reducerer programmernes fleksibilitet.