Pređi na sadržaj

Maskiranje koda

S Vikipedije, slobodne enciklopedije

Maskiranje koda je modifikovanje programskog koda u cilju smanjenja čitljivosti, bez gubitka funkcionalnosti. Primarni cilj maskiranja koda je zaštita od bespravnog kopiranja i korišćenja njega ili njegovih dijelova.

Tehnike maskiranja[uredi | uredi izvor]

Uklanjanje bjelina[uredi | uredi izvor]

Trivijalan način maskiranja je uklanjanje svih uklonjivih bjelina iz programskog koda. To uključuje sve tabove, znakove za novi red i razmake. Tako, na primjer, sljedeći programski kod u programskom jeziku C:

#include <stdio.h>

int main()
{
    int i;
    for (i = 0; i < 10; i++ )
        printf("Zdravo!\n" );
}

dobija sljedeći izgled:

#include <stdio.h>
int main(){int i;for(i=0;i<10;i++)printf("Zdravo!\n");}

Mora se primijetiti da na određenim mjestima bjeline nisu smjele biti uklonjene, kao između ključne riječi int i imena promjenljive i. Zbog toga je potrebno imati nešto složeniji sistem uklanjanja bjelina, naprimjer koristeći regularne izraze tako da se uklone samo bjeline koje bar sa jedne strane imaju nealfanumeričke znakove (znakove interpunkcije, zagrade itd.).

Glavna mana ove tehnike maskiranja je što se lako otklanja, koristeći uređivače programskog koda koji imaju podršku za automatsko poravnanje teksta, ili koristeći posebne programe za te namjene, na primjer juniksov program indent. Na taj način se zamaskirani kod vrlo brzo i lako vraća u čitljiv oblik.

Zamjena imena promjenljivih[uredi | uredi izvor]

Najčešći način maskiranja se zasniva na jednostavnoj zamjeni imena promjenljivih kratkim i nerazumljivim imenima, tako da je bez odgovarajuće dokumentacije praktično nemoguće otkriti algoritam netrivijalnih programa. Pri ovoj vrsti maskiranja je važno biti dosljedan u zamjeni istih imena promjenljivih istim novim imenima, kao i paziti da se ne zamjene ključne riječi datog programskog jezika ili identifikatori koji pripadaju nekoj spoljnoj biblioteci koja nije obuhvaćena maskiranjem. Na primjer, sljedeći programski kod, napisan u jeziku Javaskript:

function getAverage(arr )
{
    var sum = 0;
    var i;
    for (i = 0; i < arr.length; i++ )
        sum += arr[i];
    var result = sum/arr.length;
    return result;
}

može dobiti sljedeći izgled:

function ab(ac )
{
    var ad = 0;
    var ae;
    for (ae = 0; ae < ac.length; ae++ )
        ad += ac[ae];
    var af = ad/ac.length;
    return af;
}

Iako je dati primjer vrlo jednostavan, vidi se da je čitljivost maskiranog koda znatno manja. Ovo naročito dolazi do izražaja kod programskih kodova veće dužine.

