Zaciemnianie i dekompilacja programów C#
Zaciemnianie kodu to metody odpowiedzialne za przekształcanie programów komputerowych w taki sposób, aby utrudnić zrozumienie zasad ich działania. Program po zaciemnieniu musi mieć taką samą funkcjonalność.
Dekompilacja to proces przekształcania kodu maszynowego/bajtowego do języka wyższego poziomu.
Aplikacja napisana w języku C# podczas procesu kompilacji jest kompilowana do kodu pośredniego – języka CLI. Common Intermediate Language jest językiem najniższego poziomu dla platformy Microsoft .NET, jest on w pełni zrozumiały dla człowieka. Podczas uruchomienia programu kod CLI jest kompilowany przez maszynę wirtualną bezpośrednio do kodu bajtowego.
Dzięki temu w stosunkowo łatwy sposób można podejrzeć kod źródłowy napisanej aplikacji.
Wymagania
Do zaciemniania i dekompilacji kodu potrzebujemy następujących programów:
- Visual Studio 2017 Community (pobierz program)
- Dotfuscator Community Edition – darmowe narzędzie do zaciemniania kodu .NET zintegrowane z Visual Studio.
- Telerik JustDecompile – darmowe narzędzie do dekompilacji aplikacji pisanych w frameworku .NET (pobierz program)
Dekompilacja kodu
Aby dokonać procesu dekompilacji, należy uruchomić Telerik JustDecompile.
Następnie klikamy na Open -> File(s) i wybieramy plik wykonawczy (rozszerzenie exe) programu napisanego w C# i klikamy Otwórz.
Otrzymujemy podgląd kodu CLI:
Jak widać, kod CLI jest bardzo podobny do kodu C#. Bez trudu możemy podejrzeć jak działa program i zrozumieć logikę biznesową i sposób działania.
Eksport kodu CLI do C#
Jeżeli klikniemy prawym klawiszem myszki na nasz program, możemy stworzyć projekt Visual Studio. Telerik JustDecompile wyeksportuje nasz program i stworzy kod C# na podstawie kodu CLI. Jest to proces odwrotny do kompilacji, czyli dekompilacja.
Po wyeksportowaniu możemy otworzyć projekt przy pomocy Visual Studio. Przekonwertowany kod będzie się trochę różnił od oryginalnego kodu C#, ale cała semantyka zostanie zachowana.
Otworzony projekt można skompilować ponownie, otrzymując plik wykonawczy exe. Oczywiście można edytować kod C# przed kompilacją i wprowadzać zmiany w działaniu programu.
Zaciemnianie kodu
Do zaciemniania kodu będziemy używać Dotfuscator, który jest dostępny dla programistów korzystających z Visual Studio. Aby go uruchomić, należy wpisać w polu Quick Launch w Visual Studio dotfuscator
Po uruchomieniu musimy ustawić w zakładce Properties gdzie ma zapisać się plik po zaciemnieniu. Następnie, w zakładce Inputs dodajemy pliki exe, które chcemy zaciemnić. W dalszej kolejności klikamy Build -> Build Project
Po zaciemnieniu kodu dostajemy prosty raport z zaciemniania naszej aplikacji. Przykładowy raport wygląda następująco:
Build Finished. | |||
Build Statistics | Total | Renamed | Percent Renamed |
Types | 6 | 6 | 100% |
Methods | 14 | 3 | 21,43% |
Fields | 6 | 6 | 100% |
Jak widać, wszystkie nazwy metod, klas i zmiennych zostały zmienione na litery np. a, b, c. Przy dużych projektach w znaczący sposób utrudnia to zrozumienie, co w programie dzieje się „pod spodem”. Kod CLI stał się zupełnie nieczytelny i nie da się w łatwy i przystępny sposób przywrócić niezaciemnionego kodu.
Podsumowanie
W artykule opisane zostały podstawy korzystania z Dotfuscator’a i JustDecompile. Nauczyliśmy się:
- Trochę o kompilacji programów C#
- Jak dekompilować program napisany w frameworku .Net i wyeksportować projekt Visual Studio
- Podstaw zaciemniania kodu .Net