Ohjelmointi

Java-vinkki 22: Suojaa tavukoodisi käänteiseltä suunnittelulta / dekompiloinnilta

Jos kirjoitat Java-luokkia ja jaat niitä Internetissä, sinun tulisi tietää, että ihmiset voivat suunnitella, purkaa tai hajottaa luokkasi Java-lähdekoodiksi. Yleisimmin käytetty dekompilaattori (ainakin julkisesti) on Mocha. Mocha lukee yhden tai useamman tavukooditiedoston (luokan) ja muuntaa ne takaisin Java-lähdekoodiksi. Vaikka Mochan luoma koodi ei ole täsmälleen sama kuin alkuperäinen lähdekoodi, se on tarpeeksi lähellä, jotta joku ymmärtää ja muokata. Jos olet kiinnostunut kehittämään Java-luokkia ja jakamaan niitä Internetissä - ja haluat suojata niitä hajoamiselta - lue lisää.

Mocha: esimerkki

Ennen Creman esittelyä käymme läpi esimerkin Mochalla. Seuraava yksinkertainen ohjelma näyttää merkkijonon "Hi there" näytöllä:

luokan testi {public static void main (String argv []) {System.out.println ("Hei siellä"); }} 

Jos yllä olevat neljä riviä on tallennettu tiedostoon, testi.javaja sitten kokoaminen testi.java luo uuden tiedoston, testi. luokka, joka sisältää Java-lähdekoodia edustavat Java-tavukoodit. Suoritetaan nyt Mocha luokan tiedostossa ja katsotaan Mocha-lähtö:

% java mocha.Decompiler test.class //% on minun C-komentokehotteeni UNIXissa. 

Yllä oleva komento luo tiedoston nimeltä testi. mokka, joka sisältää Mochan luoman Java-lähdekoodin:

% enemmän test.mocha / * Mocha koonnut test.classista * / / * Alun perin koottu test.java * / import java.io.PrintStream; luokan testi {public static void main (String astring []) {System.out.println ("Hei siellä"); } testi () {}} 

Kuten yllä olevasta esimerkistä näet, Mocha on antanut meille Java-lähdekoodin, joka on helppo lukea ja ymmärtää. Jos kopioit tämän tiedoston testi.java, käännä se uudelleen ja suorita se, se kääntyy ja toimii hienosti.

Crema pelastamaan!

Joten miten voit suojata luokkasi hajoamiselta? Yksi vastaus on Crema. Crema sekoittaa symbolisen tiedon .luokka tiedostoja niin, että niistä tulee vähemmän alttiita dekompiloinnille. Symbolinen tieto, jonka Crema sekoittaa, sisältää luokan nimen, sen yläluokan, rajapinnat, muuttujien nimet, menetelmät ja niin edelleen. Näitä symbolisia nimiä tarvitaan Java-virtuaalikoneella (JVM) linkittääksesi luokkasi kirjastopaketteihin. Crema sekoittaa nämä symboliset nimet ja viittaa niihin samalla tavalla, jotta JVM voi silti saavuttaa oikean linkityksen luokkien ja pakettien välillä.

Joten miten Crema toimii? Ennen kuin jaat luokkatiedostojasi Internetissä, suorita Crema niillä. Crema sekoittaa niihin sisältyvät symboliset tiedot ja sijoittaa kaikki uudet luokat tiedostoon 1. crema. Tehtäväsi on sitten nimetä uudelleen 1. crema jotain tiedostonimi.luokka ennen sen levittämistä Internetissä.

Suoritetaan Crema omalla testi. luokka ja yritä sitten purkaa se Mochalla:

% java Crema -v test.class // -v on vaihtoehto kääntää verbose // -tila päälle. Vaihtoehtoja on paljon enemmän. CREMA - Java Obfuscator - ARVIOINTIVERSIO Copyright (c) 1996 Hanpeter van Vliet Loading test.class Obfuscating test Tallennustesti 1.kreemana HUOMAUTUS: Creman arviointiversiolla käsiteltyjä luokkia voidaan käyttää vain paikallisesti, koska useimmat selaimet kieltäytyvät lataa ne. Katso Creman täysversio osoittamalla selaimesi osoitteeseen: //www.inter.nl.net/users/H.P.van.Vliet/crema.html (katso Resurssit) 

