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.

5 myśli na temat “Prosty sposób na zablokowanie aplikacji

  1. Mam dość posuniętą do przodu paranoje, ale nie łatwiej po prostu jakiegoś generatora na dacie opartego napisać?
    Twoje rozwiązanie brzmi jak spore utrudnienie dla kodującego i dla kradnącego, ale jeśli user może rozszyfrować classę to zrobi to i podmieni np expiryDate w niej, bądź po prostu przeszyfruje własnym kluczem.
    Jeśli aplikacja ma działać offline to poszedłbym jednak po najmniejszej linii oporu. Jeśli dopuszczalny jest strzał w sieć w celu autoryzacji to można zacząć kombinować (choć osobiście nie wierzę w istnienie rozwiązania które w 100% by zapobiegło kradzieży).
    Wszystko oczywiście wymaga czasu więc osobiście wątpię czy ktoś wyda pieniądze na programistę miast po prostu kupić licencję ergo proste rozwiązanie z jakimś sprawdzaniem daty wins

  2. Zgadzam się z Michałem, jeśli klasa jest w pamięci w postaci odszyfrowanej, wystarczy zrobić zrzut pamięci (ew. zdekompilować resztą aplikacji i podmienić classloader) i mamy dostęp do odszyfrowanej klasy. Nadpisanie sprawdzania daty NOPami można zrobić ręcznie. Albo czegoś nie dostrzegam, albo łatwo taką aplikację „sckrakować” (?)

  3. ale przeciez i tak na poczatku w bajtkodzie siedzi jakis ‚if (warunek) then rozszyfruj’.no to bierzemy ten bajtkod i zmieniamy na ‚if true then rozszyfruj’. z tej perspektywy rownie dobrze moze tam data, nr licencji albo cokolwiek innego. to zawsze bedzie zmiana kilku bajtow.

    wydaje mi sie, ze zabezpieczenie musi byc zawsze na serwerze – zawsze serwer powinien zwracac kawalek aplikacji albo istotne do tego uruchomienia dane.

  4. Piotrek, a co w przypadku ograniczonego dostępu do zasobów sieciowych? Zresztą niekoniecznie musisz zaimplementować to wszystko za pomocą warunków.

  5. Tyle że czy to jest w warunku czy inaczej, w końcu i tak to będzie bytecode’m, z którym można się „pobawić”. Jeśli masz konkretny „niewarunkowy” przykład (możliwości jest wiele), mogę zademonstrować jak to zrobić – ale ogólna zasada została już opisana przez Piotrka.

    W sytuacji braku łączności już lepiej stosować dongle ;).

Napisz odpowiedź

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *

To create code blocks or other preformatted text, indent by four spaces:

    This will be displayed in a monospaced font. The first four 
    spaces will be stripped off, but all other whitespace
    will be preserved.
    
    Markdown is turned off in code blocks:
     [This is not a link](http://example.com)

To create not a block, but an inline code span, use backticks:

Here is some inline `code`.

For more help see http://daringfireball.net/projects/markdown/syntax