Dekompilace v Javě a co proti ní

28. listopadu 2002

Java je na platformě nezávislý jazyk, a proto se programy v ní napsané překládají do meziproduktu zvaného bajtkód, který zkompiluje až javový virtuální stroj (JVM) v rámci běhu aplikace. Tento bajtkód ovšem není problém převést opět do zdrojového kódu. Jednou z technik, jak případnou dekompilaci a následnou úpravu programů alespoň zkomplikovat, je obfuskování.

Dekompilace

Snadná dekompilace, neboli získání zdrojového kódu k přeloženým Javovým třídám, může být postrachem výrobců aplikací psaných v Javě. Nestačí, že k programu nedají zdrojový kód, musí ještě navíc vymýšlet komplikované způsoby ochrany aplikace, aby nebylo příliš jednoduché ji „kreknout“.

Existují ovšem i celkem legální důvody, proč dekompilátor použít. Například máte-li aplikaci bez zdrojového kódu, jejíž výrobce se od ní již dávno distancoval, nebo ukradne-li vám někdo počítač se zdrojovými kódy (eventuelně naštvaná přítelkyně zformátuje disk) a zároveň máte to štěstí, že aplikace už běží i někde jinde.

Dekompilátorů se dá najít na internetu bezpočet, jako ukázku jsem vybrala uživatelsky velmi kamarádský DJ Java Decompiler. Stačí myší přetáhnout .class soubor do jeho okna a chvíli počkat, než aplikace bajtkód zpracuje. Sice je jen pro Windows, ale linuxoví uživatelé si hravě poradí s dekompilátorem Jad, který se ovládá z příkazové řádky.

Obfuskování neboli matení kódu

Obfuskátor se pro změnu snadné dekompilaci snaží zabránit. Obvykle pracuje s bajtkódem a může provádět více dílčích činností:

  • přejmenování tříd, jejich proměnných a metod – nejčastěji jsou nová jména jednopísmenná, což znatelně zmenší velikost kódu a znesnadní jeho čitelnost po dekompilaci; pomocí parametrů lze nastavit, co se přejmenovat nemá (například hlavní třída, kterou se aplikace spouští).
  • detekce a odstranění nepoužitých metod, proměnných, tříd – dá se použít pouze u cílové aplikace nikoli u knihovny.
  • přeskupení příkazů bajtkódu – cílem je, aby bajtkód nešel dekompilovat do rozumně strukturovaného zdrojového kódu.

Obfuskování kódu se provádí ze dvou základních důvodů, jednak kvůli zmenšení velikosti aplikace, jednak pro znepříjemnění dekompilace a následné úpravy kódu. Pokud je aplikaci potřeba stáhnout po síti, je velikost aplikace velmi důležitá. Typickým příkladem by mohly být třídy potřebné pro aplet. A pro aplikaci na mobilní telefon je její velikost otázkou života a smrti. Přece jen 32 KB je dost drastické omezení a obfuskátor může velikost snížit až o 30 %.

Různé obfuskátory jsou samozřejmě různě kvalitní, zadarmo nebo za peníze, lepšího výsledku může být dosaženo kombinací více obfuskátorů. Celkem dobré výsledky, co se týká velikosti, má v kategorii obfuskátorů zadarmo program ProGuard.

Ukázka

Originální zdrojový kód:

image = Image.createImage(getWidth(), getHeight());
buffer = image.getGraphics();
buffer.setColor(0,0,0);
buffer.fillRect(0,0,getWidth(), getHeight());
buffer.setColor(255,255,255);
cmdExit = new Command(„Konec“, Command.EXIT, 2);
addCommand(cmdExit);
cmdThrow = new Command(„Hazej“, Command.SCREEN, 1);
addCommand(cmdThrow);
setCommandListener(this);

Týž kus kódu poté, co byl přeložen, obfuskován s použitím programu RetroGuard a dekompilován DJ Java dekompilátorem:

d = Image.createImage(getWidth(), getHeight());
g = d.getGraphics();
g.setColor(0, 0, 0);
g.fillRect(0, 0, getWidth(), getHeight());
g.setColor(255, 255, 255);
a = new Command(„Konec“, 7, 2);
addCommand(a);
b = new Command(„Hazej“, 1, 1);
addCommand(b);
setCommandListener(this);

Samozřejmě komentáře z původního zdrojového kódu tento proces také nepřežijí, protože se do bajtkódu nedávají.

Odkazy

Dekompilátory:

  • DJ Java Decompiler – dekompilátor s grafickým uživatelským rozhraním, pouze pro Windows
  • Jad – tento dekompilátor je jádrem DJ Java dekompilátoru, sice pracuje pouze na příkazové řádce, zato je pro více operačních systémů

Obfuskátory (všechny jsou napsány v Javě):

Štítky: Články

Mohlo by vás také zajímat

Nejnovější

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *