Programmēšana

Java padoms 22: Aizsargājiet savus baitkodus no reversās inženierijas / dekompilācijas

Ja rakstāt Java klases un izplatāt tās internetā, jums jāzina, ka cilvēki var pārveidot, izjaukt vai dekompilēt jūsu klases Java avota kodā. Visplašāk izmantotais dekompilators (vismaz publiski) ir Mocha. Mocha nolasa vienu vai vairākus bytecodes (klases) failus un pārveido tos atpakaļ par Java avota kodu. Kaut arī Močas ģenerētais kods nav tieši tāds pats kā sākotnējais pirmkods, tas ir pietiekami tuvu, lai kāds to saprastu un modificētu. Ja jūs interesē Java klašu izstrāde un izplatīšana internetā - un jūs vēlētos pasargāt tās no dekompilēšanas - lasiet tālāk.

Mocha: piemērs

Pirms Crema ieviešanas mēs iepazīsimies ar piemēru, izmantojot Mocha. Šī vienkāršā programma ekrānā parāda virkni "Hi there":

klases pārbaude {public static void main (String argv []) {System.out.println ("Sveiki tur"); }} 

Ja iepriekš minētās četras rindas tika saglabātas failā, tests.java, pēc tam apkopojot tests.java ģenerētu jaunu failu, tests.klase, kas satur Java baitkodus, kas apzīmē šo Java pirmkodu. Tagad palaidīsim Mocha klases failā un redzēsim Mocha izvadi:

% java mocha.Decompiler test.class //% ir mana C čaulas uzvedne UNIX. 

Iepriekš minētā komanda ģenerē failu ar nosaukumu tests.mocha, kas satur Java avota kodu, ko ģenerējis Mocha:

% vairāk test.mocha / * Mocha sastādījis no test.class * / / * Sākotnēji sastādīts no test.java * / import java.io.PrintStream; klases pārbaude {public static void main (String astring []) {System.out.println ("Sveiki tur"); } pārbaude() { } } 

Kā redzat no iepriekš minētā piemēra, Mocha mums ir iedevis Java avota kodu, kas ir viegli lasāms un saprotams. Ja kopējat šo failu uz tests.java, apkopojiet to vēlreiz un palaidiet, tas kompilēs un darbosies lieliski.

Krēma glābšanai!

Tātad, kā jūs varat pasargāt savas klases no sadalīšanas? Viena atbilde ir Crema. Crema sajauc simbolisko informāciju jūsu .klase failus, lai tie kļūtu mazāk neaizsargāti pret dekompilāciju. Simboliskajā informācijā, ko Crema izkrāpj, ir klases nosaukums, tās superklase, saskarnes, mainīgo nosaukumi, metodes utt. Šie simboliskie nosaukumi nepieciešami Java virtuālajai mašīnai (JVM), lai saistītu jūsu klases ar bibliotēkas pakotnēm. Crema maisa šos simboliskos nosaukumus un atsaucas uz tiem tāpat, lai JVM joprojām varētu panākt pareizu saikni starp klasēm un paketēm.

Tātad, kā Crema darbojas? Būtībā pirms klases failu izplatīšanas internetā palaidiet Crema. Crema pārmeklēs tajos esošo simbolisko informāciju un ievietos failā katru jauno klasi 1. krēma. Jūsu uzdevums tad ir pārdēvēt 1. krēma uz kaut ko līdzīgu faila nosaukums.klase pirms izplatīšanas internetā.

Palaidīsim Crema uz mūsu tests.klase iepriekš parādītais piemērs, un pēc tam mēģiniet to dekompilēt ar Mocha:

% java Crema -v test.class // -v ir iespēja ieslēgt verbose // režīmu. Ir daudz vairāk iespēju. CREMA - Java obfuscator - NOVĒRTĒJUMA VERSIJA Autortiesības (c) 1996 Hanpeter van Vliet Loading test.class Obfuscating test Saglabāšanas tests kā 1. crema PIEZĪME: Klases, kas apstrādātas ar Crema novērtēšanas versiju, var izmantot tikai lokāli, jo lielākā daļa pārlūkprogrammu atteiksies tos ielādēt. Lai iegūtu pilnu Crema versiju, norādiet pārlūkprogrammā: //www.inter.nl.net/users/H.P.van.Vliet/crema.html (skatiet resursus) 

