Prosty sposób na zablokowanie aplikacji
Życie zmusza nas czasami do tworzenia aplikacji z ograniczonym czasem użytkowania. Rozmyślałem ostatnio nad jakimś prostym, skutecznym i niezbyt wyrafinowanym sposobie zabezpieczenia aplikacji. Oczywiście każde zabezpieczenie da się obejść czy to pisząc cracka czy po prostu z palca modyfikując binarkę w celu usunięcia mechanizmu sprawdzająco-blokującego. Warto jednak utrudnić to zadanie… choć trochę.
Na czym polega mój pomysł? Polega on, i nie jest to odkrywcze, na zaszyfrowaniu jakiegoś elementu aplikacji bez którego jej działanie jest ograniczone. Najlepiej by poddać temu procederowi jakąś niewielką klasę, która będzie wołana w różnych miejscach aplikacji. Generalnie chodzi o to by jej brak skutecznie unieruchomił albo okroił aplikację.
Następnie generujemy sobie unikalną parę kluczy niesymetrycznych.
Listing 1. Instalacja kluczy z wykorzystaniem openssl
$ openssl genrsa -out private.pem 1024
$ openssl rsa -in private.pem -out public.pem -outform PEM -pubout
Jednym z nich szyfrujemy sobie naszą klasę po czym klucz usuwamy. Nie ma większego znaczenia czy użyjemy do tego klucza prywatnego czy publicznego. Choć użycie klucza prywatnego jest zdecydowanie lepszym rozwiązaniem.
Listing 2. Szyfrowanie pliku
$ openssl rsautl -encrypt -inkey private.pem -in A.class -out app.enc
Dystrybucji podlega zaszyfrowana klasa oraz drugi z pary kluczy.
Jak to działa w praktyce. W momencie uruchomienia aplikacji odszyfrowujemy i ładujemy dynamicznie naszą klasę. Dobrze by było gdyby siedziała w niej informacja n.t. kiedy wygasa licencja. Jeżeli data licencji minęła to usuwamy plik klucza. Kolejne uruchomienie aplikacji zakończy się dość widowiskowym błędem braku klucza, a jeżeli pomimo tego użytkownik sobie taki klucz wyczaruje to i tak przywrócenie aplikacji do stanu używalności wymagać będzie trochę czasu i odpowiednich środków (czytaj zatrudnienia specjalisty).
Nie jest to nic odkrywczego czy rewolucyjnego, ale sądzę, że takie mały i prosty DIY dla aplikacji jest czasami dobrą alternatywą dla zakupu drogiego oprogramowania do zarządzania licencjami.