Obfuskaatio ( latinan kielestä obfuscare - epäselväksi, epäselväksi; ja englanniksi obfuscate - tehdä epäselväksi, hämmentäväksi, hämmentäväksi) tai koodin hämärtäminen - ohjelman lähdekoodin tai suoritettavan koodin tuominen muotoon, joka säilyttää sen toiminnallisuuden, mutta tekee siitä vaikea analysoida, ymmärtää työn algoritmeja ja muutoksia purkamisen aikana .
Koodin "hämärtäminen" voidaan suorittaa sekä ohjelmakomponenttien nimien että ohjelmaalgoritmien tasolla . Hämmentyneen kokoonpanotekstin luomiseen voidaan käyttää erikoistuneita kääntäjiä , jotka käyttävät ohjelman suoritusympäristön ei-ilmeisiä tai dokumentoimattomia ominaisuuksia . On myös erikoisohjelmia, jotka tuottavat hämärtymistä, nimeltään obfuscators ( eng. obfuscator ).
Vaikeus ohjelmien purkamisessa / virheenkorjauksessa ja tutkimisessa toiminnallisuuden löytämiseksi;
Vaikeus purkaa ohjelmistoja , joilla estetään käänteinen suunnittelu tai DRM- ja lisenssivarmennusjärjestelmien kiertäminen ;
Vaikeus murtaa ohjelmisto ;
Ohjelman optimointi käynnissä olevan koodin koon pienentämiseksi ja (jos käytetään kääntämätöntä kieltä) työn nopeuttamiseksi;
Kielen ei-ilmeisten mahdollisuuksien ja ohjelmoijan pätevyyden osoittaminen (jos se tehdään manuaalisesti eikä työkaluilla);
JavaScriptissä , VBScriptissä ja vastaavissa komentosarjakielissä ohjelman lähdekoodi on käyttäjän saatavilla . Tässä tapauksessa tekstin muotoilu ja nimien korvaaminen voivat tehdä tekstistä vähemmän luettavan.
Lähdeteksti C -kielellä :
int COUNT = 100 ; kelluva TAX_RATE = 0,2 ; for ( int i = 0 ; i < COUNT ; i ++ ) { vero [ i ] = alkuperäinen hinta [ i ] * TAX_RATE ; hinta [ i ] = alkuperäinen hinta [ i ] + alv [ i ]; }Koodi obfusoinnin jälkeen [1] :
for ( int a = 0 ; a < 100 ; a ++ ) { b [ a ] = c [ a ] * 0,2 ; d [ a ] = c [ a ] + b [ a ];}Monimutkaisempi esimerkki:
char * M , A , Z , E = 40 , J [ 40 ], T [ 40 ]; main ( C ){ for ( * J = A = scanf ( M = "%d" & C ) ; --E ; _ J [ E ] = T [ E ] = E ) printf ( "._" ); for (;( A -= Z =! Z ) || ( printf ( " \n |" ) , A = 39 , C -- ) ; Z || printf ( M )) M [ Z ] = Z [ A - ( E = A [ J - Z ]) &&! C & A == T [ A ] | 6 << 27 < rand () ||! C &! Z ? J [ T [ E ] = T [ A ]] = E , J [ T [ A ] = A - Z ] = A , "_." : "|" ];}Yleensä konekoodin tason hämärtäminen vähentää suoritusnopeutta ja lisää vastaavasti ohjelman suoritusaikaa. Siksi sitä käytetään ohjelman tietoturvakriittisissä , mutta ei nopeuden kannalta kriittisissä paikoissa, kuten rekisteröintikoodin tarkistamisessa [2] .
Yksinkertaisin tapa hämärtää konekoodi on lisätä siihen ei-aktiivisia rakenteita (kuten or ax, ax).
Toisin kuin perinteiset ohjelmointikielet, kuten C++ tai Pascal , jotka kääntävät konekoodiksi , Java- , NetP- ja .NET -alustakielet kääntävät lähdekoodin välikoodiksi (tavukoodiksi ) , joka sisältää tarpeeksi tietoa lähdekoodin asianmukaiseen rekonstruoimiseen. Tästä syystä näille kielille käytetään välikoodin hämärtämistä.
Kuten edellä mainittiin, Java- ja .NET-ohjelmien purkaminen on melko helppoa. Tässä tapauksessa obfuskaattori tarjoaa korvaamatonta apua niille, jotka haluavat piilottaa koodinsa uteliailta katseilta. Usein dekompiloitua koodia ei käännetä uudelleen obfuskoinnin jälkeen.
HTML - hämärtäminen auttaa roskapostittajia : sähköpostiohjelmassa , joka pystyy näyttämään HTML:n, teksti luetaan, mutta alkuperäistä HTML -tiedostoa käsittelevä roskapostisuodatin välittää ei-toivotun viestin tunnistamatta siinä olevaa kiellettyä riviä.
Yksinkertaisin esimerkki obfusoidusta HTML:stä:
< b > Mash </ b >< b > ina </ b >Katselessaan käyttäjä näkee sanan " Machine ", kun taas lähdekoodissa se on eritelty ja se nähdään kahtena erillisenä sanana.
Tulkituissa kielissä hämärä koodi vie vähemmän tilaa kuin lähdekoodi ja toimii usein nopeammin kuin lähdekoodi. Nykyaikaiset obfuskaattorit myös korvaavat vakiot numeroilla, optimoivat taulukon alustuskoodia ja tekevät muita optimointeja, jotka ovat ongelmallisia tai mahdottomia lähdetasolla.
Koon pienentämisen ongelma on tärkeä esimerkiksi ohjelmoitaessa matkapuhelimia J2ME : ssä , jossa ohjelman koko on erittäin rajoitettu. JavaScript-hämärtäminen pienentää HTML - tiedostojen kokoa ja siten nopeuttaa latausta.
Lähdekoodin suojaaminen voittoa tavoittelevalta muokkaamiselta.
Obfuskaatiokoodista voi tulla enemmän alusta- tai kääntäjäriippuvainen.
Obfuskaattori estää ulkopuolista saamasta selvää, mitä koodi tekee, mutta estää myös kehittäjää tekemästä virheenkorjausta. Virheenkorjauksen aikana sinun on sammutettava obfuskaattori.
Vaikka hämärtäminen auttaa tekemään hajautetusta järjestelmästä turvallisemman, sen ei pitäisi rajoittua siihen . Hämärtäminen on turvaa epäselvyyden kautta . Mikään olemassa olevista obfuskaattorista ei takaa purkamisen monimutkaisuutta eikä tarjoa turvallisuutta nykyaikaisten salausjärjestelmien tasolla . On melko todennäköistä, että tehokas suoja on mahdotonta (ainakin tietyssä ratkaistavissa olevien ongelmien luokassa).
Nykyaikainen obfuskaattori on monimutkainen ohjelmistopaketti. Huolimatta huolellisesta suunnittelusta ja testauksesta usein vikoja hiipii hämärälaitteita. Joten on nollasta poikkeava mahdollisuus, että obfuskaattorin läpi kulkeva koodi ei toimi ollenkaan. Ja mitä monimutkaisempi ohjelma kehitetään, sitä suurempi tämä todennäköisyys.
Useimmat keskitason koodikielet voivat luoda tai kutsua objekteja luokkanimien perusteella . Nykyaikaisten obfuskaattorien avulla voit säästää nämä luokat uudelleennimeämiseltä, mutta tällaiset rajoitukset vähentävät ohjelmien joustavuutta.