Vad är Obfuscation?
On oktober 25, 2021 by adminVad är Code Obfuscation?
Code Obfuscation är processen att modifiera en körbar fil så att den inte längre är användbar för en hackare men fortfarande är fullt fungerande. Processen kan ändra faktiska metodinstruktioner eller metadata, men ändrar inte programmets utdata. För att vara tydlig: med tillräckligt med tid och ansträngning kan nästan all kod bakåtkompileras. På vissa plattformar som Java, Android, iOS eller .NET (t.ex. Xamarin, C#, VB.NET, F#) kan gratis dekompilatorer dock enkelt göra en reverse-engineering av källkoden från en körbar fil eller ett bibliotek på praktiskt taget ingen tid och utan ansträngning. Automatiserad kodförvrängning gör det svårt och ekonomiskt ogenomförbart att göra reverse-engineering av ett program.
Varför använda en kodförtydligare?
Du kan skydda dig mot stöld av affärshemligheter (immateriella rättigheter), obehörig åtkomst, kringgående av licenser eller andra kontroller och upptäckt av sårbarheter genom att göra det mycket svårare att omvända ett program.
Hur fungerar förtydligande?
Kodförtydligande består av många olika tekniker som kan komplettera varandra för att skapa ett skiktat försvar. Den är mest effektiv för språk som skapar någon form av instruktioner på mellannivå, t.ex. Java eller .NET-språken som C#, VB.NET, Managed C++, F# osv. Några typiska exempel på tekniker för mörkläggning och applikationssäkerhet är:
Rename Obfuscation
Renaming ändrar namnet på metoder och variabler. Det gör den dekompilerade källkoden svårare för en människa att förstå men ändrar inte programutförandet. De nya namnen kan använda olika scheman som ”a”, ”b”, ”c”, eller siffror, oskrivbara tecken eller osynliga tecken. Namnen kan överbelastas så länge de har olika räckvidd. Namnförvrängning är en grundläggande omvandling som används av de flesta .NET- (C# etc.), iOS-, Java- och Android-förvrängare.
Kryptering av strängar
I en hanterad körbar fil är alla strängar tydligt upptäckbara och läsbara. Även när metoder och variabler har bytt namn kan strängar användas för att hitta kritiska kodavsnitt genom att leta efter strängreferenser i den binära koden. Detta inkluderar meddelanden (särskilt felmeddelanden) som visas för användaren. För att utgöra en effektiv barriär mot denna typ av angrepp döljer strängkryptering strängar i den körbara filen och återställer endast deras ursprungliga värde vid behov. Avkryptering av strängar vid körning medför vanligtvis en liten prestandaförlust vid körning.
Kontrollflödesfördunkling
Kontrollflödesfördunkling syntetiserar villkorliga, förgrenande och iterativa konstruktioner som ger giltig körbar logik, men som ger icke-deterministiska semantiska resultat när den dekompileras. Förenklat uttryckt får det den dekompilerade koden att se ut som spaghettilogik, vilket är mycket svårt för en hackare att förstå. Dessa tekniker kan påverka en metods prestanda vid körning.
Instruktionsmönstertransformation
Konverterar vanliga instruktioner som skapas av kompilatorn till andra, mindre uppenbara konstruktioner. Det rör sig om helt lagliga maskinspråksinstruktioner som kanske inte är helt tydliga i högnivåspråk som Java eller C#. Ett exempel är caching av transienta variabler som utnyttjar den stackbaserade karaktären hos Java- och .NET-körtiderna.
Dummy Code Insertion
Insättning av kod i den körbara filen som inte påverkar programmets logik, men som bryter sönder dekompilatorer eller gör det mycket svårare att analysera kod som är bakåtkompilerad.
Underanvänd kod och borttagning av metadata
Borttagning av felsökningsinformation, icke-essentiell metadata och använd kod från program gör dem mindre och minskar den information som är tillgänglig för en angripare. Detta förfarande kan förbättra körprestandan något.
Binary Linking/Merging
Denna omvandling kombinerar flera ingående körbara program/librärer till en eller flera utgående binärer. Länkning kan användas för att göra programmet mindre, särskilt när det används tillsammans med omdöpning och beskärning. Det kan förenkla distributionsscenarier och kan minska den information som är tillgänglig för hackare.
Opaque Predicate Insertion
Obfuskar genom att lägga till villkorliga förgreningar som alltid utvärderar till kända resultat-resultat som inte enkelt kan bestämmas via statisk analys. Detta är ett sätt att införa potentiellt felaktig kod som aldrig kommer att exekveras, men som är förvirrande för angripare som försöker förstå dekompilerade utdata.
Anti-Tamper
En obfuscator kan injicera ett självskydd i koden för att verifiera att programmet inte har manipulerats på något sätt. Om manipulering upptäcks kan den stänga av programmet, begränsa funktionaliteten, framkalla slumpmässiga krascher (för att dölja orsaken till kraschen) eller utföra någon annan anpassad åtgärd. Den kan också skicka ett meddelande till en tjänst för att ge detaljer om den manipulering som upptäckts.
Anti-Debug
När en hackare försöker piratkopiera eller förfalska din app, stjäla dina data eller ändra beteendet hos en kritisk del av infrastruktursmjukvara börjar han eller hon med största sannolikhet med att göra en reverse engineering och gå igenom din applikation med en felsökare. En obfuscator kan lägga in ett lager av självskydd för applikationen genom att injicera kod för att upptäcka om din produktionsapplikation körs i en felsökare. Om en felsökare används kan den förstöra känsliga data (för att skydda dem från stöld), orsaka slumpmässiga krascher (för att dölja att kraschen var resultatet av en felsökningskontroll) eller utföra någon annan anpassad åtgärd. Den kan också skicka ett meddelande till en tjänst för att ge en varningssignal.
Bör jag förvränga min applikation?
Överväg starkt att använda förvrängning och självskydd av appen vid körning om du släpper programvara som körs i en miljö som inte är betrodd och som har immateriell egendom, ger tillgång till känslig information eller har funktionalitet med grind. Förtrollning gör det mycket svårare för angripare att granska koden och analysera programmet. Det gör det också svårt för hackare att felsöka och manipulera programmet. Slutmålet är att lägga till ett skyddslager för att göra det difficiöst att extrahera eller upptäcka användbar information, t.ex. affärshemligheter (IP), autentiseringsuppgifter eller säkerhetssårbarheter från en applikation. Det ska också göra det svårare att ändra programlogik eller packa om ett program med skadlig kod.
Lämna ett svar