Co to jest Obfuskacja?
On 25 października, 2021 by adminCo to jest Obfuskacja kodu?
Obfuskacja kodu to proces modyfikowania pliku wykonywalnego w taki sposób, aby nie był on już użyteczny dla hakera, ale pozostał w pełni funkcjonalny. Podczas gdy proces ten może modyfikować rzeczywiste instrukcje metod lub metadane, nie zmienia on danych wyjściowych programu. Aby było jasne, z wystarczającą ilością czasu i wysiłku, prawie każdy kod może zostać poddany inżynierii wstecznej. Jednakże, na niektórych platformach, takich jak Java, Android, iOS czy .NET (np. Xamarin, C#, VB.NET, F#), darmowe dekompilatory mogą z łatwością odtworzyć kod źródłowy z pliku wykonywalnego lub biblioteki w praktycznie krótkim czasie i bez wysiłku. Zautomatyzowana obfuskacja kodu sprawia, że inżynieria wsteczna programu jest trudna i ekonomicznie niewykonalna.
Dlaczego warto używać Obfuskatora Kodu?
Uczyniwszy aplikację znacznie trudniejszą do odtworzenia, możesz zabezpieczyć się przed kradzieżą tajemnicy handlowej (własności intelektualnej), nieautoryzowanym dostępem, obejściem licencji lub innych kontroli oraz odkryciem luk w zabezpieczeniach.
Jak działa obfuskacja?
Obfuskacja kodu składa się z wielu różnych technik, które mogą się wzajemnie uzupełniać, tworząc warstwową obronę. Jest ona najbardziej skuteczna w przypadku języków, które tworzą jakąś formę instrukcji pośredniego poziomu, takich jak Java lub języki .NET, takie jak C#, VB.NET, Managed C++, F#, itp. Niektóre typowe przykłady technik obfuskacji i bezpieczeństwa aplikacji obejmują:
Obfuskacja nazw
Renaming zmienia nazwy metod i zmiennych. Sprawia to, że zdekompilowane źródło jest trudniejsze do zrozumienia dla człowieka, ale nie zmienia wykonania programu. Nowe nazwy mogą wykorzystywać różne schematy, takie jak „a”, „b”, „c”, lub liczby, znaki niedrukowalne lub niewidoczne. Nazwy mogą być przeciążone, o ile mają inny zakres. Obfuskacja nazw jest podstawową transformacją, która jest używana przez większość obfuskatorów .NET (C#, etc.), iOS, Java i Android.
Szyfrowanie ciągów
W zarządzanym pliku wykonywalnym, wszystkie ciągi są wyraźnie wykrywalne i czytelne. Nawet po zmianie nazw metod i zmiennych, łańcuchy mogą być użyte do zlokalizowania krytycznych sekcji kodu poprzez szukanie odwołań do łańcuchów w kodzie binarnym. Dotyczy to również komunikatów (zwłaszcza komunikatów o błędach), które są wyświetlane użytkownikowi. Aby zapewnić skuteczną barierę przed tego typu atakami, szyfrowanie łańcuchów ukrywa je w pliku wykonywalnym i przywraca ich oryginalną wartość tylko w razie potrzeby. Odszyfrowanie łańcuchów w czasie wykonywania zazwyczaj wiąże się z niewielką karą za wydajność w czasie wykonywania.
Obfuscacja przepływu sterowania
Obfuscacja przepływu sterowania syntetyzuje warunkowe, rozgałęziające się i iteracyjne konstrukcje, które produkują poprawną logikę wykonywalną, ale dają niedeterministyczne wyniki semantyczne po dekompilacji. Mówiąc prościej, sprawia to, że zdekompilowany kod wygląda jak logiczne spaghetti, które jest bardzo trudne do zrozumienia dla hakera. Techniki te mogą wpłynąć na wydajność metody w czasie wykonywania.
Transformacja wzorca instrukcji
Konwertuje wspólne instrukcje tworzone przez kompilator na inne, mniej oczywiste konstrukcje. Są to całkowicie legalne instrukcje języka maszynowego, które mogą nie być czysto mapowane do języków wysokiego poziomu, takich jak Java lub C#. Jednym z przykładów jest buforowanie zmiennych przejściowych, które wykorzystuje opartą na stosie naturę runtime’ów Java i .NET.
Dummy Code Insertion
Wstawianie kodu do pliku wykonywalnego, który nie ma wpływu na logikę programu, ale łamie dekompilatory lub sprawia, że kod poddany inżynierii wstecznej jest znacznie trudniejszy do przeanalizowania.
Usuwanie nieużywanego kodu i metadanych
Usuwanie informacji debugowania, nieistotnych metadanych i używanego kodu z aplikacji czyni je mniejszymi i zmniejsza ilość informacji dostępnych dla atakującego. Procedura ta może nieznacznie poprawić wydajność runtime.
Łączenie/łączenie binarne
Ta transformacja łączy wiele wejściowych plików wykonywalnych/bibliotek w jedną lub więcej wyjściowych binariów. Linkowanie może być użyte do zmniejszenia rozmiaru aplikacji, szczególnie gdy jest używane ze zmianą nazwy i przycinaniem, może uprościć scenariusze wdrażania i może zmniejszyć ilość informacji dostępnych dla hakerów.
Opaque Predicate Insertion
Obfuscates przez dodanie gałęzi warunkowych, które zawsze ewaluują do znanych wyników-wyników, które nie mogą być łatwo określone przez analizę statyczną. Jest to sposób na wprowadzenie potencjalnie niepoprawnego kodu, który w rzeczywistości nigdy nie zostanie wykonany, ale jest mylący dla atakujących próbujących zrozumieć zdekompilowane dane wyjściowe.
Anti-Tamper
Obfuscator może wstrzyknąć samoochronę aplikacji do twojego kodu, aby zweryfikować, czy twoja aplikacja nie została w żaden sposób zmanipulowana. Jeśli zostanie wykryta manipulacja, może zamknąć aplikację, ograniczyć jej funkcjonalność, wywołać losowe awarie (aby ukryć powód awarii) lub wykonać inne niestandardowe działanie. Może również wysłać wiadomość do usługi w celu dostarczenia szczegółów na temat wykrytej manipulacji.
Anti-Debug
Gdy haker próbuje piracić lub podrabiać twoją aplikację, kraść twoje dane lub zmieniać zachowanie krytycznego elementu oprogramowania infrastrukturalnego, prawie na pewno zacznie od inżynierii wstecznej i przechodzenia przez twoją aplikację za pomocą debuggera. Obfuscator może nałożyć warstwę samoochrony aplikacji poprzez wstrzyknięcie kodu wykrywającego, czy aplikacja produkcyjna jest wykonywana w debuggerze. Jeśli debugger jest używany, może on uszkodzić poufne dane (chroniąc je przed kradzieżą), wywołać losowe awarie (aby ukryć, że awaria była wynikiem sprawdzenia debugera) lub wykonać dowolną inną niestandardową akcję. Może również wysłać wiadomość do usługi, aby zapewnić sygnał ostrzegawczy.
Czy powinienem ukryć moją aplikację?
Silnie rozważ wykorzystanie ukrycia i samoochrony aplikacji w czasie działania, jeśli wydajesz oprogramowanie, które działa w niezaufanym środowisku i posiada własność intelektualną, zapewnia dostęp do poufnych informacji lub ma zablokowaną funkcjonalność. Obfuskacja znacznie utrudnia napastnikom przeglądanie kodu i analizowanie aplikacji. Utrudnia również hakerom debugowanie i manipulowanie aplikacją. Celem końcowym jest dodanie warstwy ochronnej, która utrudni wydobycie lub odkrycie użytecznych informacji, takich jak tajemnice handlowe (IP), dane uwierzytelniające lub luki bezpieczeństwa w aplikacji. Powinno to również utrudnić modyfikowanie logiki aplikacji lub przepakowywanie aplikacji złośliwym kodem.
.
Dodaj komentarz