Zaszyfrowany ClassLoader

0

Cześć. Zakładając, że mam zaszyfrowane pliki .class i ClassLoader, który je deszyfruje to w jaki sposób mogę zabezpieczyć klasę loadera przed podejrzeniem?

0

Startujesz program z normalnym ClassLoaderem, zaszyfrowaną klasę pobierasz jako InputStream, odszyfrowujesz i ładujesz jako parent ClassLoader dla URLClassLoader (zakładam, że z takim Ci wystartuje program). Potem podmieniasz classloader w runtimie.

0
duce74 napisał(a)

Startujesz program z normalnym ClassLoaderem, zaszyfrowaną klasę pobierasz jako InputStream, odszyfrowujesz i ładujesz jako parent ClassLoader dla URLClassLoader (zakładam, że z takim Ci wystartuje program). Potem podmieniasz classloader w runtimie.

Z tego wynika, że załadowana poprzez InputStream klasa X nie jest zaszyfrowana. Czyli ktoś podda klasę X dekompilacji i wczyta pozostałe dane w prosty sposób. Zależy mi na tym by jak najbardziej utrudnić dostęp do klas.

0

proguard.sf.net

Jeśli twój program będzie naprawdę wart dekompilacji to sobie go ktoś i tak odtworzy. Nie ma znaczenia w czym piszesz i jak się zabezpieczasz. Jeżeli program da się odpalić na lokalnym kompie to da się go złamać/ zdekodować.

0
Wibowit napisał(a)

proguard.sf.net

Jeśli twój program będzie naprawdę wart dekompilacji to sobie go ktoś i tak odtworzy. Nie ma znaczenia w czym piszesz i jak się zabezpieczasz. Jeżeli program da się odpalić na lokalnym kompie to da się go złamać/ zdekodować.

Napisałeś coś co już wszyscy wiemy. Po co więc zaśmiecasz forum?

0

A jaki jest twój cel? Chcesz zrobić coś lepszego od ProGuarda?

0

Czy ProGuard realizuje to co opisałem w pytaniu? Raczej nie ;) Jego można użyć co najwyżej do zmniejszenia wagi skompilowanych klas.

0

Jedynym skutecznym sposobem na to, żeby użytkownik nie mógł poznać kodu klasy, jest po prostu nie wysyłanie tej klasy do niego. Możesz zrobić usługę online i przerzucić na nią część funkcjonalności swojego programu.

Na stronie ProGuarda jest napisane:

Making programs and libraries harder to reverse-engineer.

Inny program, szyfrujący za pomocą programu natywnego napisanego w C: www.jsecurity.net/classguard

Oraz interesująca lektura: www.javaworld.com/javaworld/javaqa/2003-05/01-qa-0509-jcrypt.html

Myślę, że najlepszą opcją (jeśli nie chcesz robić usług online) byłoby sforkowanie OpenJDK, dodanie do niego kodu deszyfrującego, potem zabezpieczenie np PELockiem (www.pelock.com), a na końcu rozpowadzanie takiego OpenJDK razem z programem :P
Edit:
Jednak to zły pomysł. Łamie licencję GPL (odrzucam opcję bez łamania licencji, bo zabezpieczanie GPLowych programów jednak nie ma sensu - GPL wymaga, abyś udostępnił kod na żądanie).

0

Juz kiedys to opisywalem na tym forum chyba, ale moze napisze ponownie.
Masz klientow ktorzy kupuja / dostaja od Ciebie licencje - wymagaj od nich aby mieli wygenerowana pare kluczy prywatnych / publicznych, i popros aby wyslali Ci klucz publiczny - to jest bezpieczne. Ty tym kluczem przejedziesz te pliki class ktore chcesz zabezpieczyc. Jednoczesnie, Twoja aplikacja bedzie miala specjalny ClassLoader ktory bedzie wymagal poprawnego klucza prywatnego, ktory bedzie wskazany przez usera. Za pomoca tego klucza prywatnego Twoj ClassLoader wczyta zaszyfrowane klasy i je odszyfruje zanim przekaze dalej tablice byte[] do defineClass.
Masz zagwarantowane - ze tylko i wylacznie aplikacja zadziala z kluczem prywatnym ktory odpowiada kluczowi pyblicznemu ktorym ja zakodowales. Nie ominiesz tym tego ze jeden klucz prywatny moze byc uzywany przez kilku / set userow.
Da sie to zrobic, robilem takiego loadera. Wartosc dodana to taka ze PK kryptografia to bardzo silne szyfry, i nie zlamie sie tego (tak latwo, o ile w ogole, przy kluczu o odpowiedniej ilosci bitow). Minus jest taki ze klienci musza Tobie i Twojej aplikacji ufac na tyle, ze pozwola jej wczytaj swoj klucz prywatny i podadza do niego haslo (jesli jest) - zawsze przeciez mozesz te hasla i klucze wysylac sobie na serwer siecia. Ale oni zawsze moga zrobic sobie specjalne klucze tylko i wylacznie do tej aplikacji.

