Dekompilátory pro .NET a obrana proti nim

Jak z Dll nebo Exe získat zdrojový kód v C#? Snadno – stačí Anakrino a pár kliknutí myší.
Kdopak se to dívá?

Když se Java dočkala většího rozšíření, brzy se objevila spousta dekompilátorů (k nejznámějším patří například Mocha), které dokázaly převést javový bytecode zpátky do zdrojového textu. Bylo jen otázkou času, kdy se podobná věc přihodí i .netu.

První krok, který se zřejmě nabízí, je disassembler ILDASM dodávaný s .NET SDK. Ten ukáže názvy metod, třídy, jmenné prostory, zdrojový kód samotný ale u release buildů neukazuje. Dá se s ním však docela dobře poznat, jak je aplikace strukturovaná, a více méně lze odhadnout základy algoritmu. Není to ovšem nic pro normálního uživatele.

O něco příjemnější práce je s aplikací Reflector for .NET Lutze Roedera, pořád ale jde o hlavně o prohlížeč tříd a disassembler, nikoli o dekompilátor hodný toho jména.

I na ty ale přišla řada. První a patrně nejznámější z nich je Anakrino. Když se mi poprvé dostal do ruky, docela mi zatrnulo. To jsou opravdu všechny mé zdrojové kódy přístupné? Opravdu to tak vypadá – zkuste si zkompilovat program a na výsledné EXE nebo DLL se podívejte Anakrinem. Můžete (podobně jako v Reflectoru) listovat třídami a dívat se na proměnné. Navíc je tu ale možnost převést vnitřek metod do zdrojového textu – volitelně v c# nebo MC+ (managed c++). Zdrojové kódy programu jako na dlani!

Na druhý pohled to ale není tak hrozné. Anakrino sice ukazuje zdrojáky, ty jsou ale do určité míry poškozené. Především ukazuje jen zdrojový kód jedné metody (takže není možné snadno vzít kompletní zdrojové kódy, provést v nich úpravu a znovu je zkompilovat). Názvy proměnných si Anakrino vymýšlí (typicky local1, local2 atd). Samozřejmě že ve zdrojáku nejsou žádné komentáře. Pokud kompilátor provedl různé optimalizace, k původnímu tvaru se už také nedostanete (například konstanty jsou často umístěny přímo v textu – namísto odkazu na konstantu v dané třídě). Některé metody se Anakrinu dekompilovat nepodařilo – často se vyskytly problémy s aplikacemi, které byly napsány v managed c++ místo v c# nebo vs.net.

Anakrino není jediné – další dekompilátory se začaly objevovat jako houby po dešti. Kouzelné je, že velkou část z nich najdete na webu firem prodávajících různé ochranné programy, které mají proti těmto dekompilátorům váš kód bránit. Je to podobné jako stará (a jistě nepravdivá) pomluva o tom, že viry píší antivirové firmy. Z dalších dekompilátorů stojí za zmínku I+ Decompiler od I+ Software nebo Salamander od RemoteSoftu (ten poskytuje dokonce online verzi, takže můžete vesele dekompilovat bez toho, že byste měli na svém stroji .NET runtime).

Principy obrany

První a nejúčinnější obranou je zamezení fyzického přístupu ke kódu. Vytvářejte své programy jako webové aplikace, pokud je to jen trochu možné. Pořádně zabezpečte server před průnikem a downloadem .dll souborů. Dbejte o pravidelné záplatování bezpečnostních děr. Pokud nemůžete použít webovou aplikaci, ale můžete napsat program jako aplikaci client server, přeneste maximální množství "masa" do vrstvy business logiky a do databázové vrstvy, kterou umístíte na server, jenž pořádně zabezpečíte. Přistupujte k nim například přes web services – pokud se někdo dostane k prezentační vrstvě, nemusí to tolik bolet a nemůže páchat nepřístojnosti na vašich datech.

Pokud vaše aplikace pro běh ve webovém prohlížeči není vhodná – a podobných scénářů je pořád celá řada – vyzkoušejte některý z programů, které sníží užitečnost dekompilovaného kódu. Takové programy existují a obvykle se označují slovem obfuscator (volně lze přeložit jako "zmatkovač"). Pro svou činnost používají různé strategie – například přejmenovávání názvů metod a členských proměnných na nic neříkající názvy obsahující často netisknutelné znaky (takže vám pak dekompilátor místo volání metody LoadSecureData ukáže dfsfASDFcvxdv). Jiné se pokoušejí dekompilátory zmást tím, že využívají konstrukce možné v IL ale neplatné v c# – například v IL je možné mít dvě proměnné se stejným jménem a různým typem (XX jako integer a současně XX jako string), v c# to možné není.

Docela zajímavé obfuscátory vyrábí WiseOwlSoftware (Demeanor for .NET), Remote Soft (Salamander .NET obfuscator) nebo Lesser Software (LSW DotNet-IL-Obfuscator). Obfuscatory jsou věc nákladná a nikdy neochrání kód na 100 % – pokud někomu stojí za to si váš kód odkrokovat v debuggeru, dovnitř se stejně dostane. Mohou ale účinně fungovat proti různým začátečníkům a "takyhackerům", kteří jen tupě zkouší nástroje, jež našli na některém "c00l zecurity sajtu".

Důsledky a shrnutí

Existence dekompilátorů nijak zvlášť nezasahuje vývojáře webových aplikací, protože k jejich kódu se normální uživatel nedostane. Dekompilátory jsou ale velkou hrozbou pro vývojáře klasických GUI aplikací – jistě by se vám příliš nelíbilo, kdybyste naprogramovali nějaký balíkový software a vaše konkurence by po zakoupení jediné krabice měla přístup k vašim kompletním zdrojovým kódům. Totéž platí pro výrobce komponent (i pro webové aplikace). Většina licenčních ujednání sice reverse engeneering zakazuje, ale zkuste si honit nějakého čínského programátora...

Je zřejmé, že odhodlanému útočníkovi se SoftICE nebo podobným debuggerem neodolá ani většina aplikací napsaných v céčku, vše je ale otázka poměřování nákladů a přínosů. Obávám se, že dokud nebude k dispozici nějaký opravdu solidní obfuscator pro IL, příliš mnoho komerčních balíkových aplikací pro desktop neuvidíme.

A ještě jedna zajímavost na závěr. Podle vyjádření Erica Gunnersona, člena vývojového týmu C# , uvažoval Microsoft o vypuštění vlastního obfuscatoru. Z těchto plánů ale prozatím sešlo.

A co vy? Je váš kód v bezpečí?

Diskuze (14) Další článek: Hewlett-Packard získal podporu pro návrh převzetí Compaqu

Témata článku: , , , , , , , , , , , , , ,