niedziela, październik 02, 2011

Show me your code–przegląd narzędzi do podglądania

Update - 17.11.2011: Dodano powiązane posty z innych blogów.

Dawno dawno temu było…Reflector i długo długo nic (de facto na początku był jest ildasm ale nie o nim dziś).

Na szczęście pewnego lutowego dnia pojawiła się informacja, że już niedługo nie będzie on dostępny za darmo i się zaczęło. Flame’y, groźby i krzyki :). Stało się też sporo dobrego bo o to na rynku pojawiły się alternatywy. Ilspy, dotPeek oraz JustDecompile. Przyjrzyjmy się im z bliska i zobaczmy co mają do zaoferowania.


Reflector - umarł król...

Reflector to zdecydowanie najlepszy, z racji swojej "dorosłości" decompiler na rynku. Rozwijany na początku przez Lutz'a Roeder'a a następnie przejęty przez firmę Red-Gate. Posiadacze darmowej wersji muszą się zadowolić wydaniem 6.0 bez widoków na aktualizacje, co sprawi, że, w przypadku rozwoju .NET, Reflector straci na używalności a zastąpią go alternatywy. Płatna wersja narzędzia jest i (miejmy nadzieję) będzie rozwijana dalej.


Siła Reflector'a nie tkwi (narzędzie jest super to fakt) w nim samym, ale w ogromie dodatków, które powstały przez cały ten czas kiedy miał monopol wśród tego typu narzędzi. Jakiekolwiek czynności, które chcielibyśmy zrobić na podglądanym kodzie można szybko wykonać bo na na 99% istnieje dodatek który nam w tym pomoże. Np. modyfikacja kodu? Jest Reflexil.
Reflector podczas pracy
Obsługuje możliwość wyświetlania kodu zarówno w C#, VB.NET oraz F# (w zasadzie pokazuje jeszcze Delphi, MC++ oraz Oxygene, ale nie wiem czy ktoś z tego w ogóle korzysta?). Można także pokazać ILa jeśli ktoś ma taką potrzebę.

ILSpy - dobra alternatywa...


ilSpy
- Pełni OpenSource'owe narzędzie oparte na bibliotece Mono.Cecil. Dzięki dostępności kodu możemy je sobie rozwijać według potrzeb. Startuje długo jakby był napisany w Java (joke :]), ale potem oferuje pełnię swoich możliwości. Umożliwia wyświetlenie kodu w C# jak też IL (maniacy jak ja, którzy czytają gołego ILa to docenią).
ILSpy
Do plusów można zaliczyć przejście do dokumentacji MSDN po kliknięciu w daną instrukcję ILa, jak również przeskakiwanie pomiędzy etykietami w tymże widoku. Zdecydowanie ułatwia nawigację w kodzie i pozwala łatwiej śledzić flow programu.

dotPeek



dotPeek
- Narzędzie ze stajni panów z JetBrains. Wspiera jedynie C#. Jako duży plus należy zaliczyć tu możliwość otwierania podglądu jako zakładki. Bardzo ułatwia to nawigowanie się podczas przeglądania kodu. Posiada multum (jak na tego typu narzędzia) opcji i konfiguracji, co na początku utrudnia rozeznanie się w nim.


dotPeek
Umożliwia drukowanie wygenerowanego kodu, co choć na pierwszy rzut oka może wydawać się niepotrzebną opcją, czasem się przydaje. Umożliwia dość rozbudowaną nawigację po kodzie znaną z innego narzędzia JetBrains'a - R#. Możemy zatem przejść do konkretnego typu czy pliku, przenawigować się po właściwościach czy metodach danej klasy za pomocą ALT+strzałka w dół, a nawet zobaczyć hierarchię typów jeśli zajdzie taka potrzeba.
Hierarchia typów w dotPeeku
Jako jedyne narzędzie, nie jest oparte na bibliotece Mono.Cecil (czy to plus czy minus).

JustDecompile



JustDecompile
- Tutaj Telerik zwietrzył okazję i wypuścił swoje narzędzie do podglądu. Jako jedyny posiada instalator - co trochę denerwuje. Zwykle przy tego typu narzędziach chcemy je ściągnąć i zacząć używać bez konieczności instalacji. Na szczęście da się go wrzucić na usb'a i uruchamiać z niego. Inaczej potrzeba instalacji wykluczałaby to narzędzie praktycznie. na pierwszy rzut oka narzędzie to wyróżnia się całkiem przyjemnym UI ewidentnie napisanym w WPFie.

