Analiza aplikacji .NET
Zestaw narzędzi do analizy .NET-owych aplikacji znacznie różni się od klasycznych narzędzi dla zwykłych aplikacji x86 / x64, odmienna architektura kodu wymusiła utworzenie całej gamy dedykowanych narzędzi dla plików wykonywalnych .NET, spróbuję przedstawić kilka z nich, które mogą się przydać w reversingu.
Dekompilacja kodu
Pierwszym i podstawowym narzędziem, które chyba zna większość osób zajmujących się analizą oprogramowania i nie tylko jest dekompilator .NET Reflector.
.NET Reflector
Pozwala on na dekompilację plików wykonywalnych z formatu kodu przejściowego CIL (Common Intermediate Language) do kodu wysokiego poziomu w wybranym lub ulubionym przez nas języku np. C#, VB# etc.
Jest to najbardziej znany dekompilator i nie tylko, gdyż dzięki całej masie wtyczek umożliwia np. modyfikację plików binarnych (wtyczka Reflexil), debugowanie aplikacji (wtyczka Deblector) i wiele innych czynności związanych z analizą kodu.
Ostatnio .NET Reflector stracił na popularności, gdyż projekt od początku istnienia był darmowy, jednak po przejęciu go przez firmę Red Gate Software (notabene twórców obfuscatora SmartAssembly, z czego można wysnuć teorię spiskową, że chcieli ograniczyć dostęp do jednego z najpopularniejszych narzędzi do analizy aplikacji) i początkowych zapewnień o utrzymaniu jego darmowego statusu, po jakimś czasie został przekształcony w komercyjną wersję, z najtańszą licencją za 35 USD. W Internecie można jednak znaleźć złamane kopie jak również całkowicie zrekompilowane (wraz ze źródłami), bardziej odporne na narzędzia zabezpieczające.
Strona domowa — www.reflector.net
Lista wtyczek — http://reflectoraddins.codeplex.com/
Telerik JustDecompile
Darmowy dekompilator firmy Telerik, raczej dla niewymagających użytkowników, ponieważ liczba dostępnych opcji (lub ich brak) nie powala na kolana, nie można nawet przejrzeć kodu w postaci IL, nie mówiąć o innych rzeczach, jest tu tylko dekompilator i wyszukiwarka referencji.
Strona domowa — www.telerik.com/products/decompiler.aspx
IL DASM
Warto wspomnieć również o tym narzędziu, chociaż z mojego doświadczenia wynika, że jest ono raczej mało używane, to deasembler dla .NET-owych binariów firmy Microsoft dołączany do SDK .NET-a oraz dostarczany wraz z Visual Studio.
Pozwala on na przeglądanie struktury pliku oraz deasembling do kodu przejściowego w związku z czym nie jest tak poręczny w analizie jak .NET Reflector.
Simple Assembly Explorer
Jest to kolejny deasembler i edytor jednak już bardziej zaawansowany od IL DASM-a, posiadający masę opcji, pozwalających na łatwą modyfikację kodu IL, kopiowanie instrukcji, wycinanie, wszystko bardzo poręcznie skonstruowane, od jakiegoś czasu jest to mój faworyt jeśli chodzi o modyfikację .NET-owych plików binarnych.
SAE posiada system wtyczek oraz wbudowany deobfuscator, który może przydać się w analizie zabezpieczonych aplikacji.
Jeśli chcesz nauczyć się podstaw programowania w IL, zmodyfikować szybko i sprawnie binaria to jest to idealne narzędzie.
Strona domowa — http://code.google.com/p/simple-assembly-explorer/
Dis#
Dis# to stosunkowo mało znany dekompilator, być może ze względu na to, że to komercyjne narzędzie, projekt dawno nie był aktualizowany, ale może być traktowany jako ciekawostka, gdyż posiada kilka interesujących cech jak wbudowany deobfuscator, edytor kodu pozwalający w prosty sposób zamieniać nazwy funkcji, zmiennych etc.
Strona domowa — http://netdecompiler.com
Debuggery
Z moich obserwacji i doświadczeń wynika, że większość analiz związanych z .NET da się rozwiązać statycznie (w przeciwieństwie do natywnych aplikacji), jednak i tutaj może przydać się prześledzenie wykonywanego kodu.
Dotnet IL Editor (DILE)
Dile to prosty w obsłudze debugger dla .NET-owych aplikacji, troszkę przypomina debugger z Visual Studio.
Strona domowa http://sourceforge.net/projects/dile/
Identyfikatory
Dla aplikacji natywnych podstawowym identyfikatorem jest PEiD oraz częściej uaktualniany Protection ID (oraz kilka innych), dla .NET powstał odpowiednik PEiD o nazwie DNiD.
Wykrywa on obecnie większość stosowanych zabezpieczeń stosowanych dla aplikacji .NET-owych. Do ściągnięcia lokalna kopia — DNiD.v0.11-Rue.rar (384 kB)
Dumpery
Aplikacje .NET-owe obecnie rzadko rozprowadzane są w czystej formie po kompilacji, gdyż dzięki narzędziom takim jak .NET Reflector jest to praktyczne równoznaczne z rozprowadzaniem open source i większości wypadków do zabezpieczania używane są obfuscatory.
Część obfuscatorów oprócz modyfikacji kodu IL, całość aplikacji „opakowuje” w kod ładujący (z ang. loader) w formacie natywnym (x86), który zwykle deszyfruje całe .NET-owe assembly i dopiero w odszyfrowanej formie ładuje je do pamięci.
Taka forma zabezpieczenia nie pozwala na używanie narzędzi .NET-owych i wymagane jest najpierw zrzucenie z pamięci załadowanych assembly .NET-owych w celu dalszej analizy.
.NET Generic Unpacker
Projekt autorstwa Daniela Pistelli (obecnie pracujący nad IDA w HexRays), generyczny jak nazwa wskazuje dumper, który potrafi wykryć w pamięci obraz pliku wykonywalnego .NET mimo zewnętrznego natywnego loadera.
Strona domowa — http://www.ntcore.com/netunpack.php
DotNetDumper
Prosty w użyciu dumper, który również posiada obsługę zrzucania z pamięci plików kilku rodzajów zabezpieczeń, generalnie z tymi dwoma dumperami można sobie poradzić z większością zabezpieczeń natywnych.
Do ściągnięcia lokalna kopia — DotnetDumper.zip (66 kB)
Oprócz dedykowanych dumperów, równie dobrze działają klasyczne metody przeszukiwania pamięci np. w OllyDbg w poszukiwaniu sygnatur .NET-owych aplikacji (np. stringów „_CorExeMain”).
Fixery
Po zrzuceniu z pamięci obrazu pliku .NET jest on często niezdatny do analizy w narzędziach takich jak .NET Reflector, wynika to ze zmian jakie wprowadzają najczęściej obfuscatory, aby dodatkowo utrudnić analizę. Tak zrzucone obrazy plików należy naprawić.
Universal Fixer
Do ściągnięcia lokalna kopia — Universal_Fixer.zip (31 kB)
Zawsze aktualna kopia — http://forum.tuts4you.com/topic/25376-universal-fixer/
Deobfuscatory
Liczba obfuscatorów dostępnych na rynku jest ogromna, mogę śmiało powiedzieć, że przebija ilość dostępnych narzędzi zabezpieczających dla natywnych aplikacji. W związku z tak zmasowanym atakiem, powstały deobfuscatory dla wielu narzędzi, często zintegrowane i obsługujące wiele rodzajów zabezpieczeń.
de4dot
de4dot to aktywnie rozwijany deobfuscator obsługujący sporą listę zabezpieczeń, podstawa jeśli ktoś myśli poważnie o analizie oprogramowania .NET
Do ściągnięcia ze strony — https://github.com/0xd4d/de4dot/downloads
Podsumowanie
Obecny stan zabezpieczeń .NET-owych może z początku przerazić i zniechęcić do dalszej analizy, ale jak widać istnieje wiele narzędzi, które potrafią ułatwić nam życie.
Celowo nie opisywałem tutaj gotowych unpakerów, które można z łatwością znaleźć samemu, gdyż nie zawsze sprawdzają się w działaniu i warto wtedy wiedzieć jak sobie poradzić bez ich pomocy.
Jeśli natknę się na jakieś ciekawe narzędzie to dopiszę je do artykułu, a jeśli wy znacie coś interesującego do analizy aplikacji .NET — opiszcie w komentarzach, a ja to przejrzę i z chęcią dodam opis do artykułu.
Na koniec jeszcze kilka linków, gdzie można znaleźć narzędzia do analizy .NET-owych aplikacji:
BlackStorm — http://portal.b-at-s.net/download.php?list.9
RCE Tool Library — http://www.woodmann.com/collaborative/tools/index.php/Category:.NET_Tools
Szkoda że tak rzadko piszesz…
Dobry wpis, kilku narzędzi nie znałem. Trzeba się będzie z nimi zaznajomić 🙂
Na fali krytyki decyzji RedGate’a powstało jeszcze kilka narzędzi do podglądu kodu aplikacji w .NET. Całkiem dobry jest IlSpy (open source). Są jeszcze dotPeek (jetBrains) oraz JustDecompile (Telerik). Trochę więcej o nich pisałem jakiś czas temu [autopromocja] http://pawlos.blogspot.com/2011/10/show-me-your-codeprzeglad-narzedzi-do.html [/autopromocja]
Pozdrawiam,
Paweł
@anonim: rzadko piszę, bo leniwy jestem hehe, a tak na poważnie to napisałem, bo akurat robiłem analizę oprogramowania dla pewnej firmy i mieli tam użytego .NET Reactor-a nowego + dongle (z artykułu wynika jakiego) i przy okazji na świeżo napisałem to z czego korzystałem
@pawlos: dobry artek, nie znałem tych innych dekompilatorów, trzeba będzie tego ILSpy’a zobaczyć :), tych narzędzi do .NET jest cała masa, deobfuscatory to chyba teraz gorący temat, jak mi się bedzie chciało to dodam jeszcze kilka do listy
Nasuwa się tak to pytanie co użyć do pełnego zabezpieczenia swojej aplikacji w .Net przed jej defuskifikacją? Czy to pełne zabezpieczenie jest w ogóle możliwe?
@Igor: ciężko stwierdzić, bo jak widać zarządzalny kod IL nawet po obfuscatorach nie jest jakimś problemem do ogarnięcia, zalecałym stosowanie najnowszych wersji obfuscatorów, najlepiej żeby posiadały swoją VM-kę do zabezpieczania (tak jak to ma miejsce w przypadku wirtualizerów x86/x64), razem z bindowaniem pozostałych assemblies do 1 pliku (łączenie wielu DLL-ek) wraz ze stosowaniem natywnych loaderów no i klasyczne metody, bez umieszczania kodu licencyjnego w 1 procedurze, opóźnienia czasowe w sprawdzaniu licencji etc.
@Igor – `Nasuwa się tak to pytanie co użyć do pełnego zabezpieczenia swojej aplikacji w .Net przed jej defuskifikacją? Czy to pełne zabezpieczenie jest w ogóle możliwe?` – Całkowite zabezpieczenie przed analizą jest niemożliwe – nie przejmowałbym się tym zbytnio, bo podobnie niemożliwe jest zabezpieczenie przed analizą aplikacji natywnych (tzn. napisanych np. w C++) – tylko jest to o rząd trudniejsze.
Możesz najwyżej tak zabezpieczyć swoją aplikację żeby analizowanie jej było nieopłacalne – i do tego właśnie służą przeróżne obfuscatory i protectory.
@Bartek – również używam IlSpy i polecam to narzędzie – dobrze, szybko a przede wszystkim darmowo.
Brakuje narzędzi do analizy struktury pamięci i usuwania pseudowycieków. Ja osobiście polecam .Net Memory profiler. Istnieje też narzędzie od RedGate ale jego interfejs mniej mi przypadł do gustu (jest zbyt przepełniony wodotryskami), ale za to pokazuje udział pamięci niezarządzanej w procesie. Są też inne narzędzia ale nie miałem okazji ich używać.
@wojtek: z punktu widzenia reverse engineeringu struktura pamięci i leaki raczej nikogo nie interesują, jednak może się to przydać jeśli mówimy o analizie własnego oprogramowania