Što je zamagljivanje koda? Kako prikriti svoj kôd kako bi bio sigurniji

U najranijim danima računalstva, programeri se nisu morali brinuti o mrežama. Mogli su se samo usredotočiti na to da osiguraju da njihov softver služi svojoj namjeni i da se ne sruši prečesto.

A prosječna osoba koja je došla u kontakt s tim softverom nije bila prijetnja. Većina korisnika ne bi se ni zamarala čitanjem korisničkih priručnika isporučenih u kutiji softvera, a kamoli pretraživanjem koda radi ranjivosti.

Tada se pojavio internet i sve promijenio.

Gotovo preko noći računalne su se mreže međusobno povezale. A kako je složenost rasla, tako su rasle i šanse da će se netko naći u onim mrežama kojima tamo nije mjesto.

I češće nego ne, ti bi ljudi imali vještine potrebne za iskorištavanje pogrešnog koda.

I to nas dovodi do danas. Vrijeme je neviđenih prijetnji kibernetske sigurnosti. A čini se da vijesti o cyber-napadima dolaze svakodnevno.

Kao odgovor, mrežni menadžeri postavljaju sve sofisticiranije obrambene sustave kako bi ojačali svoje mreže od uljeza. I oni sada očekuju da će programeri softvera učiniti puno više kako bi osigurali svoj kod kako bi spriječili neovlašteni pristup.

Pa ipak, stvrdnjavanje računalnog koda još uvijek se ne podučava puno u školama kodiranja. Ali to postaje neophodno u modernom razvoju aplikacija.

Da bih to popravio, u ovom ću članku objasniti što je to zamagljivanje koda. Također ću vam dati pregled šest najvažnijih tehnika zamagljivanja koda koje se danas koriste kako biste započeli put pisanja sigurnijeg softvera.

Što je zamagljivanje koda?

Kao što mu samo ime govori, zamagljivanje koda odnosi se na niz programskih tehnika dizajniranih za prikrivanje elemenata programskog koda. To je primarni način na koji programeri mogu braniti svoj rad od neovlaštenog pristupa ili promjene od strane hakera ili lopova intelektualnog vlasništva.

I što je najvažnije, tehnike zamagljivanja koda mogu promijeniti strukturu i metode koje program koristi za rad, ali nikada ne mijenjaju izlaz programa.

Problem je u tome što se mnoge tehnike zamagljivanja koda mogu dodati programskim opterećenjima i povećati vrijeme izvršenja.

Iz tog razloga, presudno je razumjeti koje su tehnike relativno besplatne i koje mogu uzrokovati probleme s izvedbom. Kad spoznate troškove, moguće je uravnotežiti zaštitu i performanse u stvarnom programu.

Evo šest najčešće korištenih tehnika zamućenja kodova koje se danas koriste.

1. Uklonite suvišne podatke

Prva tehnika kaljenja koda koja bi se trebala primijeniti u svakom slučaju jest riješiti se svega što je u vašem kodu nepotrebno.

Na taj ćete način usmjeriti vašu bazu koda i smanjiti površinu napada koju branite.

To znači uklanjanje suvišnih funkcija, uklanjanje pogrešaka s podataka i što više metapodataka. Ukratko - sve što napadaču može dati putokaz koji bi ga mogao dovesti do ranjivosti.

2. Transformirajte podatke

Sljedeća stvar koju treba učiniti je transformirati podatke koje vaš kôd obrađuje kako bi ih učinili neprepoznatljivima.

Taktike poput zamjene vrijednosti izrazima, promjene formata pohrane podataka koju koristite ili čak korištenja binarnih verzija brojeva vašeg koda dodaju složenost. A ta će složenost otežati bilo kome da izvrši reverzni inženjering vašeg koda da iz njega izvuče bilo što korisno.

Na primjer, možda ćete koristiti šifriranje niza kako biste nizove običnog teksta u kodu učinili nečitljivima. Šifriranje niza može koristiti jednostavno base64 kodiranje, što bi pretvorilo ovaj kod:

String s = "Hello World"; Into: String s = new String(decryptString("SGVsbG8gV29ybGQ="));

Iako iskusnom programeru nije teško uočiti što se ovdje događa, morati se nositi s dešifriranjem brojnih žica dugotrajno i frustrirajuće.

A u kombinaciji s nekim drugim tehnikama zamagljivanja koda, transformacija podataka učinkovita je prva crta obrane.

3. Upotrijebite zamućivanje procesnog naloga

Jedan od izazovnih zahtjeva zamagljivanja koda je da vam i dalje treba vaš kôd za rad kako je predviđeno kad završite.

