Programmering

Java Tips 22: Beskytt bytekodene dine fra reversering / dekompilering

Hvis du skriver Java-klasser og distribuerer dem over Internett, bør du vite at folk kan konvertere, demontere eller dekompilere klassene dine til Java-kildekode. Den mest brukte dekompilatoren (i det minste offentlig) er Mocha. Mocha leser en eller flere filer med bytekoder (klasser) og konverterer dem tilbake til Java-kildekode. Selv om koden generert av Mocha ikke er nøyaktig den samme som den opprinnelige kildekoden, er den nær nok til at noen forstår og endrer. Hvis du er interessert i å utvikle Java-klasser og distribuere dem over Internett - og du vil beskytte dem mot å bli dekompilert - les videre.

Mokka: et eksempel

Før vi introduserer Crema, vil vi gå gjennom et eksempel ved hjelp av Mocha. Følgende enkle program viser strengen "Hei der" på skjermen:

klassetest {public static void main (String argv []) {System.out.println ("Hei der"); }} 

Hvis de ovennevnte fire linjene ble lagret i en fil, test.java, deretter kompilering test.java ville generere en ny fil, test.klasse, som inneholder Java-bytekodene som representerer Java-kildekoden. La oss nå kjøre Mocha på klassefilen og se Mocha-utgangen:

% java mocha.Decompiler test.class //% er min C shell-ledetekst på UNIX. 

Ovennevnte kommando genererer en fil som heter test.mocha, som inneholder Java-kildekoden generert av Mocha:

% mer test.mocha / * Dekompilert av Mocha fra test.class * / / * Opprinnelig kompilert fra test.java * / import java.io.PrintStream; klassetest {public static void main (String astring []) {System.out.println ("Hei der"); } test () {}} 

Som du kan se fra eksemplet ovenfor, har Mocha gitt oss Java-kildekode som er lett å lese og forstå. Hvis du kopierer denne filen til test.java, kompilere det igjen, og kjøre det, det vil kompilere og kjøre helt fint.

Crema til unnsetning!

Så hvordan kan du beskytte klassene dine fra å bli dekompilert? Ett svar er Crema. Crema krypterer den symbolske informasjonen i din .klasse filer slik at de blir mindre sårbare for dekompilering. Den symbolske informasjonen som Crema krypterer inkluderer navnet på klassen, superklassen, grensesnitt, variabelnavn, metoder og så videre. Disse symbolske navnene trengs av Java Virtual Machine (JVM) for å koble klassene dine med bibliotekspakker. Crema krypterer disse symbolske navnene og refererer til dem på samme måte slik at JVM fortsatt kan oppnå riktig kobling mellom klasser og pakker.

Så hvordan fungerer Crema? Før du distribuerer klassefilene dine på Internett, må du i utgangspunktet kjøre Crema på dem. Crema vil kryptere den symbolske informasjonen i dem, og vil plassere hver nye klasse i filen 1. krem. Din jobb er da å gi nytt navn 1. krem til noe sånt filnavn.klasse før du distribuerer den på Internett.

La oss kjøre Crema på vår test.klasse eksemplet vist ovenfor, og prøv å dekompilere det med Mocha:

% java Crema -v test.class // -v er et alternativ for å slå den detaljerte // modusen på. Det er mange flere alternativer. CREMA - Java Obfuscator - EVALUATION VERSION Copyright (c) 1996 Hanpeter van Vliet Loading test.class Forvirrende test Lagringstest som 1.crema MERK: Klasser som er behandlet med evalueringsversjonen av Crema kan bare brukes lokalt, da de fleste nettlesere vil nekte å last dem. For den fulle versjonen av Crema, pek nettleseren din til: //www.inter.nl.net/users/H.P.van.Vliet/crema.html (se Ressurser) 

Ovennevnte kommando har generert en ny fil, 1. krem, som inneholder bytekodene med kryptert symbolinformasjon. Merk at Crema har mange kommandolinjealternativparametere du kan bruke; for mer informasjon om Crema, se seksjonen Ressurser.

La oss nå flytte den filen til test.klasse igjen og dekompiler det med Mocha:

% mv 1.crema test.class% java mocha.Decompiler test.class java.lang.NullPointerException SIGSEGV 11 * segmentering brudd si_signo [11]: SIGSEGV 11 * segmentering brudd si_errno [0]: Feil 0 si_code [1]: SEGV_ACCERR [ addr: 0x0] stackbase = EFFFF35C, stackpointer = EFFFF040 Full thread dump: "Finalizer thread" (TID: 0xee3003b0, sys_thread_t: 0xef490de0) prio = 1 "Async Garbage Collector" (TID: 0xee300368, sys_thread4t: 0 = 0 tråd "(TID: 0xee300320, sys_thread_t: 0xef4f0de0) prio = 0" klokkehåndterer "(TID: 0xee3001f8, sys_thread_t: 0xef5b0de0) prio = 11" hoved "(TID: 0xee3000a0, sys_thread_t0x: 0x * .lang.Throwable.printStackTrace (Throwable.java) java.lang.ThreadGroup.uncaughtException (ThreadGroup.java) java.lang.ThreadGroup.uncaughtException (ThreadGroup.java) Monitor Cache Dump: Registrert skjermdump: Avslutt meg kølås: ikke kjent tråd kølås: ikke-eier Klasselås: ikke-eier Java-stakk-lås: ikke-eier Kodeskrivingslås: ikke-eier Heap-lås: ikke-eier H som avsluttende kø-lås: ikke-overvåket Monitor IO-lås: ikke-ektet Barnedød-overvåker: ikke-eier Hendelsesovervåker: ikke-eier I / O-skjerm: ikke-eies Alarmmonitor: ikke eies Venter på å bli varslet: "klokkehåndterer" : monitor eier: "main" Trådalarm Q: Avbryt (kjernedumpet) 

Som du kan se i koden ovenfor, er det første Mocha klager over er NullPointerException fordi det var forvirret om den symbolske informasjonen. Derfor oppnås vårt mål om å gjøre det vanskelig å dekompilere koden vår.

Det skal bemerkes at forfatteren av Mocha, Hanpeter van Vliet, også er forfatteren av Crema! Mokka distribueres uten kostnad. En evalueringskopi av Crema er tilgjengelig uten kostnad, men den fullstendige versjonen er et kommersielt produkt.

Når du distribuerer Java-klasser over Internett, kan du beskytte Java-bykoden din mot risikoen for å bli omvendt konstruert. Kodeeksemplene ovenfor viser hvordan Mocha brukes til å utføre dekompilering og hvordan Crema kan komme til unnsetning ved å forhindre slik aktivitet.

Qusay H. Mahmoud er utdannet student i informatikk ved University of New Brunswick, Saint John campus, Canada.

Lær mer om dette emnet

  • Redaktørens kommentar Siden Mr. van Vliets død (fra kreft) har nettstedene han opprettet for distribusjon av Mocha og Crema ikke lenger eksistert.
  • Eric Smiths distribusjonsside for mokka //www.brouhaha.com/~eric/computers/mocha.html
  • Crema på CERN-nettstedet //java.cern.ch:80/CremaE1/DOC/quickstart.html

Denne historien, "Java Tips 22: Protect your bytecodes from reverse engineering / decompilation" ble opprinnelig utgitt av JavaWorld.

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