Iepriekš minētā komanda ir izveidojusi jaunu failu, 1. krēma, kurā ir baitkodi ar kodētu simbolisku informāciju. Ņemiet vērā, ka Crema ir daudz komandrindas opciju parametru, kurus varat izmantot; Plašāku informāciju par Crema skatiet sadaļā Resursi.

Tagad pārvietosim šo failu uz tests.klase vēlreiz un dekompilējiet to, izmantojot Mocha:

% mv 1.crema test.class% java mocha.Decompiler test.class java.lang.NullPointerException SIGSEGV 11 * segmentācijas pārkāpums si_signo [11]: SIGSEGV 11 * segmentācijas pārkāpums si_errno [0]: kļūda 0 si_code [1]: SEGV_ACCERR [ addr: 0x0] stackbase = EFFFF35C, stackpointer = EFFFF040 Pilna pavediena izgāztuve: "Finalizer thread" (TID: 0xee3003b0, sys_thread_t: 0xef490de0) prio = 1 "Async Garbage Collector" (TID: 0xee300368, sys_xreadread_t = 0 pavediens "(TID: 0xee300320, sys_thread_t: 0xef4f0de0) prio = 0" pulksteņa apstrādātājs "(TID: 0xee3001f8, sys_thread_t: 0xef5b0de0) prio = 11" main " .lang.Throwable.printStackTrace (Throwable.java) java.lang.ThreadGroup.uncaughtException (ThreadGroup.java) java.lang.ThreadGroup.uncaughtException (ThreadGroup.java) Monitora kešatmiņas izgāztuve: Reģistrēta monitora dump rindas slēdzene: nepiederoša Klases atslēga: nepiederoša Java kaudzes atslēga: nepiederoša Koda pārrakstīšanas atslēga: nepiederoša Kaudzes atslēga: nepiederoša H kā pabeigšanas rindas bloķēšana: nepiederošs Monitora IO bloķēšana: nepiederošs Bērnu nāves monitors: nepiederīgs Notikumu monitors: nepiederošs I / O monitors: nepiederīgs Trauksmes monitors: nepiederošs Gaida paziņojumu: "pulksteņa apstrādātājs" Sbrk bloķēšana: nepiederošs Monitora kešatmiņas bloķēšana: nepiederīgs Monitora reģistrs : monitora īpašnieks: "main" Thread Alarm Q: Pārtraukt (kodols izgāzts) 

Kā redzat iepriekš redzamajā kodā, pirmā lieta, par ko Mocha sūdzas, ir a NullPointerException jo tas bija neizpratnē par simbolisko informāciju. Tādējādi mūsu mērķis apgrūtināt koda dekompilēšanu ir sasniegts.

Jāatzīmē, ka Mocha autors Hanpeter van Vliet ir arī Crema autors! Mocha tiek izplatīta bez maksas. Crema novērtējuma kopija ir pieejama bez maksas, bet pilna versija ir komerciāls produkts.

Izplatot Java klases internetā, jūs varat pasargāt savu Java baitkodu no riska, ka to pārveidos. Iepriekš minētie kodu piemēri parāda, kā Mocha tiek izmantots dekompilācijas veikšanai un kā Crema var nonākt glābšanā, novēršot šādas darbības.

Kusejs H. Mahmuds ir aspirants datorzinātnēs Ņūbransvikas Universitātē, Sentdžonsa pilsētiņā, Kanādā.

Uzziniet vairāk par šo tēmu

  • Kopš van Vlita kunga nāves (no vēža) vietnes, kuras viņš izveidoja Mocha un Crema izplatīšanai, vairs nepastāv.
  • Ērika Smita Mocha izplatīšanas vietne //www.brouhaha.com/~eric/computers/mocha.html
  • Crema CERN vietnē //java.cern.ch:80/CremaE1/DOC/quickstart.html

Šo stāstu “Java Tip 22: Aizsargājiet savus baitkodus no reversās inženierijas / dekompilācijas” sākotnēji publicēja JavaWorld.

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