Layered obfuscation: a taxonomy of software obfuscation techniques for layered security

This section surveys the obfuscation techniques for specific code elements. Tämä taso kattaa suurimman osan julkaisuista ohjelmisto obfuscation alueella. Kuten kuvassa. 4, mukaan mitä elementtejä obfuscation tekniikka tavoitteet, jaamme tämän luokan viiteen alaluokkiin: obfuscating asetteluja, obfuscating valvontaa, obfuscating dataobfuscating toimintoja, ja obfuscating luokat.

Kuva. 4
kuva4

koodielementtikerroksen hämärtämistekniikat

Obfuscating layout

Layout obfuscation sekoittaa koodien tai ohjeiden asettelua säilyttäen alkuperäisen syntaksin koskemattomana. Tässä jaksossa käsitellään neljää layout obfuscation strategioita: merkityksetön luokittajat, Strippaus tarpeeton symboleja, erottaminen liittyvät koodit, ja roskakoodit.

merkityksettömät tunnisteet

tätä lähestymistapaa kutsutaan myös leksikaaliseksi obfuskaatioksi, jossa merkitykselliset tunnisteet muutetaan merkityksettömiksi. Useimpien ohjelmointikielten kohdalla tarvitaan mielekkäiden ja yhtenäisten nimeämissääntöjen (esimerkiksi Unkarin notaatio (Simonyi 1999)) omaksumista hyvänä ohjelmointikäytäntönä. Vaikka tällaiset nimet on määritelty lähdekoodeissa, osa jäisi julkaistuun ohjelmistoon oletusarvoisesti. Esimerkiksi C/C++: ssa globaalien muuttujien ja funktioiden nimet säilytetään binääreissä, ja kaikki Javan nimet varataan bytekoodeissa. Koska tällaiset merkitykselliset nimet voivat helpottaa kontradiktorista ohjelman analysointia, meidän pitäisi sekoittaa ne. Jotta obfuscated tunnisteet enemmän sekava, Chan ja Yang (2004) ehdotti tarkoituksella käyttää samoja nimiä esineitä erityyppisiä tai eri aloilla. Tällaiset lähestymistavat on hyväksynyt ProGuard (2016) oletuksena obfuscation järjestelmä Java-ohjelmia.

tarpeettomien symbolien poistaminen

tämä strategia poistaa tarpeettomat symboliset tiedot julkaistuista ohjelmistoista, kuten useimpien propgramien virheenjäljitystiedot (Low 1998). Lisäksi, on olemassa muita tarpeettomia symboleja tietyille ohjelmamuodoille. ELF-tiedostoissa on esimerkiksi symbolitaulukoita, jotka tallentavat tunnisteiden ja osoitteiden pareja. Kun otetaan käyttöön oletusasetuksia C / C++ – ohjelmien kääntämiseksi, kuten LLVM (Lattner and Adve 2004), luodut binäärit sisältävät tällaisia symbolitaulukoita. Tällaisten tarpeettomien tietojen poistamiseksi kehittäjät voivat käyttää Linuxin strip-työkalua. Toinen esimerkki turhista tiedoista on Android smali-koodit. Oletusarvoisesti luodut smali-koodit sisältävät tietoja, jotka on aloitettu .viiva ja .lähde, joka voidaan poistaa hämäystarkoituksiin (Dalla Preda and Maggi 2017).

toisiinsa liittyvien koodien erottaminen

ohjelma on helppolukuisempi, jos sen loogisesti liittyvät koodit ovat myös fyysisesti lähellä (Collberg et al. 1997). Siksi asiaan liittyvien koodien tai ohjeiden erottaminen toisistaan voi lisätä lukuvaikeuksia. Sitä sovelletaan sekä lähdekoodeihin (esim.uudelleenjärjestelyn muuttujat (Low 1998)) että kokoonpanokoodeihin (esim. uudelleenjärjestelyn ohjeet (Wroblewski 2002)). Käytännössä, käyttämällä ehdoton hyppyjä kirjoittaa ohjelman on suosittu lähestymistapa tämän saavuttamiseksi. Esimerkiksi kehittäjät voivat sekoittaa kokoonpanokoodit ja sitten käyttää gotoa rekonstruoimaan alkuperäisen ohjausvirran (sinä ja Yim 2010). Tämä lähestymistapa on suosittu assembly koodeja ja Java bytecodes saatavuus goto ohjeet (Dalla Preda ja Maggi 2017).

