Какво представлява замъгляването на кода? Как да прикриете кода си, за да го направите по-сигурен

В най-ранните дни на изчисленията разработчиците не трябваше да се притесняват за мрежите. Те можеха просто да се съсредоточат върху това дали софтуерът им да изпълнява предназначението си и да не се срива твърде често.

И обикновеният човек, който е влязъл в контакт с този софтуер, не е заплаха. Повечето потребители дори не биха си направили труда да четат ръководствата за потребителя, доставени в кутията на софтуера, камо ли да измиват кода за уязвимости.

След това се появи интернет и промени всичко.

Почти за една нощ компютърните мрежи станаха взаимосвързани. И с нарастването на сложността нарастваха и шансовете някой да попадне в тези мрежи, които не принадлежат там.

И по-често тези хора биха имали уменията, необходими за използване на грешен код.

И това ни води до днес. Време е на безпрецедентни заплахи за киберсигурност. А новините за кибератаки изглежда идват всеки ден.

В отговор на това мрежовите мениджъри внедряват все по-усъвършенствани защитни системи, за да закалят мрежите си срещу натрапници. И сега те очакват разработчиците на софтуер да положат допълнителни усилия, за да защитят своя код, за да предотвратят неоторизиран достъп.

И все пак, втвърдяването на компютърния код все още не се учи много в училищата по кодиране. Но това става задължително при съвременната разработка на приложения.

За да помогна за отстраняването на това, в тази статия ще обясня какво представлява замъгляването на кода. Освен това ще ви дам общ преглед на шестте най-важни техники за замъгляване на кода, използвани днес, за да започнете пътя към писането на по-сигурен софтуер.

Какво представлява замъгляването на кода?

Както подсказва името му, замъгляването на кода се отнася до поредица от техники за програмиране, предназначени да прикрият елементи от кода на програмата. Това е основният начин, по който програмистите могат да защитят работата си срещу неоторизиран достъп или промяна от страна на хакери или крадци на интелектуална собственост.

И най-важното е, че техниките за замъгляване на кода могат да променят структурата и методите, с които програмата работи, но те никога не променят изхода на програмата.

Проблемът е, че много техники за замъгляване на кода могат да добавят към режийните разходи на програмата и да увеличат времето за изпълнение.

Поради тази причина е изключително важно да се разбере кои техники са относително безплатни и кои могат да причинят проблеми с производителността. След като знаете разходите, е възможно да балансирате защитата и производителността в реално приложение.

Ето шестте най-използвани техники за замъгляване на кода, използвани днес.

1. Премахнете излишните данни

Първата техника за втвърдяване на кода, която трябва да се прилага във всеки случай, е да се отървете от всичко в кода, което не е необходимо.

Това ще рационализира вашата кодова база и ще намали повърхността на атака, която защитавате.

Това означава премахване на излишни функции, отстраняване на грешки в информацията и възможно най-много метаданни. Накратко - всичко, което може да даде на нападателя пътна карта, която може да ги доведе до уязвимост.

2. Трансформирайте данните

Следващото нещо, което трябва да направите, е да трансформирате данните, които вашият код обработва, за да ги направи неразпознаваеми.

Тактики като замяна на стойности с изрази, промяна на формата на съхранението на данни, които използвате или дори използване на двоични версии на номерата на кода, добавят сложност. И тази сложност ще затрудни всеки, който реинженерира вашия код, да извлече нещо полезно от него.

Например, можете да използвате низово криптиране, за да направите низовете от обикновен текст в кода ви нечетливи. Шифроването на низове може да използва просто кодиране base64, което ще превърне този код:

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

Въпреки че за опитен програмист не е трудно да забележи какво се случва тук, трябва да се справи с дешифрирането на многобройни струни отнема много време и разочарова.

И когато се комбинират с някои от другите техники за замъгляване на кода, трансформациите на данни са ефективна първа линия на защита.

3. Използвайте Обфускация на процесна поръчка

Едно от предизвикателните изисквания за замъгляване на кода е, че все още се нуждаете от кода си, за да работи по предназначение, когато сте готови.

Но няма нищо, което да казва, че трябва да изпълнявате кода си във всеки логичен ред. Ако объркате реда на действие на кода си, все пак можете да постигнете правилния резултат - но затруднявайте далеч по-трудно за трета страна да разбере какво прави вашият код.

Единственото предупреждение е, че трябва да внимавате да не създавате твърде много безсмислени цикли и задънени улици, защото може случайно да забавите времето за изпълнение на вашия код.

Като пример, разгледайте следния фрагмент, който изчислява сумата и средната стойност на 100 числа:

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

Чрез добавяне на условна променлива е възможно да се прикрие какво прави кодът. Това е така, защото анализът на функцията ще изисква знания за това какво се въвежда в нея за начало.

В следващия фрагмент условната променлива 'random' създава по-сложна кодова структура, която затруднява дешифрирането:

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. Опитайте Debug Obfuscation

Понякога решителният нападател може да научи всякаква полезна информация за вашия код, като проучи неговата информация за отстраняване на грешки.

И в някои случаи те могат да намерят ключовете за разгадаването на някои други техники за замъгляване, които използвате.

Така че, когато е възможно, е добра идея да премахнете достъпа до информация за отстраняване на грешки. И когато това не е опция, маскирането на всяка идентифицираща информация в отчета за отстраняване на грешки е от съществено значение.

5. Използвайте рандомизиране на адреси

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.