Programmering

Java Tip 22: Beskyt dine bytecodes mod reverse engineering / dekompilering

Hvis du skriver Java-klasser og distribuerer dem over internettet, skal du vide, at folk kan reverse-engineer, adskille eller dekompilere dine klasser til Java-kildekode. Den mest anvendte dekompiler (i det mindste offentligt) er Mocha. Mocha læser en eller flere filer af bytekoder (klasser) og konverterer dem tilbage til Java-kildekode. Selvom koden genereret af Mocha ikke er nøjagtig den samme som den oprindelige kildekode, er den tæt nok til, at nogen kan forstå og ændre. Hvis du er interesseret i at udvikle Java-klasser og distribuere dem over internettet - og du gerne vil beskytte dem mod dekompilering - læs videre.

Mokka: et eksempel

Før vi introducerer Crema, går vi gennem et eksempel ved hjælp af Mocha. Følgende enkle program viser strengen "Hej der" på skærmen:

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

Hvis de ovennævnte fire linjer blev gemt i en fil, test.javaderefter kompilering test.java ville generere en ny fil, test.klasse, der indeholder Java-bytecodes, der repræsenterer den Java-kildekode. Lad os nu køre Mocha på klassefilen og se Mocha-output:

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

Ovenstående kommando genererer en fil, der kaldes test.mocha, som indeholder Java-kildekoden genereret af Mocha:

% mere test.mocha / * Dekompileret af Mocha fra test.class * / / * Oprindeligt kompileret fra test.java * / import java.io.PrintStream; klassetest {public static void main (String astring []) {System.out.println ("Hej der"); } test () {}} 

Som du kan se fra eksemplet ovenfor, har Mocha givet os Java-kildekode, der er let at læse og forstå. Hvis du kopierer denne fil til test.java, kompilér det igen, og kør det, det kompilerer og kører fint.

Crema til undsætning!

Så hvordan kan du beskytte dine klasser mod at blive dekompileret? Et svar er Crema. Crema krypterer de symbolske oplysninger i din .klasse filer, så de bliver mindre sårbare over for dekompilering. De symbolske oplysninger, som Crema krypterer, inkluderer navnet på klassen, dens superklasse, grænseflader, variabelnavne, metoder osv. Disse symbolske navne er nødvendige af Java Virtual Machine (JVM) for at forbinde dine klasser med bibliotekspakker. Crema krypterer disse symbolske navne og henviser til dem på samme måde, så JVM stadig kan opnå den korrekte sammenkædning mellem klasser og pakker.

Så hvordan fungerer Crema? Grundlæggende skal du køre Crema på dem, før du distribuerer dine klassefiler på Internettet. Crema vil kryptere de symbolske oplysninger indeholdt i dem og placere hver nye klasse i filen 1. krem. Dit job er derefter at omdøbe 1. krem til noget lignende filnavn.klasse inden du distribuerer det på Internettet.

Lad os køre Crema på vores test.klasse eksempel vist ovenfor, og prøv derefter at dekompilere det med Mocha:

% java Crema -v test.class // -v er en mulighed for at slå den detaljerede // tilstand til. Der er mange flere muligheder. CREMA - Java Obfuscator - EVALUATION VERSION Copyright (c) 1996 Hanpeter van Vliet Loading test.class Tilvirrende test Lagringstest som 1.crema BEMÆRK: Klasser behandlet med evalueringsversionen af ​​Crema kan kun bruges lokalt, da de fleste browsere nægter at indlæse dem. For den fulde version af Crema skal du rette din browser til: //www.inter.nl.net/users/H.P.van.Vliet/crema.html (se Ressourcer) 

Ovenstående kommando har genereret en ny fil, 1. krem, som indeholder bytekoder med krypteret symbolsk information. Bemærk, at Crema har mange kommandolinjeparametre, som du kan bruge; for mere information om Crema, se afsnittet Ressourcer.

Lad os nu flytte den fil ind test.klasse igen og dekompiler det ved hjælp af Mocha:

% mv 1.crema test.class% java mocha.Decompiler test.class java.lang.NullPointerException SIGSEGV 11 * segmentering overtrædelse si_signo [11]: SIGSEGV 11 * segmenteringsovertrædelse si_errno [0]: Fejl 0 si_code [1]: SEGV_ACCERR [ addr: 0x0] stackbase = EFFFF35C, stackpointer = EFFFF040 Fuld tråddump: "Finalizer thread" (TID: 0xee3003b0, sys_thread_t: 0xef490de0) prio = 1 "Async Garbage Collector" (TID: 0xee300368, sys_thread4t: 0 = 0xee300368, sys_thread4t: 0 tråd "(TID: 0xee300320, sys_thread_t: 0xef4f0de0) prio = 0" urbehandler "(TID: 0xee3001f8, sys_thread_t: 0xef5b0de0) prio = 11" main "(TID: 0xee3000a0, sys_thread_t0x: 0 * .lang.Throwable.printStackTrace (Throwable.java) java.lang.ThreadGroup.uncaughtException (ThreadGroup.java) java.lang.ThreadGroup.uncaughtException (ThreadGroup.java) Monitor Cache Dump: Registreret skærmdump: Afslut mig kølås: ikke-gevind tråd kø-lås: ikke-ejet Klasselås: ikke-ejet Java stack-lås: ikke-e-kode Kodeskriv lås: ikke-ejet Heap-lås: ikke-ejet H som afslutningskø-lås: ikke ejet Monitor IO-lås: ikke ejet Børnedødsovervågning: ikke ejet Hændelsesmonitor: ikke ejet I / O-monitor: ikke ejet Alarmmonitor: ikke ejet Venter på at blive underrettet: "urbehandler" Sbrk-lås: ikke ejet Monitor cache-lås: ikke ejet Overvågningsregister : monitor ejer: "main" Trådalarm Q: Afbryd (kernedumpet) 

Som du kan se i koden ovenfor, er den første ting, Mocha klager over, en NullPointerException fordi det var forvirret over de symbolske oplysninger. Derfor opnås vores mål om at gøre det vanskeligt at dekompilere vores kode.

Det skal bemærkes, at forfatteren af ​​Mocha, Hanpeter van Vliet, også er forfatter til Crema! Mokka distribueres uden beregning. En evalueringskopi af Crema er tilgængelig gratis, men den fulde version er et kommercielt produkt.

Når du distribuerer Java-klasser over internettet, kan du beskytte din Java-bytecode mod risikoen for at blive reverse-engineered. Kodeeksemplerne ovenfor viser, hvordan Mocha bruges til at udføre dekompilering, og hvordan Crema kan komme til undsætning ved at forhindre sådan aktivitet.

Qusay H. Mahmoud er kandidatstudent i datalogi ved University of New Brunswick, Saint John campus, Canada.

Lær mere om dette emne

  • Redaktørens bemærkning Siden Mr. van Vliets død (på grund af kræft) er de steder, han oprettede til distribution af Mocha og Crema, ophørt med at eksistere.
  • Eric Smiths distributionswebsted Mocha //www.brouhaha.com/~eric/computers/mocha.html
  • Crema på CERN-webstedet //java.cern.ch:80/CremaE1/DOC/quickstart.html

Denne historie, "Java Tip 22: Beskyt dine bytekoder mod reverse engineering / dekompilering" blev oprindeligt udgivet af JavaWorld.