Roskakoodit

tämä strategia lisää turhia ohjeita, jotka eivät ole toimivia. Binääreille voimme lisätä ei-toimintaohjeita (NOP tai 0x00) (Dalla Preda and Maggi 2017; Marcelli et al. 2018). Lisäksi, voimme myös lisätä roskaa menetelmiä, kuten lisäämällä käytöstä poistettuja menetelmiä Android smali koodit (Dalla Preda ja Maggi 2017). Roskakoodit voivat tyypillisesti muuttaa koodien allekirjoituksia ja välttyä siten staattiselta hahmontunnistukselta.

koska layout obfuscation ei peukaloi alkuperäistä koodin syntaksia, se on vähemmän altis yhteensopivuusongelmille tai bugeille. Siksi tällaiset tekniikat ovat suosituimpia käytännössä. Lisäksi merkityksettömien tunnisteiden ja tarpeettomien symbolien poistaminen voi pienentää ohjelmien kokoa, mikä tekee niistä edelleen houkuttelevia (ProGuard 2016). Layout obfuscationin teho on kuitenkin rajallinen. Se on lupaava vastustuskyky deobfuscation hyökkäyksiä, koska jotkut muutokset ovat yksisuuntaisia, jota ei voida peruuttaa. Joitakin asettelutietoja ei kuitenkaan juuri voi muuttaa, kuten Java SDK: n metoditunnisteita. Tällaiset jäljellä olevat tiedot ovat välttämättömiä, jotta vastustajat voivat palauttaa epäselvän tiedon. Esimerkiksi Bichsel et al. (2016) yritti deobfuscated ProGuard-obfuscated sovellukset, ja he onnistuneesti talteen noin 80% nimiä.

Obfusoivat kontrollit

tämän tyyppiset obfuskaatiotekniikat muuttavat koodien kontrolleja ohjelman monimutkaisuuden lisäämiseksi. Se voidaan saavuttaa valeohjausvirtojen, todennäköisyysohjausvirtojen, lähettäjäpohjaisten kontrollien ja implisiittisten kontrollien avulla.

Valesäätövirrat

Valesäätövirrat tarkoittavat ohjausvirtoja, jotka lisätään ohjelmaan tarkoituksella mutta joita ei koskaan suoriteta. Se voi lisätä ohjelman monimutkaisuutta, esim., teoksessa McCabe complexity (McCabe 1976) tai Harrison metrics (Harrison and Magel 1981). Esimerkiksi McCaben kompleksisuus (McCabe 1976) lasketaan siten, että ohjausvirtakuvaajan reunojen lukumäärästä vähennetään solmujen lukumäärä ja sitten lisätään kaksi kertaa toisiinsa kytketyt komponentit. McCaben monimutkaisuuden lisäämiseksi voimme joko ottaa käyttöön uusia reunoja tai lisätä sekä uusia reunoja että solmuja yhdistettyyn komponenttiin.

takaamaan väärien ohjausvirtojen saavuttamattomuuden, Collberg et al. (1997) ehdotti läpinäkymättömien predikaattien käyttämistä. He määrittelivät läpinäkymättömän ennusteen predikaatiksi, jonka tulos tunnetaan obfuskaation aikana, mutta sitä on vaikea päätellä staattisella ohjelma-analyysillä. Yleensä läpinäkymätön predikaatti voi olla jatkuvasti tosi (PT), jatkuvasti epätosi (PF) tai kontekstiriippuvainen (P?). Läpinäkymättömien predikaattien luomiseen on kolme menetelmää: numeeriset järjestelmät, ohjelmointijärjestelmät ja kontekstuaaliset järjestelmät.

numeeriset järjestelmät