Ali ne postoji ništa što govori da morate izvršiti svoj kod bilo kojim logičnim redoslijedom. Ako pomiješate redoslijed djelovanja koda, još uvijek možete postići pravi rezultat - ali trećoj strani otežajte razumijevanje onoga što vaš kôd radi.

Jedino je upozorenje da morate biti oprezni da ne napravite previše besmislenih petlji i slijepih ulica jer slučajno možete usporiti vrijeme izvršavanja koda.

Kao primjer, pogledajte sljedeći isječak koji izračunava zbroj i prosjek 100 brojeva:

int i=1, sum=0, avg=0 while (i = 100) { sum+=i; avg=sum/i; i++; }int i=1, sum=0, avg=0 while (i = 100) { sum+=i; avg=sum/i; i++; }

Dodavanjem uvjetne varijable moguće je prikriti što kôd radi. To je zato što bi analiza funkcije za početak zahtijevala znanje o tome što se u nju unosi.

U slijedećem isječku, uvjetna varijabla 'random' stvara složeniju strukturu koda koja ga čini mnogo težim za dešifriranje:

int random = 1; while (random != 0) { switch (random) { Case 1: { i=0; sum=1; avg=1; random = 2; break; } case 2: { if (i = 100) random = 3; else random = 0; break; } case 3: { sum+=i;avg=sum/i ; i++; random = 2; break; } } }

4. Isprobajte uklanjanje pogrešaka

Ponekad odlučni napadač može naučiti sve vrste korisnih informacija o vašem kodu proučavanjem njegovih podataka o otklanjanju pogrešaka.

A u nekim bi slučajevima mogli pronaći ključeve za razotkrivanje nekih drugih tehnika zamagljivanja koje upotrebljavate.

Dakle, gdje god je to moguće, dobra je ideja ukloniti pristup informacijama za uklanjanje pogrešaka. A kad to nije opcija, presudno je prikrivanje bilo kojih identifikacijskih podataka u izvješću o otklanjanju pogrešaka.

5. Koristite randomizaciju adresa

Gotovo trideset godina pogreške povezane s rukovanjem memorijom najčešće su softverske ranjivosti koje hakeri iskorištavaju - iako svaki programer zna da problem postoji.

I to nije samo među početnicima. Otprilike 70% ranjivosti u Googleovom web pregledniku Chrome proizlazi iz pogrešaka u memoriji.

Stvarnost je takva da je gotovo nemoguće spriječiti sve pogreške u programiranju memorije, posebno ako koristite jezike poput C i C ++. Ali ono što možete učiniti je uključiti neke značajke randomizacije memorije u svoj kod koje će vam pomoći.

Kada se izvrše, ako virtualne adrese vašeg koda i podataka dobiju slučajne vrijednosti, postaje puno teže pronaći i iskoristiti sve neprimjećene ranjivosti.

Plus, it adds another benefit, too. It makes it so that even a successful hack of your code is difficult – if not impossible – to replicate. That alone makes it much less likely that an attacker will waste their time trying to hack your software.

6. Rotate the Obfuscated Code

As much as the above techniques work to frustrate attackers, they're far from a perfect defense. Anyone with enough time and skills will still find a way to defeat them. But that brings us to one of the most essential obfuscation techniques of all.

Since all obfuscation techniques aim to increase the complexity of an attacker's work, anything you can do to set them back to square one is a great defensive measure. So, to keep your code protected, use the internet to your advantage.

You can issue periodic updates that rotate the nature and specifics of the obfuscation techniques you're using. Every time you do, all the work someone may have been putting into cracking your software becomes a waste of time.

If you rotate your obfuscation tactics often enough, it won't be worth it for anyone to try and keep up an analysis long enough to succeed.

Security Through Obscurity

The bottom line here is that there's no such thing as 'unhackable' code. No matter how hard a programmer tries, there's always going to be a vulnerability somewhere. Not that you shouldn't keep trying, though.

But in the real world, your code doesn't have to be perfect. It just has to be hard enough to crack that nobody in their right mind would bother trying. And for those who aren't in their right mind, it just has to be complicated and time-consuming enough to keep them at bay.

And that's just what the six tactics above can help you accomplish. But remember, no defense comes without a cost. When deploying these options, make sure to weigh the execution-time penalties they may create against the benefits they provide.

If you're working on something especially sensitive, throwing every possible curveball might be worth it. But if you're writing a quote of the day generator – maybe don't worry as much.

However you choose to proceed, though, don't ever forget to take the time to harden your code in one way or another. It's just the right way to do things in a world filled with cybersecurity threats around every corner.

Featured photo by ThisIsEngineering from Pexels.