JustDecompile
Z dostępnych języków docelowych mamy: IL, C# oraz VB. Edytor podobnie jak IlSpy umożliwia, po kliknięciu w daną instrukcję, przekierowanie na strony MSDN do dokumentacji danego OpCode'u. Dodatkowo każdy typ jest "klikalny" i możemy nawigować po kodzie klikając na odpowiednie typy parametrów czy też zawracanych wartości. Narzędzie to jako jedyne (albo u innych tego nie znalazłem) umożliwia konfigurację kolorów, tak więc możemy sobie wynikowy kod dostosować do naszych ulubionych kolorów.

CodeReflect


CodeReflect - mało znane (chyba) narzędzie od firmy DevExtras. Wyglądem dość znacznie przypomina .NET Reflector'a, co można uznać za plus jeśli ktoś był przyzwyczajony do tego układu i działania.
CodeReflect
Podobnie jak powyżej umożliwia przechodzenie po dll'kach dzięki kliknięciom w odpowiednią nazwę typu. Dzięki temu możemy w dość prosty sposób nawigować po kodzie i przechodzić od jednej metody do drugiej za pomocą myszki. W IL'u brakuje jednak możliwości przejścia do dokumentacji w MSDN aby dowiedzieć się czegoś więcej o konkretnej instrukcji. Brakuje podstawowych opcji konfiguracji, ale gdyby nie było pod ręką nic innego to oczywiście narzędzie zda egzamin i pokaże nam co siedzi pod spodem naszego kodu...

... niech żyje król?


Czy jest jednogłośny zwycięzca tegoż rankingu? Nie wiem - ja nadal mam zainstalowanego Reflectora ale coraz częściej sięgam po ilSpy'a (tak w ogóle to mam wszystkie zainstalowane :]). Każdy chyba powinien sam wybrać, ale warto wiedzieć o ich mocnych i słabych stronach aby wybór był świadomy i celowy. Pomijając Reflector'a, pozostałe narzędzia są w fazie Beta lub Pre-Release więc jeszcze sporo może się w nich zmienić. Oby na lepsze...

Powiązane wpisy

Narzędzia do analizy aplikacji .NET - Security News
Darmowe dekompilatory .NET - Grzegorz Trybulski

4 komentarze:

Jakub Gutkowski pisze...

Spoko lista, trzeba jeszcze dodac ze i Reflector ma pomoc do IL - wystarczy najechac na komende IL i tooltip powie co ona robi, bardzo przydatne to bylo kiedy sie uczylo czytac IL :)

mgrzeg pisze...

Paweł, fajne zestawienie. Odnośnie wersji Reflectora, to ostatnia frikowa to 6.8.2.5 :)

m.g.

Maciek pisze...

Paweł, ja też mam je wszsytkie zainstalowane (razem z reflectorem, rzecz jasna) i jak na razie niespecjalnie potrafię wybrać. Mam wrażenie, że część narzędzi jest nieco "szybsza" niż pozostałe, ale to też może być kwestia ich małej dojrzałości - kto przewidywał rok temu, że będzie potrzebna darmowa alternatywa dla Reflectora?

I takie pytanie: spotkałeś się z sytuacją, gdy jakieś narzędzie sobie ewidentnie nie radziło (choć skoro większość używa tej samej biblioteki do dekompilacji... :)
Wiesz może jak te narzędzia radzą sobie z kodem zaciemnionym przez (darmowe chociażby) obfuscatory?
Mnie osobiście nieco rozczarowuje powolność narzędzi Telerika i Jetbrains - ILSpy i Reflector wydają się szybsze.

Fajne zestawienie! :)

Paweł Łukasik pisze...

@Maciek: też mam takie wrażenie, że niektóre radzą sobie szybciej od innych - szczególnie dotPeek startuje jakoś wolno. Na początku przeszkadzało mi, że ilSpy sie trochę pomału rozkręca, ale jakoś już się przyzwyczaiłem.

Co do radzenia sobie z zaciemnionym kodem to może jest to dobry materiał na osobny wpis? Zobaczymy jak czas pozwoli to coś skrobnę...

Paweł