numeeriset järjestelmät muodostavat läpinäkymättömiä predikaatteja matemaattisilla lausekkeilla. Esimerkiksi 7×2-1≠y2 pätee jatkuvasti kaikille kokonaisluvuille x ja y. Voimme käyttää tällaisia vaikeaselkoisia predikaatteja väärien ohjausvirtojen käyttöönottoon. Kuvassa 5a on esimerkki, jossa läpinäkymätön predikaatti takaa, että valeohjausvirtaa (eli else-haaraa) ei toteuteta. Hyökkääjillä olisi kuitenkin paremmat mahdollisuudet havaita ne, jos käytämme samoja läpinäkymättömiä predikaatteja usein hämärässä ohjelmassa. Arboit (2002) ehdottikin, että tällaisen läpinäkymättömän predikaatin perhe tuotettaisiin automaattisesti siten, että obfuscator voi valita ainutlaatuisen läpinäkymättömän predikaatin joka kerta.

Kuva. 5
kuva5

Ohjausvirtauksen obfuskaatio läpinäkymättömillä predikaateilla

toinen matemaattinen lähestymistapa, jolla on korkeampi turvallisuus, on käyttää kryptofunktioita, kuten hash-funktiota \(\mathcal {h}\) (Sharif et al. 2008), ja homomorfinen salaus (Zhu and Thomborson 2005). Voimme esimerkiksi korvata predikaatin x==c kanssa \(\mathcal {H} (x)==c_{hash}\) piilottaaksemme X: n ratkaisun tälle yhtälölle. Huomaa, että tällaista lähestymistapaa käytetään yleensä haittaohjelmien avulla dynaamisen ohjelman analysoinnin välttämiseksi. Voimme myös käyttää salausfunktioita salaamaan yhtälöitä, joita ei voida täyttää. Tällaiset läpinäkymättömät predikaatit aiheuttavat kuitenkin paljon kustannuksia.

staattiselle analyysille resistenttien läpinäkymättömien vakioiden muodostamiseen, Moser et al. (2007) ehdotti työllistävät 3-SAT ongelmia, jotka ovat NP-kova. Tämä on mahdollista, koska yksi voi olla tehokkaita algoritmeja säveltää tällaisia vaikeita ongelmia (Selman et al. 1996). Esimerkiksi Tiella and Ceccato (2017) osoitti, miten tällaisia läpinäkymättömiä predikaatteja voidaan säveltää k-clique-ongelmilla.

dynaamiselle analyysille resistenttien läpinäkymättömien vakioiden muodostamiseen, Wang et al. (2011) ehdotti koostamaan läpinäkymättömiä predikaatteja, joiden muoto on ratkaisematon conjectures, joka silmukka monta kertaa. Koska silmukat ovat haastavia dynaamiselle analyysille, lähestymistavan luonnossa tulisi kestää dynaamista analyysiä. Esimerkkejä tällaisista konjektuureista ovat Collatzin konjektuuri, 5x+1 konjektuuri, Matthewsin konjektuuri. Kuva 5b osoittaa, miten käyttää Collatz arveluihin käyttöön väärennettyjä ohjausvirtoja. Riippumatta siitä, miten alustamme x: n, ohjelma päättyy arvoon x=1, ja originaalikoodit() voidaan aina suorittaa.

Ohjelmointijärjestelmät

koska kontradiktorinen ohjelma-analyysi on suuri uhka läpinäkymättömille predikaateille, Voimme käyttää haastavia ohjelma-analyysiongelmia muodostaaksemme läpinäkymättömiä predikaatteja. Collberg ym. ehdotti kaksi klassista ongelmaa, osoitin analyysi ja samanaikaiset ohjelmat.

yleensä osoitinanalyysillä tarkoitetaan sen selvittämistä, voivatko kaksi osoitinta osoittaa tai voivatko ne osoittaa samaan osoitteeseen. Jotkut osoitin analyysi ongelmia voi olla NP-vaikea staattinen analyysi tai jopa undecidable (Landi and Ryder 1991). Toinen etu on, että osoitintoiminnot ovat erittäin tehokkaita suorituksen aikana. Siksi kehittäjät voivat säveltää kimmoisia ja tehokkaita läpinäkymättömiä ennusteita hyvin suunnitelluilla osoitinanalyysiongelmilla, kuten ylläpitämällä osoittimia joihinkin dynaamisilla tietorakenteilla varustettuihin kohteisiin (Collberg et al. 1998 a).

