Programovanie

Java Tip 22: Chráňte svoje bytové kódy pred reverzným inžinierstvom / dekompiláciou

Ak píšete triedy Java a distribuujete ich cez internet, mali by ste vedieť, že ľudia môžu vaše triedy spätne analyzovať, rozobrať alebo dekompilovať do zdrojového kódu Java. Najpoužívanejším dekompilátorom (aspoň verejne) je Mocha. Mocha číta jeden alebo viac súborov bajtových kódov (tried) a prevádza ich späť do zdrojového kódu Java. Aj keď kód vygenerovaný programom Mocha nie je úplne rovnaký ako pôvodný zdrojový kód, je dosť blízko na to, aby ho niekto pochopil a upravil. Ak máte záujem o vývoj tried Java a ich distribúciu cez internet - a chcete ich chrániť pred dekompilovaním - čítajte ďalej.

Mocha: príklad

Pred zavedením Cremy si prejdeme príkladom pomocou Mocha. Nasledujúci jednoduchý program zobrazí reťazec „Ahoj“ na obrazovke:

test triedy {public static void main (String argv []) {System.out.println ("Ahoj tam"); }} 

Ak boli vyššie uvedené štyri riadky uložené v súbore, test.java, potom kompilácia test.java vygeneruje nový súbor, test.trieda, ktorý obsahuje bytové kódy Java predstavujúce daný zdrojový kód Java. Teraz spustíme Mocha na súbore triedy a pozrieme si výstup Mocha:

% java mocha.Decompiler test.class // the% is my C shell prompt on UNIX. 

Vyššie uvedený príkaz vygeneruje súbor s názvom test.mocha, ktorý obsahuje zdrojový kód Java vygenerovaný programom Mocha:

% viac test.mocha / * Dekompilovaný Mochou z test.class * / / * Pôvodne zostavený z test.java * / import java.io.PrintStream; test triedy {public static void main (String astring []) {System.out.println ("Ahoj tam"); } test () {}} 

Ako vidíte z vyššie uvedeného príkladu, spoločnosť Mocha nám poskytla zdrojový kód Java, ktorý je ľahko čitateľný a zrozumiteľný. Ak skopírujete tento súbor do test.java, skompilovať to znova a spustiť to, bude to kompilovať a bežať v pohode.

Crema na záchranu!

Ako teda môžete chrániť svoje triedy pred rozložením? Jednou z odpovedí je Crema. Crema zakóduje symbolické informácie vo vašom .trieda súbory tak, aby sa stali menej náchylnými na dekompiláciu. Symbolické informácie, ktoré Crema zakóduje, zahŕňajú názov triedy, jej nadtriedu, rozhrania, názvy premenných, metódy atď. Tieto symbolické názvy potrebuje virtuálny počítač Java (JVM) na prepojenie vašich tried s balíčkami knižníc. Crema zašifruje tieto symbolické názvy a urobí na ne odkazy rovnakým spôsobom, aby mohol JVM stále dosiahnuť správne prepojenie medzi triedami a balíkmi.

Ako teda Crema funguje? Pred distribúciou súborov triedy na internete v podstate na nich spustite program Crema. Crema vyškriabe symbolické informácie, ktoré sú v nich obsiahnuté, a umiestni každú novú triedu do súboru 1.krém. Vašou úlohou potom je premenovať sa 1.krém na niečo ako nazov souboru.trieda pred distribúciou na internete.

Poďme Crema na našu test.trieda príklad zobrazený vyššie, a potom to skúste dekompilovať pomocou Mocha:

% java Crema -v test.class // -v je možnosť zapnutia režimu verbose //. Možností je oveľa viac. CREMA - Java Obfuscator - HODNOTENIE VERZIA Copyright (c) 1996 Hanpeter van Vliet Načítanie testu.class Test zahmlievania Uloženie testu ako 1.krém POZNÁMKA: Triedy spracované s hodnotiacou verziou Crema je možné použiť iba lokálne, pretože väčšina prehľadávačov odmietne naložiť ich. Plnú verziu aplikácie Crema nájdete vo svojom prehliadači na adrese: //www.inter.nl.net/users/H.P.van.Vliet/crema.html (pozri zdroje) 

Vyššie uvedený príkaz vygeneroval nový súbor, 1.krém, ktorý obsahuje bytové kódy s kódovanými symbolickými informáciami. Upozorňujeme, že Crema má veľa parametrov možností príkazového riadku, ktoré môžete použiť; Viac informácií o Creme nájdete v časti Zdroje.

Teraz presunieme tento súbor do test.trieda znova a dekompilovať to pomocou Mocha:

% mv 1.crema test.class% java mocha.Decompiler test.class java.lang.NullPointerException SIGSEGV 11 * porušenie segmentácie si_signo [11]: SIGSEGV 11 * porušenie segmentácie si_errno [0]: Chyba 0 si_code [1]: SEGV_ACCERR [ addr: 0x0] stackbase = EFFFF35C, stackpointer = EFFFF040 Výpis celého vlákna: "Finalizačné vlákno" (TID: 0xee3003b0, sys_thread_t: 0xef490de0) prio = 1 "Async Garbage Collector" (TID: 0xee300368, sys_thread_t: 0x0ef0) thread "(TID: 0xee300320, sys_thread_t: 0xef4f0de0) prio = 0" obsluha hodín "(TID: 0xee3001f8, sys_thread_t: 0xef5b0de0) prio = 11" main "(TID: 0xee3000a0, sys_thread_t: 0x835) .lang.Throwable.printStackTrace (Throwable.java) java.lang.ThreadGroup.uncaughtException (ThreadGroup.java) java.lang.ThreadGroup.uncaughtException (ThreadGroup.java) Výpis medzipamäte monitora: Registrovaný výpis monitora: Uzavrieť zámok frontu: neznáme vlákno zámok fronty: neuvedený Zámok triedy: neuvedený Zámok zásobníka Java: neuvedený Zámok prepísania kódu: neuvedený Zámok haldy: neznámy H ako zámok frontu finalizácie: neuvedený Zámok IO monitora: neuvedený Monitor smrti dieťaťa: neuvedený Monitor udalostí: neuvedený monitor I / O: neuvedený Monitor alarmu: neuvedený Čakanie na upozornenie: „obsluha hodín“ Zámok Sbrk: neuvedený zámok medzipamäte monitora: neuvedený register monitora : monitorovať majiteľa: „hlavný“ Alarm vlákna Q: Zrušiť (vyradené jadro) 

Ako vidíte v kóde vyššie, prvá vec, na ktorú sa Mocha sťažuje, je NullPointerException pretože to bolo zmätené ohľadom symbolických informácií. Preto je dosiahnutý náš cieľ, ktorým je sťaženie dekompilovania nášho kódu.

Je potrebné poznamenať, že autor knihy Mocha, Hanpeter van Vliet, je tiež autorom knihy Crema! Mocha sa distribuuje bez poplatkov. Hodnotiaca kópia aplikácie Crema je k dispozícii bezplatne, úplná verzia je však komerčným produktom.

Pri distribúcii tried Java cez internet môžete chrániť svoj bajtkód Java pred rizikom spätného inžinierstva. Vyššie uvedené príklady kódov ukazujú, ako sa Mocha používa na uskutočnenie dekompilácie a ako môže Crema prísť na záchranu tak, že zabráni takejto činnosti.

Qusay H. Mahmoud je postgraduálny študent v odbore počítačová veda na University of New Brunswick, kampus Saint John, Kanada.

Získajte viac informácií o tejto téme

  • Poznámka redaktora Od smrti pána van Vlieta (na rakovinu) zanikli stránky, ktoré vytvoril pre distribúciu Mocha a Crema.
  • Eric Smith's Mocha distribution site //www.brouhaha.com/~eric/computers/mocha.html
  • Crema na webe CERN //java.cern.ch:80/CremaE1/DOC/quickstart.html

Tento príbeh, „Java Tip 22: Chráňte svoje bytové kódy pred reverzným inžinierstvom / dekompiláciou“, bol pôvodne publikovaný spoločnosťou JavaWorld.

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