Mi a Code Obfuscation? Hogyan rejtse el kódját biztonságosabbá tétele érdekében

A számítás legkorábbi napjaiban a fejlesztőknek nem kellett aggódniuk a hálózatok miatt. Csak arra összpontosíthattak, hogy szoftverük a rendeltetését szolgálja, és ne essen össze túl gyakran.

És egy átlagos ember, aki kapcsolatba került a szoftverrel, nem jelentett veszélyt. A legtöbb felhasználó még a szoftver dobozában található felhasználói kézikönyvek elolvasásával sem foglalkozna, nem beszélve a kód sebezhetőségéről.

Aztán jött az internet, és mindent megváltoztatott.

Szinte egyik napról a másikra összekapcsolódtak a számítógépes hálózatok. És ahogy a bonyolultság nőtt, nőtt az esélye annak is, hogy valaki eljut azokon a hálózatokon, akik nem tartoznak oda.

És gyakrabban ezek az emberek rendelkeznek a hiányos kód kihasználásához szükséges képességekkel.

És ez eljutott a mai napig. Soha nem látott kiberbiztonsági fenyegetések ideje. Úgy tűnik, hogy a számítógépes támadásokról naponta érkeznek hírek.

Válaszul a hálózati menedzserek egyre kifinomultabb védekező rendszereket telepítenek, hogy megóvják hálózatukat a behatolókkal szemben. És most azt várják, hogy a szoftverfejlesztők tegyenek meg egy mérföldet a kódjuk biztonsága érdekében, hogy megakadályozzák az illetéktelen hozzáférést.

És mégis, a számítógépes kód keményítését még mindig nem tanítják sokat a kódoló iskolákban. De a modern alkalmazásfejlesztés során elengedhetetlenné válik.

Ennek orvoslásához ebben a cikkben elmagyarázom, mi is a kódelfedés. És áttekintést adok a ma alkalmazott legfontosabb hat kódfedési technikáról is, hogy elindulhasson a biztonságosabb szoftverek megírásában.

Mi a Code Obfuscation?

Ahogy a neve is sugallja, a kódelfedés programozási technikák sorozatára utal, amelyek célja a program kódjának elemeinek leplezése. Ez az elsődleges módja annak, hogy a programozók megvédjék munkájukat a hackerek vagy a szellemi tulajdon tolvajainak illetéktelen hozzáférésétől vagy módosításától.

És ami a legfontosabb, a kódfedés technikái megváltoztathatják a program működéséhez használt struktúrát és módszereket, de soha nem változtatják meg a program kimenetét.

A baj az, hogy sok kódelfedési technika növelheti a program általános költségeit és megnövelheti a végrehajtási időt.

Ezért kritikus megérteni, hogy mely technikák viszonylag büntetésmentesek, és melyek okozhatnak teljesítményproblémákat. Miután megismerte a költségeket, ki lehet egyensúlyozni a védelmet és a teljesítményt egy valós alkalmazásban.

Itt van a manapság alkalmazott hat leggyakrabban használt kódfedési technika.

1. Távolítsa el a felesleges adatokat

Az első, minden esetben alkalmazandó kódkeményítési technika az, hogy megszabaduljon a kódjában lévő mindentől, ami nem szükséges.

Ez egyszerűsíti a kódbázist és csökkenti a védeni kívánt támadási felületet.

Ez azt jelenti, hogy felesleges funkciókat kell eltávolítani, az információkat és a lehető legtöbb metaadatot hibakeresni kell. Röviden - bármi, ami a támadóknak olyan ütemtervet adhat, amely sebezhetőséghez vezethet.

2. Alakítsa át az adatokat

A következő tennivaló az, hogy a kód által feldolgozott adatokat átalakítsa felismerhetetlenné.

Az olyan taktikák, mint az értékek kifejezésekkel történő cseréje, a használt adattároló formátumának megváltoztatása, vagy akár a kódjainak bináris verzióinak használata, mind összetettebbé teszik. És ez a bonyolultság megnehezíti, hogy bárki átalakítsa a kódot, hogy bármi hasznosat kihozzon belőle.

Például használhatja karakterlánc-titkosítást, hogy olvashatatlanná tegye a kód egyszerű szöveges karakterláncait. A karakterlánc-titkosítás egyszerű base64 kódolást használhat, amely megfordítja ezt a kódot:

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

Bár egy tapasztalt programozónak nem nehéz észrevennie, mi folyik itt, számos húr visszafejtésével kell foglalkoznia, időigényes és frusztráló.

És az egyéb kódelfedési technikákkal kombinálva az adatátalakítások hatékony első védelmi vonalat jelentenek.

3. Használja a Process Order Obfuscation alkalmazást

A kód elhomályosításának egyik kihívása az, hogy még mindig szüksége van a kódjára a rendeltetésszerű működéshez, ha végzett.

De semmi sem mondja, hogy bármilyen logikai sorrendben kell végrehajtania a kódot. Ha összekeveri kódja műveleteinek sorrendjét, akkor is elérheti a megfelelő eredményt - de sokkal nehezebbé teszi egy harmadik fél számára, hogy megértse, mit csinál a kódja.

Az egyetlen figyelmeztetés az, hogy vigyázni kell, nehogy túl sok értelmetlen hurkot és zsákutcát hozzon létre, mert véletlenül lelassíthatja a kód végrehajtási idejét.

Példaként tekintse meg a következő részletet, amely kiszámítja a 100 szám összegét és átlagát:

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++; }

Feltételes változó hozzáadásával el lehet rejteni, hogy a kód mit csinál. Ennek oka, hogy a függvény elemzéséhez ismeretre lenne szükség, hogy mit kezdjenek bele a funkcióba.

A következő részletben a „random” feltételes változó egy összetettebb kódstruktúrát hoz létre, ami sokkal nehezebbé teszi a megfejtést:

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. Próbálja ki az Obfuscation hibakeresését

Előfordul, hogy egy elszánt támadó mindenféle hasznos információt megtudhat a kódról, ha megvizsgálja a hibakeresési információkat.

Bizonyos esetekben megtalálhatják a kulcsokat az általad használt egyéb elfedési technikák kibontásához.

Tehát ahol csak lehetséges, érdemes eltávolítani a hibakeresési információkhoz való hozzáférést. És amikor ez nem lehetséges, akkor minden azonosító információt el kell takarni a hibakeresési jelentésben.

5. Használja a cím véletlenszerűsítését

For almost thirty years, errors related to memory handling have been the most common software vulnerabilities hackers exploit – even though every programmer knows that the problem persists.

And it's not just among beginners. Around 70% of the vulnerabilities in Google's Chrome web browser stem from memory errors.

The reality is, it's all but impossible to prevent all memory programming errors, especially if you're using languages like C and C++. But what you can do is include some memory randomization features in your code that will help.

At execution, if your code and data's virtual addresses get assigned random values, it gets much harder to find and exploit any unpatched vulnerabilities.

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.