Programování

Java Tip 22: Chraňte své bytové kódy před reverzním inženýrstvím / dekompilací

Pokud píšete třídy Java a distribuujete je přes internet, měli byste vědět, že lidé mohou vaše třídy zpětně analyzovat, rozebrat nebo dekompilovat do zdrojového kódu Java. Nejčastěji používaným dekompilátorem (alespoň veřejně) je Mocha. Mocha načte jeden nebo více souborů bajtových kódů (tříd) a převede je zpět do zdrojového kódu Java. Přestože kód generovaný Mochou není úplně stejný jako původní zdrojový kód, je dostatečně blízko, aby ho někdo pochopil a upravil. Pokud máte zájem o vývoj tříd Java a jejich distribuci přes internet - a chcete je chránit před dekompilací - čtěte dále.

Mocha: příklad

Před zavedením Crema si projdeme příklad pomocí Mocha. Následující jednoduchý program zobrazí řetězec „Ahoj“ na obrazovce:

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

Pokud byly výše uvedené čtyři řádky uloženy do souboru, test.java, pak kompilace test.java vygeneruje nový soubor, testovací třída, který obsahuje bajtové kódy Java představující daný zdrojový kód Java. Nyní spustíme Mocha v souboru třídy a uvidíme výstup Mocha:

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

Výše uvedený příkaz generuje soubor s názvem test.mocha, který obsahuje zdrojový kód Java generovaný Mochou:

% více test.mocha / * Dekompilováno Mochou z test.class * / / * Původně kompilováno z test.java * / import java.io.PrintStream; test třídy {public static void main (String astring []) {System.out.println ("Ahoj tam"); } test() { } } 

Jak vidíte z výše uvedeného příkladu, společnost Mocha nám poskytla zdrojový kód Java, který je snadno čitelný a srozumitelný. Pokud tento soubor zkopírujete do test.java, zkompilujte to znovu a spusťte to, bude to kompilace a běh v pohodě.

Crema na záchranu!

Jak tedy můžete chránit své třídy před dekompilací? Jednou z odpovědí je Crema. Crema zakóduje symbolické informace ve vašem .třída soubory, aby se staly méně zranitelnými vůči dekompilaci. Symbolické informace, které Crema zakóduje, zahrnují název třídy, její nadtřídu, rozhraní, názvy proměnných, metody atd. Tyto symbolické názvy potřebuje virtuální stroj Java (JVM) k propojení vašich tříd s balíčky knihoven. Crema zakóduje tato symbolická jména a provede na ně odkazy stejným způsobem, aby JVM mohl stále dosáhnout správného propojení mezi třídami a balíčky.

Jak tedy Crema funguje? V zásadě před distribucí souborů třídy na internetu spusťte Crema na nich. Crema zakóduje symbolické informace v nich obsažené a umístí každou novou třídu do souboru 1. krém. Vaším úkolem pak je přejmenovat se 1. krém na něco jako název souboru. třída před distribucí na internetu.

Pojďme spustit Crema na našem testovací třída příklad zobrazený výše a zkuste to dekompilovat pomocí Mocha:

% java Crema -v test.class // -v je možnost zapnout podrobný // režim. Možností je mnohem více. CREMA - Java Obfuscator - HODNOCENÍ VERZE Copyright (c) 1996 Hanpeter van Vliet Načítání test.class Test zamlžování Ukládání testu jako 1.crema POZNÁMKA: Třídy zpracované s zkušební verzí Crema lze použít pouze lokálně, protože většina prohlížečů odmítne načíst je. Plnou verzi aplikace Crema nasměrujte ve svém prohlížeči na: //www.inter.nl.net/users/H.P.van.Vliet/crema.html (viz zdroje) 

Výše uvedený příkaz vygeneroval nový soubor, 1. krém, který obsahuje bytové kódy se zakódovanou symbolickou informací. Crema má mnoho parametrů možností příkazového řádku, které můžete použít; Další informace o aplikaci Crema najdete v části Zdroje.

Nyní přesuňte tento soubor do testovací třída znovu a dekompilovat to pomocí Mocha:

% mv 1.crema test.class% java mocha.Decompiler test.class java.lang.NullPointerException SIGSEGV 11 * porušení segmentace si_signo [11]: SIGSEGV 11 * porušení segmentace 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: 0x0ef1) vlákno "(TID: 0xee300320, sys_thread_t: 0xef4f0de0) prio = 0" hodinový ovladač "(TID: 0xee3001f8, sys_thread_t: 0xef5b0de0) prio = 11" hlavní "(TID: 0xee3000a0, sys_thread_t: 0x835) .lang.Throwable.printStackTrace (Throwable.java) java.lang.ThreadGroup.uncaughtException (ThreadGroup.java) java.lang.ThreadGroup.uncaughtException (ThreadGroup.java) Monitor Cache Dump: Registered Monitor Dump: Finalize me queue lock: unowned Thread zámek fronty: neznámý zámek třídy: neznámý zámek zásobníku Java: neznámý zámek přepsání kódu: neznámý zámek haldy: neznámý H jako zámek fronty finalizace: neznámý Zámek IO monitoru: neznámý Monitor smrti dítěte: neznámý Monitor událostí: neznámý I / O monitor: neznámý Monitor alarmu: neznámý Čekání na upozornění: „obsluha hodin“ Zámek Sbrk: neznámý zámek mezipaměti monitoru: neznámý registr monitoru : monitor vlastník: "hlavní" Thread Alarm Q: Přerušení (jádro vyhozeno) 

Jak vidíte v kódu výše, první věc, na kterou si Mocha stěžuje, je NullPointerException protože to bylo o symbolických informacích zmatené. Proto je dosaženo našeho cíle, kterým je ztížení dekompilace našeho kódu.

Je třeba poznamenat, že autor knihy Mocha, Hanpeter van Vliet, je také autorem knihy Crema! Mocha je distribuována bez poplatků. Zkušební kopie aplikace Crema je k dispozici zdarma, ale plná verze je komerčním produktem.

Při distribuci tříd Java přes internet můžete svůj bajtkód Java chránit před rizikem zpětného inženýrství. Výše uvedené příklady kódu ukazují, jak se Mocha používá k provedení dekompilace a jak může Crema zabránit záchraně takovou aktivitou.

Qusay H. Mahmoud je postgraduální student výpočetní techniky na University of New Brunswick, kampus Saint John, Kanada.

Další informace o tomto tématu

  • Poznámka redakce Od smrti pana van Vlieta (na rakovinu) zanikly stránky, které vytvořil pro distribuci Mocha a Crema.
  • Eric Smith's Mocha distribution site //www.brouhaha.com/~eric/computers/mocha.html
  • Crema na webu CERN //java.cern.ch:80/CremaE1/DOC/quickstart.html

Tento příběh „Tip Java 22: Chraňte své bytové kódy před reverzním inženýrstvím / dekompilací“ původně publikoval JavaWorld.