
Inżynieria wsteczna już dawno przestała być domeną wyspecjalizowanych laboratoriów bezpieczeństwa. Współczesne środowiska uruchomieniowe, bogate metadane oraz powszechnie dostępne narzędzia do analizy kodu sprawiają, iż oprogramowanie może przez cały czas być łamane w celu uzyskania szczegółów implementacyjnych: algorytmów, reguł biznesowych czy mechanizmów kontroli dostępu.
Problem ten dotyczy w równym stopniu aplikacji tworzonych w .NET, Javie, Pythonie, jak i w językach natywnych, takich jak C czy C++. Rozważając dostępne sposoby ochrony kodu wynikowego, warto uwzględnić wynikające z tego różnice technologiczne. Niemniej cel ochrony pozostaje ten sam: utrudnić analizę i modyfikację kodu oraz skutecznie chronić własność intelektualną zawartą w oprogramowaniu.
Dlaczego klasyczna obfuskacja nie wystarcza
W środowiskach takich jak .NET czy Java, kod pośredni zachowuje znaczną ilość informacji strukturalnych. W Pythonie dostęp do obiektów środowiska uruchomieniowego umożliwia introspekcję, natomiast w przypadku aplikacji natywnych możliwa jest analiza statyczna i dynamiczna kodu maszynowego. Proste zaciemnianie nazw symboli lub struktury projektu nie zapewnia trwałej ochrony.
Dlatego skuteczne zabezpieczenie kodu wynikowego powinno:
-
chronić krytyczne fragmenty logiki aplikacji,
-
działać również w czasie wykonywania programu,
-
integrować się z procesem budowania i dystrybucji oprogramowania,
-
umożliwiać egzekwowanie licencji bez manualnego implementowania mechanizmów bezpieczeństwa w kodzie.
AxProtector – ochrona kodu na poziomie binarnym
AxProtector jest narzędziem przeznaczonym do ochrony aplikacji przed inżynierią wsteczną i manipulacją, działającym na poziomie kodu wynikowego. Nie wymaga dostępu do kodu źródłowego ani jego modyfikacji. Stanowi element ekosystemu CodeMeter i może być stosowany zarówno w projektach desktopowych, serwerowych, jak i w rozwiązaniach działających offline.
W zależności od technologii AxProtector umożliwia:
-
szyfrowanie wybranych fragmentów kodu lub całej aplikacji,
-
ochronę przepływu sterowania,
-
wykrywanie ingerencji w strukturę programu,
-
powiązanie uruchomienia aplikacji z istotną licencją.
Jak działa zabezpieczanie aplikacji?
Pierwszym krokiem jest identyfikacja elementów, które faktycznie stanowią wartość własności intelektualnej: algorytmów, reguł biznesowych, mechanizmów obliczeniowych lub integracyjnych. Ochrona nie musi obejmować całej aplikacji – często wystarczające jest zabezpieczenie kluczowych modułów.

Następnie wybierany jest tryb ochrony. AxProtector umożliwia zarówno szybkie zabezpieczenie aplikacji przy użyciu domyślnych parametrów, jak i konfigurację zaawansowaną, pozwalającą precyzyjnie kontrolować zakres ochrony, tj. poszczególne metody i funkcje. Możliwe jest również zabezpieczenie aplikacji z pominięciem mechanizmu licencjonowania (Protection Only).

Ochrona może być stosowana na etapie kompilacji lub po wygenerowaniu artefaktów wynikowych, co pozwala na łatwą integrację z istniejącymi procesami CI/CD. Ochronie można poddać skrypty. Po zabezpieczeniu aplikacja jest dystrybuowana w standardowy sposób, a zmiany w samych licencjach lub zakresie dostępnych funkcji nie wymagają ponownej rekompilacji.
Generowanie i przechowywanie kluczy kryptograficznych
Kluczowym elementem skutecznej ochrony jest sposób zarządzania kluczami kryptograficznymi. W rozwiązaniach opartych na AxProtector klucze nie są przechowywane w aplikacji (za wyjątkiem specjalnego trybu Protection Only) ani dostępne w postaci jawnej.
Klucze kryptograficzne są generowane po stronie producenta systemu i przechowywane w bezpiecznych kontenerach licencyjnych CodeMeter. Kontenery te mogą mieć postać:
-
sprzętową - CmDongle,
-
programową, powiązaną z cechami sprzętu - CmActLicense,
-
chmurową, powiązaną z użytkownikiem lub tożsamością - CmCloud.

