Çfarë është turbullimi i kodit dhe a duhet ta përdorni?
Disa gjuhë si Java dhe .NET mund të dekompilohen lehtësisht në kod burimor të lexueshëm. Mbulimi i kodit është një proces që i bën binarët e aplikacionit tuaj më të vështirë për t'u lexuar me një dekompilues. Është një mjet i rëndësishëm për mbrojtjen e pronës intelektuale të biznesit tuaj.
Pse të errësojmë kodin?
Gjuhët e përpiluara si C++ konvertohen drejtpërdrejt në bytecode. Mënyra e vetme për të ndryshuar inxhinierinë se si funksionojnë është me një çmontues, i cili është një proces i mundimshëm dhe i ndërlikuar. Nuk është e pamundur, por përpjekja për të nxjerrë logjikën e nivelit të lartë të aplikimit nga një rrjedhë e gjuhës së asamblesë është e vështirë.
Nga ana tjetër, gjuhët si C# dhe Java nuk janë përpiluar për ndonjë sistem operativ të veçantë. Përkundrazi, ato janë përpiluar në një gjuhë ndërmjetëse, si MSIL e .NET. Gjuha ndërmjetëse është e ngjashme me montimin, por mund të kthehet lehtësisht në kodin burimor. Kjo do të thotë që nëse keni një DLL ose një skedar të ekzekutueshëm publik që po shpërndan biznesi juaj, kushdo që ka një kopje të ekzekutuesit tuaj mund ta hapë atë në një dekompilues .NET si dotPeek dhe të lexojë (dhe kopjojë) drejtpërdrejt kodin tuaj burimor.
Mbyllja e kodit nuk mund ta parandalojë këtë proces - çdo .NET DLL mund të futet në një dekompilues. Ajo që bën turbullimi është përdorimi i një sërë trukesh për ta bërë kodin burim të bezdisshëm për të lexuar dhe korrigjuar gabimet.
Forma më e thjeshtë e kësaj është riemërtimi i entitetit. Është praktikë e zakonshme që të emërohen siç duhet variablat, metodat, klasat dhe parametrat sipas asaj që bëjnë. Por ju nuk keni pse, dhe teknikisht nuk ka asgjë që ju pengon t'i emërtoni ato me një sërë shkronjash të vogla L dhe I, ose kombinime të rastësishme të karaktereve kineze unicode. Për kompjuterin, nuk ka asnjë problem, por është plotësisht i palexueshëm për një njeri:
IlIIIIlIIIllIIIllIIll
lIIIllIIllIlIIIIlIIIl
Një pengues bazë do ta trajtojë këtë proces automatikisht, duke marrë daljen nga ndërtimi dhe duke e kthyer atë në diçka që është shumë më e vështirë për t'u lexuar. Nuk ka asnjë goditje në performancë në krahasim me kodin jo të turbullt
Mbuluesit më të avancuar mund të shkojnë më tej, dhe në fakt të ndryshojnë strukturën e kodit tuaj burimor. Kjo përfshin zëvendësimin e strukturave të kontrollit me sintaksë më të komplikuar por semantikisht identike. Ata gjithashtu mund të fusin kodin e rremë që nuk bën asgjë përveçse ngatërron dekompiluesin. Efekti i kësaj është se e bën burimin tuaj të duket si kod spageti, duke e bërë atë më të bezdisshëm për t'u lexuar.
Një fokus tjetër i zakonshëm është fshehja e vargjeve nga dekompiluesit. Në ekzekutuesit e menaxhuar, mund të kërkoni për vargje si mesazhet e gabimit për të gjetur seksione të kodit. Mbyllja e vargut zëvendëson vargjet me mesazhe të koduara, të cilat deshifrohen në kohën e ekzekutimit, duke e bërë të pamundur kërkimin e tyre nga një dekompilues. Kjo zakonisht vjen me një dënim të performancës.
Ka shumë opsione për turbulluesit, megjithëse kjo do të varet nga gjuha që po errësoni. Për .NET, ka Obfuscar. Për Java, ka ProGuard. Për JavaScript, ka javascript-obfuscator.
Opsione të tjera: Konverto në një gjuhë të përpiluar
Konvertimi i një gjuhe programimi në një tjetër nuk është një ide krejtësisht e çmendur - Unity përdor IL2CPP, një konvertues që transformon kodin .NET në bitekod të përpiluar C++. Është shumë më efikase, por gjithashtu ndihmon në sigurimin e lojërave kundër plasaritjes së lehtë, gjë që është thelbësore për një mjedis të rrënuar nga pirateria dhe mashtruesit.
Microsoft ka CoreRT, një kohë ekzekutimi eksperimental .NET Core duke përdorur përpilimin Ahead-Of-Time, megjithëse nuk është gati për përdorim në prodhim.
A duhet të errësoni?
Nëse po vendosni kodin në mjedise të pabesueshme ku dëshironi të mbroni kodin tuaj burimor, duhet të përdorni pothuajse gjithmonë një pengues bazë për të riemërtuar funksionet, metodat dhe vetitë për të bërë që dekompilimi të marrë pak më shumë përpjekje.
Nëse ju vërtet nevojë që askush të mos jetë në gjendje të dekompilojë aplikacionin tuaj, mund të përdorni një pengues më ndërhyrës, por në të vërtetë duhet të mendoni nëse problemi do të zgjidhej më mirë duke kaluar në një gjuhë që nuk ka këtë çështje, të tilla si C++ ose Rust.