Programiranje

Nasvet Java 22: Zaščitite svoje bajtke pred obratnim inženiringom / dekompilacijo

Če pišete razrede Java in jih distribuirate po internetu, morate vedeti, da lahko ljudje vaše razrede izvedejo obratno, razstavijo ali razstavijo v izvorno kodo Java. Najpogosteje uporabljeni dekompilator (vsaj javno) je Mocha. Mocha prebere eno ali več datotek bajt kod (razredov) in jih pretvori nazaj v izvorno kodo Java. Čeprav koda, ki jo ustvari Mocha, ni povsem enaka izvorni izvorni kodi, je dovolj blizu, da jo nekdo lahko razume in spremeni. Če vas zanima razvijanje razredov Java in njihovo distribucijo prek interneta - in bi jih radi zaščitili pred dekompilacijo - berite naprej.

Mocha: primer

Pred predstavitvijo Creme se bomo sprehodili skozi primer uporabe Moke. Naslednji preprost program na zaslonu prikaže niz »Zdravo«:

preizkus razreda {public static void main (String argv []) {System.out.println ("Zdravo"); }} 

Če so bile zgornje štiri vrstice shranjene v datoteki, test.java, nato sestavljanje test.java bi ustvaril novo datoteko, test.razred, ki vsebuje bajtne kode Java, ki predstavljajo to izvorno kodo Java. Zdaj pa zaženimo Mocha v datoteki razreda in si oglejte izhod Mocha:

% java mocha.Decompiler test.class // poziv% lupine% je moj C na UNIX-u. 

Zgornji ukaz ustvari datoteko z imenom test.mocha, ki vsebuje izvorno kodo Java, ki jo je ustvaril Mocha:

% več test.mocha / * Mocha zbral iz test.class * / / * Prvotno sestavljeno iz test.java * / import java.io.PrintStream; preizkus razreda {public static void main (String astring []) {System.out.println ("Zdravo"); } test () {}} 

Kot lahko vidite iz zgornjega primera, nam je Mocha dal izvorno kodo Java, ki je enostavna za branje in razumevanje. Če kopirate to datoteko v test.java, znova ga prevedite in zaženite, sestavil in zagnal bo v redu.

Crema na pomoč!

Torej, kako lahko zaščitite svoje razrede pred dekompilacijo? Eden od odgovorov je Crema. Crema premeša simbolične podatke v vašem .razred datoteke, tako da bodo postale manj občutljive na dekompilacijo. Simbolični podatki, ki jih Crema premeša, vključujejo ime razreda, njegov superrazred, vmesnike, imena spremenljivk, metode itd. Ta simbolična imena potrebuje navidezni stroj Java (JVM) za povezavo predavanj s knjižnimi paketi. Crema ta simbolična imena premeša in se na njih sklicuje na enak način, da lahko JVM še vedno doseže pravilno povezavo med razredi in paketi.

Kako torej deluje Crema? V bistvu pred distribucijo datotek predavanj po internetu zaženite Cremo na njih. Crema bo premešala simbolične informacije, ki jih vsebujejo, in bo vsak nov razred postavila v datoteko 1. krema. Vaša naloga je nato preimenovanje 1. krema na nekaj takega filename.class pred distribucijo na internetu.

Zaženimo Cremo na našem test.razred primer, prikazan zgoraj, in ga nato poskusite razstaviti z Mocha:

% java Crema -v test.class // -v je možnost, da vklopite podroben // način. Možnosti je še veliko več. CREMA - Java Obfuscator - VREDNOTENJE OCENE Copyright (c) 1996 Hanpeter van Vliet Nalaganje test.class Obfuscating test Shranjevanje testa kot 1.crema OPOMBA: Razrede, obdelane z ocenjevalno različico Creme, lahko uporabljate samo lokalno, saj večina brskalnikov zavrne jih naložite. Za popolno različico Creme usmerite brskalnik na: //www.inter.nl.net/users/H.P.van.Vliet/crema.html (glejte Viri) 