Prywatne klucze nigdy nie opuszczają kontenera i nie mogą zostać wyeksportowane. Aplikacja nie uzyskuje do nich bezpośredniego dostępu – może jedynie korzystać z operacji kryptograficznych udostępnianych przez bezpieczne API. Taka architektura eliminuje ryzyko przejęcia kluczy poprzez analizę kodu wynikowego lub środowiska uruchomieniowego.
Mechanizmy bezpieczeństwa stosowane w AxProtector
Ochrona realizowana przez AxProtector opiera się na zestawie uzupełniających się mechanizmów działających zarówno statycznie, jak i w czasie wykonywania aplikacji.
Wykrywanie manipulacji
Aplikacja jest w stanie wykryć próby ingerencji w swoją strukturę, modyfikację chronionych fragmentów lub naruszenie integralności kodu. W przypadku wykrycia nieprawidłowości możliwe jest kontrolowane przerwanie działania programu.
Szyfrowanie i podpisywanie
Kod aplikacji jest szyfrowany z wykorzystaniem 256-bitowego algorytmu AES. Integralność i autentyczność chronionych fragmentów zapewniają mechanizmy podpisu cyfrowego oparte na kryptografii krzywych eliptycznych (224 bity). Dzięki temu aplikacja może zweryfikować, iż uruchamiany kod pochodzi od zaufanego producenta i nie został zmodyfikowany.
Mechanizmy przeciwdziałania analizie dynamicznej
AxProtector zawiera mechanizmy wykrywające obecność narzędzi służących do śledzenia wykonania programu oraz środowisk emulacyjnych. Utrudniają one obserwację przebiegu wykonania aplikacji oraz wprowadzanie zmian w kodzie w trakcie jej działania.
Deszyfrowanie na żądanie
Chronione fragmenty kodu oraz dane pozostają zaszyfrowane w pamięci i są odszyfrowywane wyłącznie na czas niezbędny do ich wykonania. Po użyciu mogą zostać ponownie zaszyfrowane lub usunięte z pamięci. Takie podejście znacząco ogranicza możliwość pozyskania wrażliwych informacji poprzez analizę zawartości pamięci operacyjnej.
Licencjonowanie i SDK
Jeżeli ochrona kodu ma zostać rozszerzona o licencjonowanie, AxProtector może być używany w połączeniu z mechanizmami CodeMeter. Modele licencyjne mogą obejmować licencje czasowe, subskrypcyjne, oparte na funkcjach, liczbie instancji lub rzeczywistym wykorzystaniu.
W bardziej zaawansowanych scenariuszach do dyspozycji jest SDK, które umożliwia sprawdzanie dostępności funkcji licencyjnych w czasie wykonywania aplikacji oraz dynamiczne włączanie lub wyłączanie określonych modułów. Pozwala to zachować pełną kontrolę nad zachowaniem aplikacji bez implementowania własnych mechanizmów kryptograficznych.
Specyfikacja techniczna
Poniższa tabela przedstawia parametry techniczne frameworka AxProtector wykorzystującego kontener CmDongle. Należy zaznaczyć, iż podobną funkcjonalność ma kontener chmurowy CmCloud.
| Software + hardware | ![]() |
![]() |
| Typ rozwiązania | Oprogramowanie do ochrony i licencjonowania aplikacji na poziomie kodu wynikowego | Sprzętowy kontener licencyjny (USB dongle) |
| Rola w architekturze | Ochrona IP, szyfrowanie kodu, egzekwowanie licencji, mechanizmy runtime | Bezpieczne przechowywanie licencji i kluczy kryptograficznych |
| Poziom ochrony | Binarny i/lub po kompilacji (post-build lub compile time) | Sprzętowy, izolowany od systemu operacyjnego |
| Obsługiwane platformy | Windows, Linux, macOS, Android; technologie: .NET, Java, Python, JavaScript, Objective-C, Swift | Niezależny od platformy aplikacji; kooperacja z Windows, Linux, macOS przez CodeMeter Runtime |
| Integracja z procesem build | Tak, GUI i CLI; możliwość integracji z CI/CD | Nie dotyczy |
| Tryby ochrony | Quick, Basic, Expert, Protection Only (bez licencjonowania) | Nie dotyczy |
| Szyfrowanie kodu | AES 256-bit, szyfrowanie funkcji i fragmentów kodu | AES 128/256-bit w firmware |
| Podpisy kryptograficzne | ECC 224-bit (weryfikacja integralności i autentyczności kodu) | RSA 1024/2048/4096-bit, ECC 224-bit |
| Ochrona w czasie wykonywania | Tak: deszyfrowanie na żądanie, ochrona przepływu sterowania | Tak: CodeMoving – wykonywanie zaszyfrowanego kodu wewnątrz dongla |
| Wykrywanie manipulacji | Tak: kontrola integralności, anti-debugging, anti-tampering | Tak: izolacja kryptograficzna, certyfikowany układ |
| Modele licencjonowania | Perpetual, czasowe, feature-based, pay-per-use, trial, offline ... | Przechowywanie wielu licencji, liczniki użycia, okresy ważności |
| Kontenery licencyjne | CmDongle, CmActLicense, CmCloudContainer | Wyłącznie sprzętowy CmDongle |
| Generowanie i przechowywanie kluczy | Klucze generowane i używane poprzez kontenery CodeMeter | Klucze prywatne generowane i przechowywane w donglu, brak eksportu |
| Certyfikacja bezpieczeństwa | Mechanizmy zgodne z ekosystemem CodeMeter | Common Criteria EAL 5+ |
| Pamięć licencyjna | Nie dotyczy | ok. 328 kB (tysiące licencji) |
| Interfejs | GUI, CLI, API (WUPI) | USB 2.0 (HID/MSD) |
| Zastosowanie typowe | Ochrona algorytmów, logiki biznesowej, aplikacji desktopowych i serwerowych | Offline licensing, najwyższy poziom ochrony kluczy, środowiska wysokiego ryzyka |
Pytania i odpowiedzi
Jaką realną przewagę daje połączenie AxProtector z CmDongle w porównaniu do samej ochrony programowej?
AxProtector zabezpiecza kod aplikacji przed analizą i manipulacją, natomiast CmDongle pełni rolę sprzętowego kontenera licencyjnego oraz magazynu kluczy kryptograficznych. Takie połączenie eliminuje konieczność przechowywania kluczy w aplikacji lub w systemie operacyjnym i znacząco podnosi odporność na ataki runtime, debugowanie oraz emulację. Dodatkowo pozawala na użycie specjalnego trybu bezpieczeństwa CodeMoving.
Czy AxProtector wymaga modyfikacji kodu źródłowego aplikacji?
Nie. AxProtector działa na poziomie kodu wynikowego oraz skryptów i może być stosowany jako etap post-build lub w trakcie kompilacji (CTP). Nie wymaga ingerencji w logikę aplikacji ani manualnego implementowania mechanizmów bezpieczeństwa.
Czy możliwe jest użycie AxProtector wyłącznie do ochrony IP, bez licencjonowania?
Tak. AxProtector oferuje tryb Protection Only, w którym aplikacja jest szyfrowana i chroniona przed inżynierią wsteczną, ale jej uruchomienie nie jest powiązane z licencją. Jest to typowy scenariusz ochrony algorytmów, modeli obliczeniowych lub know-how zawartego w kodzie.
W jaki sposób chronione są klucze kryptograficzne wykorzystywane przez aplikację?
Klucze kryptograficzne są generowane i przechowywane w bezpiecznych kontenerach CodeMeter. W przypadku CmDongle klucze prywatne nigdy nie opuszczają sprzętowego kontenera i nie mogą zostać wyeksportowane. Aplikacja nie uzyskuje do nich bezpośredniego dostępu – korzysta jedynie z operacji kryptograficznych udostępnianych przez bezpieczne API.
Czy CmDongle pełni wyłącznie rolę nośnika licencji?
Nie. CmDongle jest aktywnym elementem architektury bezpieczeństwa. Oprócz przechowywania licencji i kluczy kryptograficznych może wykonywać zaszyfrowane fragmenty kodu wewnątrz kontenera (CodeMoving), izolując je całkowicie od systemu operacyjnego i narzędzi analitycznych.
Jak rozwiązanie radzi sobie z atakami dynamicznymi, takimi jak debugowanie lub analiza pamięci?
AxProtector stosuje mechanizmy wykrywania manipulacji, anti-debugging oraz deszyfrowanie kodu na żądanie. Chronione fragmenty pozostają zaszyfrowane w pamięci i są odszyfrowywane wyłącznie na czas wykonania, co znacząco utrudnia analizę dynamiczną oraz modyfikację aplikacji w czasie jej działania. Korzystając z mechanizmu CodeMoving, wyodrębniony kod może być analizowany wyłącznie w modelu czarnej skrzynki.
Kiedy zamiast CmDongle warto rozważyć CmCloud?
CmCloud jest naturalnym wyborem w scenariuszach, w których kluczowa jest centralna kontrola licencji, elastyczne zarządzanie dostępem oraz praca w środowiskach rozproszonych. Sprawdza się szczególnie w modelach subskrypcyjnych, pay-per-use oraz w rozwiązaniach SaaS, gdzie licencja jest powiązana z użytkownikiem lub tożsamością, a nie z konkretnym urządzeniem.
Czy rozwiązania CodeMeter działają w środowiskach offline?
Tak. AxProtector oraz kontenery licencyjne CodeMeter, w tym CmDongle, zostały zaprojektowane z myślą o pracy offline. Weryfikacja licencji oraz operacje kryptograficzne mogą być realizowane lokalnie, bez stałego połączenia z serwerem lub chmurą.
Dla jakich typów aplikacji to podejście ma największy sens?
Największe korzyści osiągają producenci oprogramowania, których wartość tkwi w algorytmach, logice biznesowej lub specjalistycznych mechanizmach obliczeniowych. Dotyczy to w szczególności aplikacji desktopowych, przemysłowych, inżynierskich oraz rozwiązań embedded, dystrybuowanych do środowisk o podwyższonym ryzyku inżynierii wstecznej.
WIBU-SYSTEMS jest producentem CodeMeter, który służy do skutecznej ochrony, licencjonowania i zabezpieczania oprogramowania. Nasze biblioteki SDK oraz dedykowane dla poszczególnych platform programistycznych pakiety można wypróbować w dowolnej chwili, rejestrując się na naszej stronie WWW.


