Jedan od načina ostvarivanja ove tehnike maskiranja je prikazan u narednih nekoliko koraka:

  • pravljenje tablice svih riječi u programu,
  • uklanjanje riječi iz tablice koje ne smiju biti zamijenjene (npr. ključne riječi (for, while) i identifikatori spoljnih biblioteka (printf, cout, alert itd. u zavisnosti od korišćenog programskog jezika),
  • pridruživanje novih, generičkih, riječi (poput ab, ac, itd.) tabličnim riječima,
  • zamjena postojećih riječi u programskom kodu novopridruženim generičkim riječima.

Generičke riječi se mogu formirati na različite načine:

  • permutacijama slova i cifara dužine 2, 3, itd. (npr. aa, ab, ac, ... zz, aab, aac, ... zzz, ...)
  • koristeći mali broj različitih dozvoljenih znakova, čime raste dužina koda ali se dodatno smanjuje čitljivost (npr. aa, a_, _a, __, aaa, aa_, a_a, a__, _aa, _a_, _a_, ___, aaaa, aaa_ itd.)
  • slučajnim izborom različitih riječi koje same po sebi imaju smisao, ali nije vezan za dati algoritam (npr. sum, index, i, j, left, right itd. pri čemu se nijedna od njih ne dodijeli promjenljivoj koja ima taj smisao nego slučajnim izborom)

Pored navedenih tehnika, maskiranje se postiže spajanjem cjelokupnog koda u jednu datoteku, pa čak i izmjenom samog algoritma u cilju manje razumljivosti. Najčešće se koristi kombinacija svih raspoloživih tehnika u cilju što kvalitetnijeg maskiranja.

Slijedi čuveni primjer zamaskiranog programa napisanog u programskog jeziku C:

#include <stdio.h>
main(t,_,a)char *a;{return!0<t?t<3?main(-79,-13,a+main(-87,1-_,
main(-86,0,a+1)+a)):1,t<_?main(t+1,_,a):3,main(-94,-27+t,a)&&t==2?_<13?
main(2,_+1,"%s %d %d\n"):9:16:t<0?t<-72?main(_,t,
"@n'+,#'/*{}w+/w#cdnr/+,{}r/*de}+,/*{*+,/w{%+,/w#q#n+,/#{l,+,/n{n+,/+#n+,/#\
;#q#n+,/+k#;*+,/'r :'d*'3,}{w+K w'K:'+}e#';dq#'l \
q#'+d'K#!/+k#;q#'r}eKK#}w'r}eKK{nl]'/#;#q#n'){)#}w'){){nl]'/+#n';d}rw' i;# \
){nl]!/n{n#'; r{#w'r nc{nl]'/#{l,+'K {rw' iK{;[{nl]'/w#q#n'wk nw' \
iwk{KK{nl]!/w{%'l##w#' i; :{nl]'/*{q#'ld;r'}{nlwb!/*de}'c \
;;{nl'-{}rw]'/+,}##'*}#nc,',#nw]'/+kd'+e}+;#'rdq#w! nr'/ ') }+}{rl#'{n' ')# \
}'+}##(!!/")
:t<-50?_==*a?putchar(31[a]):main(-65,_,a+1):main((*a=='/')+t,_,a+1)
  :0<t?main(2,2,"%s"):*a=='/'||main(0,main(-61,*a,
"!ek;dc i@bK'(q)-[w]*%n+r3#l,{}:\nuwloca-O;m .vpbks,fxntdCeghiry"),a+1);}

Ovaj kod, kada se prevede i pokrene, proizvodi dvanaest strofa pjesme koja opisuje dvanaest mjeseci u godini. Stihovi se vade iz velike niske koja predstavlja glavninu koda. Maskiranje se ovde obavilo koristeći više tehnika — zamjenom imena promjenljivih nerazumljivim imenima, uklanjanjem bjelina i korišćenjem rekurzivnih poziva funkcije main.

Veb programiranje[uredi | uredi izvor]

Maskiranju koda se u 21. vijeku često pribjegava u veb programiranju, kada je došlo do bujanja Interneta i kada se u većini slučajeva kod mora prenijeti klijentu da bi se izvršio (HTML, Javaskript, CSS, itd.). Tada maskiranje koda ima višestruku dobrobit:

  • dužina programskog koda se smanjuje čime se smanjuje vrijeme prenosa preko Interneta (što korisnici doživljavaju kao povećanje brzine aplikacije)
  • čitljivost se smanjuje čime se smanjuje mogućnost nezakonitog korišćenja koda i zlonamjernog pristupa serverskoj aplikaciji radi zloupotrebe njenih ranjivosti

Uopšteno, to se najviše odnosi na Javaskript, ali se može odnositi i na PHP i druge serverske programske jezike, jer su u većini slučajeva u pitanju interpreterski programski jezici te se skraćenjem koda može ubrzati interpretiranje koda.

Spoljašnje veze[uredi | uredi izvor]

  • ioccc, Međunarodno takmičenje za najbolje maskiran C kôd