samanaikaiset ohjelmat tai rinnakkaisohjelmat ovat toinen haastava kysymys. Yleensä n lausekkeiden rinnakkaisella alueella on n! erilaisia teloitustapoja. Suorituksen määrää ohjelman lisäksi isäntätietokoneen suoritustila. Collberg ym. (1998a) ehdotti käyttää samanaikaisesti ohjelmia parantaa osoitin-pohjainen lähestymistapa samanaikaisesti päivittämällä osoittimet. Majumdar and Thomborson (2006) ehdotti hajautettujen rinnakkaisohjelmien käyttämistä läpinäkymättömien predikaattien säveltämiseen.

sitä paitsi jotkin lähestymistavat sommittelevat vaikeaselkoisia predikaatteja ohjelmointitempuilla, kuten hyödyntämällä poikkeusten käsittelymekanismeja. Esimerkiksi Dolz and Parra (2008) ehdotti try-catch-mekanismin käyttämistä läpinäkymättömien predikaattien muodostamiseen.Net: lle ja Javalle. Poikkeustapahtumia ovat Jako nollalla, nollan osoitin, indeksi kantaman ulkopuolella tai jopa tietyt laitteistopoikkeukset (Chen et al. 2009). Alkuperäinen ohjelma semantiikka voidaan saavuttaa räätälöidyillä poikkeusten käsittelyjärjestelmillä. Tällaisilla läpinäkymättömillä predikaateilla ei kuitenkaan ole tietoturvapohjaa, ja ne ovat alttiita kehittyneille käsin tehdyille hyökkäyksille.

kontekstuaalisia järjestelmiä

kontekstuaalisia järjestelmiä voidaan käyttää muodostamaan muunnoksia läpinäkymättömiä predikaatteja(so., {P?}). Predikaateilla pitäisi olla joitakin deterministisiä ominaisuuksia niin, että niitä voidaan käyttää ohjelmien hämärtämiseen. Esimerkiksi Drape ja et al. (2009) ehdotti sellaisten läpinäkymättömien predikaattien muodostamista, jotka ovat invariantteja kontekstuaalisessa rajoituksessa, esim. läpinäkymätön predikaatti x mod3==1 on jatkuvasti totta, jos x mod3:1?x++: x=x + 3. Palsberg ym. (2000) ehdotti dynaamisia läpinäkymättömiä predikaatteja, joihin kuuluu korreloivien predikaattien jono. Kunkin predikaatin arviointitulos voi vaihdella kussakin ajossa. Kuitenkin niin kauan kuin predikaatit korreloivat, ohjelman käyttäytyminen on determinististä. Kuvassa 5c on esimerkki dynaamisista läpinäkymättömistä predikaateista. Riippumatta siitä, miten alustamme *p ja *q,ohjelma vastaa Y=x+3, x=y+3.

valeohjausvirtojen kestävyys riippuu useimmiten läpinäkymättömien predikaattien turvallisuudesta. Ihanteellinen turvaominaisuus läpinäkymättömille predikaateille on, että ne vaativat pahimmassa tapauksessa eksponentiaalista aikaa murtuakseen, mutta vain polynomin aikaa muodostuakseen. Huomaa, että jotkut läpinäkymättömät predikaatit on suunniteltu tällaisia turvallisuusongelmia, mutta voidaan toteuttaa puutteita. Esimerkiksi 3-SAT ongelmia ehdottanut Ogiso et al. (2003) perustuvat triviaaleihin ongelma-asetuksiin, joita on helppo yksinkertaistaa. Jos tällaiset läpinäkymättömät predikaatit toteutetaan oikein, ne lupaisivat olla sitkeitä.

Todennäköisyysohjausvirrat

Valeohjausvirrat voivat aiheuttaa ongelmia staattiseen ohjelma-analyysiin. Ne ovat kuitenkin alttiita dynaamiselle ohjelma-analyysille, koska valeohjausvirrat ovat inaktiivisia. Ajatus todennäköisyyksien kontrollivirtojen omaksuu erilaisen strategian uhan torjumiseksi (Pawlowski et al. 2016). Se esittelee ohjausvirtojen toisintoja samalla semantiikalla, mutta eri syntaksilla. Saadessaan saman syötteen useita kertoja ohjelma voi käyttäytyä eri tavalla eri suoritusajoilla. Tekniikka on hyödyllinen myös sivukanavahyökkäysten torjumisessa (Crane ym. 2015).