Yllä oleva komento on luonut uuden tiedoston, 1. crema, joka sisältää tavukoodit salatuilla symbolisilla tiedoilla. Huomaa, että Cremalla on monia komentorivivalintaparametreja, joita voit käyttää; lisätietoja Cremasta on Resurssit-osiossa.

Siirretään nyt tiedosto tiedostoon testi. luokka uudelleen ja dekompiloi se Mochalla:

% mv 1.crema test.class% java mocha.Decompiler test.class java.lang.NullPointerException SIGSEGV 11 * segmentointirikkomus si_signo [11]: SIGSEGV 11 * segmentointirikkomus si_errno [0]: Virhe 0 si_code [1]: SEGV_ACCERR [ addr: 0x0] stackbase = EFFFF35C, stackpointer = EFFFF040 Täydellinen ketjun dump: "Viimeistelijän säie" (TID: 0xee3003b0, sys_thread_t: 0xef490de0) prio = 1 "Async Garbage Collector" (TID: 0xee300368, sys_thread4c = sys_thread4 säie "(TID: 0xee300320, sys_thread_t: 0xef4f0de0) prio = 0" kellonkäsittelijä "(TID: 0xee3001f8, sys_thread_t: 0xef5b0de0) prio = 11" main "(TID: 0xee3000a0, sys_threadva * 0: current * = .lang.Throwable.printStackTrace (Throwable.java) java.lang.ThreadGroup.uncaughtException (ThreadGroup.java) java.lang.ThreadGroup.uncaughtException (ThreadGroup.java) Monitorin välimuistin tyhjennys: Rekisteröity monitorin kaatopaikka: Viimeistele minulle jono jonolukko: omistamaton Luokan lukitus: omistamaton Java-pinon lukitus: omistamaton Koodin uudelleenkirjoituslukko: omistamaton Kasan lukko: omistamaton H viimeistelyjonojohdon lukituksena: omistamaton Monitorin IO-lukitus: omistamaton Lapsen kuolemantarkkailija: omistamaton Tapahtumavalvonta: omistamaton I / O-näyttö: tuntematon Hälytysvalvoja: tuntematon Odottaa ilmoitusta: "kellonkäsittelijä" Sbrk-lukko: tuntematon näytön välimuistilukko: tuntematon näytön rekisteri : näytön omistaja: "main" säiehälytys Q: Keskeytä (ydin tyhjennetty) 

Kuten yllä olevasta koodista näet, ensimmäinen asia, josta Mocha valittaa, on a NullPointerException koska se oli hämmentynyt symbolisesta tiedosta. Näin ollen tavoitteemme vaikeuttaa koodin purkamista on saavutettu.

On huomattava, että Mochan kirjoittaja Hanpeter van Vliet on myös Crema! Mokkaa jaetaan ilmaiseksi. Arviointikopio Cremasta on saatavana ilmaiseksi, mutta täysversio on kaupallinen tuote.

Kun jaat Java-luokkia Internetissä, voit suojata Java-tavukoodisi käänteisen suunnittelun riskiltä. Yllä olevat koodiesimerkit osoittavat, kuinka Mokkaa käytetään dekompilointiin ja kuinka Crema voi tulla pelastamaan estämällä tällaisen toiminnan.

Qusay H.Mahmoud on jatko-opiskelija tietojenkäsittelytieteessä New Brunswickin yliopistossa, Saint Johnin kampuksella, Kanadassa.

Lisätietoja tästä aiheesta

  • Toimittajan huomautus Herra van Vlietin kuolemasta (syövästä johtuen) Mochan ja Creman jakeluun perustamat sivustot ovat lakanneet olemasta.
  • Eric Smithin Mocha-jakelusivusto //www.brouhaha.com/~eric/computers/mocha.html
  • Crema CERN-sivustossa //java.cern.ch:80/CremaE1/DOC/quickstart.html

Tämän tarinan, "Java Tip 22: Protect bytecodes from reverse engineering / decompilation", julkaisi alun perin JavaWorld.

$config[zx-auto] not found$config[zx-overlay] not found