Zgornji ukaz je ustvaril novo datoteko, 1. krema, ki vsebuje bajtkode s kodiranimi simboličnimi informacijami. Upoštevajte, da ima Crema veliko parametrov možnosti ukazne vrstice, ki jih lahko uporabite; za več informacij o Cremi glejte poglavje Viri.

Zdaj pa premaknimo to datoteko v test.razred znova in ga razstavite z uporabo Mocha:

% mv 1.crema test.class% java mocha.Decompiler test.class java.lang.NullPointerException SIGSEGV 11 * kršitev segmentacije si_signo [11]: SIGSEGV 11 * kršitev segmentacije si_errno [0]: Napaka 0 si_code [1]: SEGV_ACCER addr: 0x0] stackbase = EFFFF35C, stackpointer = EFFFF040 Odlaganje celotne niti: "Nit zaključevalnika" (TID: 0xee3003b0, sys_thread_t: 0xef490de0) prio = 1 "Async Garbage Collector" (TID: 0xee300368, sys_dedd0dio nit "(TID: 0xee300320, sys_thread_t: 0xef4f0de0) prio = 0" urejevalnik ure "(TID: 0xee3001f8, sys_thread_t: 0xef5b0de0) prio = 11" main "(TID: 0xee3000a0, sys_thread_0 .lang.Throwable.printStackTrace (Throwable.java) java.lang.ThreadGroup.uncaughtException (ThreadGroup.java) java.lang.ThreadGroup.uncaughtException (ThreadGroup.java) Nadzor predpomnilnika Dump: Registriran Menadžer Dump Predpomnilnik: Registriran Menadžer Ustavi zaklepanje čakalne vrste: neznano Zaklepanje razreda: neznano zaklepanje sklada Java: neznano Zaklepanje prepisovanja kode: neznano Zaklepanje kupa: neznano H kot zaključek čakalne vrste za dokončanje: neznano Zaklepanje monitorja IO: neznano Nadzor otroške smrti: neznano Nadzornik dogodkov: neznan V / I monitor: neznan Nadzor alarma: neznan Čakanje na obvestilo: "urejevalec ure" Zaklepanje Sbrk: neznano zaklepanje predpomnilnika monitorja: neznan register monitorja : lastnik monitorja: "main" Thread Alarm Q: Prekini (jedro odvrženo) 

Kot lahko vidite v zgornji kodi, je prva stvar, nad katero se Mocha pritožuje, a NullPointerException ker je bila zmedena glede simbolnih informacij. Zato je dosežen naš cilj, da otežimo razstavljanje naše kode.

Treba je opozoriti, da je avtor knjige Mocha, Hanpeter van Vliet, tudi avtor Creme! Mocha se distribuira brezplačno. Preskusna kopija Creme je na voljo brezplačno, vendar je celotna različica komercialni izdelek.

Ko distribuirate razrede Java prek interneta, lahko zaščitite svojo bajtno kodo Java pred nevarnostjo, da bi bila spremenjena. Zgornji primeri kode kažejo, kako se Mocha uporablja za dekompilacijo in kako lahko Crema priskoči na pomoč s preprečevanjem takšnih dejavnosti.

Qusay H. Mahmoud je podiplomski študent računalništva na Univerzi v New Brunswicku v kampusu Saint John v Kanadi.

Preberite več o tej temi

  • Opomba urednika Od smrti gospoda van Vlieta (zaradi raka) mesta, ki jih je postavil za distribucijo Moke in Creme, niso več obstajala.
  • Spletno mesto Ericha Smitha za distribucijo Mocha //www.brouhaha.com/~eric/computers/mocha.html
  • Crema na spletnem mestu CERN //java.cern.ch:80/CremaE1/DOC/quickstart.html

To zgodbo, "Java Nasvet 22: Zaščitite svoje bytecode pred obratnim inženiringom / dekompilacijo", je prvotno objavil JavaWorld.

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