0

No ale skoro pan Marek chce zabezpieczać swoją klasę to można podejrzewać, że za darmo tych swoich klas nie rozdaje. I właśnie boi się, że któryś z jego klientów, który zakupił jego klasy zechce je podejrzeć. Ten bajer z asymetrycznym szyfrowaniem może się co najwyżej przydać przy dystrybucji programu poprzez Internet, ale w takim przypadku klucze można generować też online poprzez zwykły formularz rejestracyjny + szyfrowanie SSL. SSL to mniej/ więcej to samo co twój pomysł.

0

Wibowit ma rację, nie chcę udostępniać swoich wypocin ;) Poszukuje darmowego rozwiązania. Odbiorcą jest użytkownik, który nie wie nawet co to jest PKI :) Jak na razie zostanę przy początkowym pomyśle czyli: tworzę dodatkową aplikację w c++, która sprawdza czy plik jar jest oryginalny i wysyła jako parametr programu klucz do odszyfrowania klas. Póki co nic lepszego nie znalazłem.

0

No niby nie zna, ale może zlecić deszyfrację komuś innemu kto się zna. Sugeruję nie przekombinowywać z algorytmem zabezpieczeń, koszty stworzenia zabezpieczenia są zwykle wyższe niż koszty łamania. Mam na myśli coś z szyfrowaniem szyfrowaniem. Natomiast zaciemnianie kodu (obfuscating) jest łatwe do przeprowadzenia, jeśli jest dobrze zrobione to znacznie wydłuża czas doprowadzenia skompilowanego pliku z powrotem do postaci źródłowej (a przynajmniej do podobnej co oryginał) i nie da się tego złamać, tzn odciemniając jeden kod nie da się zrobić uniwersalnego narzędzia do odciemniania innych kodów.

Jak na razie zostanę przy początkowym pomyśle czyli: tworzę dodatkową aplikację w c++, która sprawdza czy plik jar jest oryginalny i wysyła jako parametr programu klucz do odszyfrowania klas. Póki co nic lepszego nie znalazłem.

W twoim kodzie zapewne jest kluczowy if, który decyduje o tym czy uruchomić aplikację. W takim przypadku wystarczy go zlokalizować (za pomocą dowolnego deasemblera) i wymazać, tzn wprowadzić bezwarunkowy skok do procedury uruchamiającej. Jeśli ktoś zawodowo zajmuje się łamaniem programów to takie coś to dla niego kilka minut.

Kiedyś, jak byłem chyba w gimnazjum jeszcze, albo w liceum to bawiłem się w łamanie programów (natywnych Windowsowych, nie żadnych Java czy .NET - wtedy z języków znałem tylko i wyłącznie asemblera, a Javy nie lubiłem przez jej ówczesne zamulające implementacje). Złamałem WinRARa (tzn ciężko to nazwać łamaniem, bo tylko usunąłem to początkowe okienko z ostrzeżeniem), jakiś prosty programik, prostą gierkę dla kumpla (jakiś zbajerowany klon Invaders albo coś w ten deseń), no i miałem dość poważny problem z pewnym programikiem do "optymalizowania" zajętości pamięci. Próbowałem wyszukać tam procedury odpowiedzialne za sprawdzanie legalności, spędziłem kilka dni i się poddałem - kolesie zastosowali tam chyba setki ifów i dziesiątki wzajemnie rekurencyjnych funkcji do zaimplementowania tych zabezpieczeń. Mimo wszystko byłem wtedy jeszcze dzieciakiem, więc trudno oczekiwać spektakularnych sukcesów (zważając jeszcze na to, że nie nauczyłem się korzystać z debuggera, tylko wszystko dezasemblowałem za pomocą wdasm32).

0

Deszyfruj w c++, odszyfrowany bytekod przekazuj do jvm poniższą funkcją z jni:
jclass DefineClass(JNIEnv *env, const char *name, jobject loader, const jbyte *buf, jsize bufLen);

1 użytkowników online, w tym zalogowanych: 0, gości: 1