huomaa, että probabilististen kontrollivirtojen strategia on samanlainen kuin tekaistut kontrollivirrat, joissa on kontekstuaalisia läpinäkymättömiä predikaatteja. Mutta ne ovat luonteeltaan erilaisia, koska kontekstuaaliset läpinäkymättömät predikaatit esittelevät kuolleita polkuja, vaikka ne eivät esittele roskakoodeja.

Lähettäjäperusteinen valvonta

lähettäjäperusteinen valvonta määrittää seuraavat ajonaikana suoritettavat koodilohkot. Tällaiset ohjausobjektit ovat välttämättömiä ohjausvirtojen sekoittamiseksi, koska ne voivat piilottaa alkuperäiset ohjausvirrat staattista ohjelma-analyysiä vastaan.

yksi merkittävä lähettäjäpohjainen hämärtämistapa on ohjausvirtamittaus, jossa syvyyskoodit muutetaan monimutkaisemmiksi mataliksi. Wang ym. (2000) ehdotti ensin lähestymistapaa. Kuva 6 osoittaa esimerkin niiden paperi, joka muuttaa samalla silmukka toiseen muotoon kytkin-tapauksessa. Toteuttaa tällainen muutos, ensimmäinen askel on muuttaa koodin vastaavaksi edustus if-then-goto lausuntoja kuten kuvassa. 6; sitten he muokkaavat goto lausuntoja switch-case lausuntoja kuten kuvassa. 6. Näin alkuperäinen ohjelmasemantiikka toteutuu implisiittisesti ohjaamalla kytkinmuuttujan datavirtaa. Koska koodilohkojen suoritusjärjestys määräytyy dynaamisesti muuttujan avulla, ei ohjausvirtoja voi tietää suorittamatta ohjelmaa. Cappaert and Preneel (2010) virallistettu ohjaus-virtaus litistyminen käyttämällä lähettäjä solmu (esim., kytkin), joka ohjaa seuraava koodi lohko suoritetaan; suorittamisen jälkeen lohko, ohjaus siirretään takaisin lähettäjä solmu. Lisäksi, on olemassa useita parannuksia code-flow flattening. Esimerkiksi parantaa staattisen ohjelman analysointia kytkinmuuttuja, Wang et al. (2001) ehdotti pointer analysis-ongelmien käyttöönottoa. Edelleen vaikeuttaa ohjelman, Chow et al. (2001) ehdotti tekaistujen koodilohkojen lisäämistä.

Kuva. 6
kuva6

ohjaus-virtaus flattening lähestymistapa ehdottama Wang et al. (2000)

László ja Kiss (2009) ehdottivat ohjausvirtamittausmekanismia tiettyjen C++-syntaksien käsittelyyn, kuten try-catch, while-do, continue. Mekanismi perustuu abstraktiin syntaksipuuhun ja käyttää kiinteää asettelumallia. Jokaista koodilohkoa varten se rakentaa jonkin aikaa lausekkeen ulompaan silmukkaan ja kytkinkotelon yhdisteen silmukan sisään. Kytkinkotelo-yhdiste toteuttaa alkuperäisen ohjelman semantiikan, ja kytkinmuuttujaa käytetään myös ulomman silmukan lopettamiseen. Cappaert and Preneel (2010) havaitsi, että mekanismit saattavat olla alttiita paikalliselle analyysille, eli kytkinmuuttuja osoitetaan välittömästi siten, että vastustajat voivat päätellä seuraavan lohkon suoritettavaksi vain katsomalla nykyistä lohkoa. He ehdottivat tehostettua lähestymistapaa useilla tempuilla, kuten käyttämällä referenssikomennusta (esim.swVar=swVar+1) suoran toimeksiannon sijaan (esim. swVar=3), korvaamalla if-else-toimeksiannon kautta yhtenäisellä tehtävälausekkeella ja käyttämällä yksisuuntaisia funktioita peruslohkon seuraajan laskemisessa.

kontrollivirran litistämisen lisäksi on olemassa useita muita lähettäjäpohjaisia obfuskaatiotutkimuksia (esim., (Linn and Debray 2003; Ge et al. 2005; Zhang et al. 2010; Schrittwieser ja Katzenbeisser 2011)). Linn and Debray (2003) ehdotti binäärien sekoittamista haaratoimintoihin, jotka ohjaavat toteutusta pinon tietojen perusteella. Samoin Zhang et al. (2010) ehdotti haaratoimintojen käyttämistä object-orientoituneiden ohjelmien hämäämiseen, jotka määrittelevät yhtenäisen menetelmän kutsutyylin objektipoolilla. Tällaisten mekanismien turvallisuuden parantamiseksi, Ge et al. (2005) ehdotti piilottaa valvontatiedot toiseen itsenäiseen prosessiin ja käyttää prosessien välistä viestintää. Schrittwieser and Katzenbeisser (2011) ehdotti käyttää hajautettuja koodilohkoja, jotka toteuttavat samaa semantiikkaa.

Lähettäjäpohjainen obfuskaatio kestää staattista analyysiä, koska se piilottaa ohjelmiston ohjausvirtagrammin. Se on kuitenkin altis dynaamisille ohjelma-analyyseille tai hybrideille lähestymistavoille. Esimerkiksi Udupa et al. (2005) ehdotti hybridi lähestymistapa paljastaa piilotettu ohjausvirtoja sekä staattinen analyysi ja dynaaminen analyysi.

implisiittiset tarkastukset

tämä strategia muuntaa eksplisiittiset valvontaohjeet implisiittisiksi. Se voi estää käänteisinsinöörejä puuttumasta oikeisiin ohjausvirtoihin. Esimerkiksi voimme korvata ohjausohjeet kokoonpano koodit (esim., jmp ja jne) yhdistelmä mov ja muita ohjeita, jotka toteuttavat samaa valvontaa semantiikka (Balachandran and Emmanuel 2011).

huomaa, että kaikki olemassa olevat säätövirtauksen obfuskaatiomenetelmät keskittyvät syntaktisen tason transformaatioon, kun taas semanttisen tason suojauksesta on harvoin keskusteltu. Vaikka ne saattavat osoittaa jonkinlaista sietokykyä hyökkäyksiä vastaan, niiden sekavuus semanttisen suojan osalta on edelleen epäselvää.

Obfuscating data

Present data obfuscation techniques keskittyy yleisiin tietotyyppeihin, kuten kokonaislukuihin, merkkijonoihin ja taulukoihin. Voimme muuttaa tietoja jakamalla, yhdistämällä, prosessointi, koodaus, jne.

tietojen jakaminen/yhdistäminen

tietojen jakaminen jakaa yhden muuttujan tiedot useiksi uusiksi muuttujiksi. Esimerkiksi Boolen muuttuja voidaan jakaa kahteen Boolen muuttujaan, ja loogisten operaatioiden suorittaminen niillä voi saada alkuperäisen arvon.

yhdistyvä tieto taas yhdistää useita muuttujia yhdeksi muuttujaksi. Collberg ym. (1998b) osoitti esimerkin, joka yhdistää kaksi 32-bittistä kokonaislukua yhdeksi 64-bittiseksi kokonaisluvuksi. Ertaul and Venkatesh (2005) ehdotti toista menetelmää, joka pakkaa useita muuttujia yhteen tilaan diskreeteillä logaritmeilla.

tiedon prosessointi

tiedon prosessointi korvaa perustiedon menettelykutsuilla. Collberg ym. (1998b) ehdotti korvata merkkijonoja funktio, joka voi tuottaa kaikki Jouset määrittelemällä paticular parametrin arvot. Drape ja et al. (2004) ehdotti numeerisen datan koodaamista kahdella käänteisfunktiolla f ja g. Jos haluat määrittää arvon V muuttujalle I, annamme sen ruiskutetulle muuttujalle j, koska j=f (v). Käyttääksemme i: tä vetoamme sen sijaan g(j): hen.

Data encoding

Data encoding encodes data with mathematical functions or ciphers. Ertaul and Venkatesh (2005) ehdotti koodata merkkijonoja Affine Cipher (esim., Caser cipher) ja käyttää diskreetti logaritmit pakata sanoja. Fukushima ym. (2008) ehdotti koodata selkeät numerot yksin tai operaatioita ja sitten purkaa laskennan tulos ennen lähtöä. Kovacheva (2013) ehdotti merkkijonojen salaamista RC4-salauksella ja niiden salauksen purkamista suorituksen aikana.

Array transformation

Array on yksi yleisimmin käytetty tietorakenne. To obfuscate arrays, Collberg et al. (1998b) keskusteltiin useita muutoksia, kuten jakamalla yksi array useisiin alaryhmiin, yhdistämällä useita taulukoita yhdeksi array, taitto array lisätä sen ulottuvuus, tai litistämällä array vähentää ulottuvuutta. Ertaul ja Venkatesh (2005) ehdotti muuttamassa array indeksit komposiitti toimintoja. Zhu ym. (2006); Zhu (2007) ehdotti käyttää homomorphic salaus array transformation, mukaan lukien indeksin muutos, taitto, ja mairitteleva. Voimme esimerkiksi sekoittaa joukon alkioita I∗m mod n: llä, jossa i on alkuperäinen indeksi, n on alkuperäisen joukon koko ja m ja n ovat suhteellisen alkulukuja.

Obfuscating methods

Method inline/outline

a method is an independent procedure that can be called by other instructions of the program. Menetelmä inline korvaa alkuperäisen prosessikutsun itse funktioelimellä. Method outline toimii päinvastaisella tavalla, joka poimii järjestyksessä ohjeita ja abstrakti menetelmä. Ne ovat hyviä yrityksiä, jotka voivat hämärtää alkuperäisen abstraktio menettelyt (Collberg et al. 1997).

Method clone

jos johonkin menetelmään vedotaan voimakkaasti, voidaan menetelmästä luoda toisintoja ja satunnaisesti soittaa joku niistä. Sekoittaakseen kontradiktorisen tulkinnan, jokaisen replikaation version tulisi olla jotenkin ainutlaatuinen, kuten hyväksymällä erilaisia obfuskaatiomuunnoksia (Collberg et al. 1997) tai eri allekirjoituksia (Ertaul ja Venkatesh 2004).

Method aggregation/scattering

the idea is similar to data obfuscation. Voimme koota epäolennaisia menetelmiä yhteen menetelmään tai sironta menetelmä useisiin menetelmiin (Collberg et al. 1997; Alhainen 1998).

Method proxy

This approach creates proxy methods to sekoittaa reverse engineering. Voimme esimerkiksi luoda välityspalvelimia julkisina staattisina menetelminä satunnaistetuilla tunnisteilla. Samalle menetelmälle voi olla useita erillisiä välityspalvelimia (Dalla Preda ja Maggi 2017). Lähestymistapa on erittäin hyödyllinen, kun menetelmän allekirjoituksia ei voida muuttaa (Protsenko and Muller 2013).

Obfuskating classes

Obfuscating classes jakaa joitakin samanlaisia ajatuksia obfusating menetelmiä, kuten halkaisu ja klooni (Collberg et al. 1998b). Koska luokka on kuitenkin olemassa vain oliopainotteisissa ohjelmointikielissä, kuten Javassa ja.netissä, keskustelemme niistä ainutlaatuisena luokkana. Alla esittelemme tärkeimmät strategiat obfuscating luokat.

pudottavat modifioijat

Oliopainotteiset ohjelmat sisältävät modifioijia (esim., julkinen, yksityinen) rajoittaa luokkien ja luokkien jäsenten pääsyä. Muokkaajien pudottaminen poistaa tällaiset rajoitukset ja tekee kaikista jäsenistä julkisia (Protsenko and Muller 2013). Tämä lähestymistapa voi helpottaa muiden luokan hämäysmenetelmien käyttöönottoa.

jakaminen / Yhdistämisluokka

yhdistämisen/pilkkomisen idea on hämätä kehittäjien aikomuksia luokkia suunniteltaessa (Sosonkin et al. 2003). Kun yhdistämme luokkia, voimme siirtää paikallisia muuttujia tai paikallisia opetusryhmiä toiseen luokkaan (Fukushima et al. 2003).

luokkahierarkian madaltaminen

käyttöliittymä on tehokas työkalu olio-ohjelmissa. Samanlainen menetelmä proxy, voimme luoda valtakirjoja luokkiin rajapintoja (Sosonkin et al. 2003). Tehokkaampi tapa on kuitenkin rikkoa alkuperäinen perintösuhde luokkien kesken, joilla on rajapintoja. Antamalla kunkin solmun subtree luokan hierarkiassa toteuttaa samaa rajapintaa, voimme litistää hierarkia (Foket et al. 2012).

Vastaa

Sähköpostiosoitettasi ei julkaista.