Android - zabezpieczenie aplikacji sprzedawanej poza Google Play

Android - zabezpieczenie aplikacji sprzedawanej poza Google Play
P8
  • Rejestracja:ponad 10 lat
  • Ostatnio:około 5 lat
  • Postów:7
0

Siema wszystkim,
Zastanawiam się w jaki sposób można zabezpieczyć aplikację pisaną w Javie. Najbardziej zależałoby mi, aby dana aplikacja działała jedynie na danym urządzeniu. Użytkownik musiałby po instalacji wpisać jakiś kod, albo program zacząłby działać dopiero po weryfikacji przez internet.
Nie mam doświadczenia w zabezpieczaniu aplikacji. Java dodatkowo to utrudnia. Nie chcę tworzyć nic zbyt skomplikowanego, bo jeśli ktoś zechce, to i tak jest to kwestia czasu zanim obejdzie to zabezpieczenie. Może znacie jakiś w miarę łatwy sposób weryfikacji?

Bartosz Wójcik
  • Rejestracja:ponad 14 lat
  • Ostatnio:ponad 4 lata
  • Postów:439
1

Z Javą jest ten problem, że jest kompilowana domyślnie do formatu pseudokodu dla JVM.

Jak większość takich rozwiązań (np. .NET, VB, ReFox) - doczekała wielu narzędzi do dekompilacji i odbezpieczania.

AndroChef
http://www.neshkov.com/ac_decompiler.html

JEB
http://www.android-decompiler.com/

JD-GUI (musisz najpierw skonwertować projekt do JAR np. https://code.google.com/p/dex2jar/)
http://jd.benow.ca/

Ostatnio widziałem na jakimś forum crackerskim unpakery do wszystkich popularnch Androidowych zabezpieczeń dla aplikacji opartych o Java.

Mówiąc krótko, musiałbyś przetestować te narzędzia pod kątem narzędzi odbezpieczających i dopiero z tego co "przetrwa" wybrać jakiś interesujący tool. Więc jak już znajdziesz jakiś tool to poszukaj jednocześnie w google np. "xxx unpacker" lub "xxx deobfuscator".

Jednak to tylko Java i mimo obfuscatorów, szyfrowania/deszyfrowania klas runtime przez customowe wersje JVM, przez jakieś drivery, ciężko jest coś solidnego znaleźć.

P8
  • Rejestracja:ponad 10 lat
  • Ostatnio:około 5 lat
  • Postów:7
0

Dzięki wielkie za odpowiedź,
Chodzi mi tutaj także o zabezpieczenie aplikacji spoza google play, czyli coś w rodzaju licencji bez której nie zadziała. Oczywiście sprawdzenie musiałoby odbywać się troszkę inaczej niż za pomocą jednej instrukcji warunkowej, bo przy javie jest to zbyt proste to usunięcia. Spotkał się ktoś z takim rozwiązaniem?

wiciu
  • Rejestracja:ponad 11 lat
  • Ostatnio:13 dni
  • Postów:1205
0

Podałeś mało szczegółów, ale nie widzę problemu, żeby coś takiego zrobić. Jeżeli aplikacja ma mieć aktywne funkcje po podaniu jakiegoś kodu, to najlepiej stworzyć back-end, który zajmie się autoryzacją i po autoryzacji pozwoli na korzystanie z aplikacji lub pobranie odpowiednich danych. Żeby to osiągnąć aplikacja przynajmniej raz będzie musiała się połączyć z internetem. Oczywiście należy pamiętać o tym, żeby aplikacja nie miała hardkodowanych żadnych haseł, kluczy, etc. Wtedy nawet, jak ktoś ją zdekompiluje i znajdzie adres serwera oraz end-point, to i tak bez znajomości wspomnianego kodu nie będzie mógł się autoryzować. Jest wiele metod autoryzacji. W przypadku aplikacji mobilnych, popularna jest metoda autoryzacji poprzez token, ale trzeba wtedy pamiętać o tym, żeby szyfrować połączenie.

edytowany 1x, ostatnio: wiciu
Bartosz Wójcik
Wiesz jak łamie się takie zabezpieczenia? Normalnie. Dostajesz loginy do usługi od prawowitego klienta (który to potem np. chce to sobie odsprzedawać na jakimś chińskim allegro), ściągasz lokalnie brakujące komponenty i połączysz przez patche z istniejącą aplikacją. Lepszym rozwiązaniem byłyby zdalnie wywoływane procedury i funkcje, z których korzysta aplikacja na podstawie loginu i hasła użytkownika licencji. Tym się raczej nikt nie podzieli z tłumem, a nawet jeśli to można z poziomu serwera to sprawnie zablokować. RPC ftw :)
wiciu
@Bartosz Wójcik Nie jestem ekspertem od security. Możesz napisać, co konkretnie w opisanym przeze mnie podejściu jest złe lub niebezpieczne? Ewentualnie możesz podać przykład prawidłowego zabezpieczenia aplikacji mobilnej. Nie do końca rozumiem Twoją wypowiedź, choć może to wynikać z mojej niewiedzy. Nie wiem, dlaczego ktoś miałby dostawać od kogoś loginy do usługi i sprzedawać je na chińskim allegro. Nie wiem też o jakich komponentach i patchach piszesz. :-)
Bartosz Wójcik
Piszesz "najlepiej stworzyć back-end, który zajmie się autoryzacją i po autoryzacji pozwoli na korzystanie z aplikacji lub pobranie odpowiednich danych." to Ci mówię, że takie rozwiązania istnieją i w jaki sposób poradzono sobie z ich łamaniem. Co jest niezrozumiałe? Dobrym zabezpieczeniem jakichkolwiek aplikacji jest wirtualizacja kodu lub jego mutacja przez dedykowane narzędzia, bazujące np. na zmodyfikowanych wersjach LLVM z wbudowanymi mechanizmami mutacji i obfuskacji kodu (ale nie mówię o obfuscatorach, bo to róznica).
wiciu
Chodziło mi głównie o to, że piszesz same ogólniki. Ja np. nie wiem, jak zabrać się za coś takiego, o czym piszesz, ale może autor wątku to ogarnie, bo to w końcu jego problem, a nie mój ;-). Z szybkiego researchu wiem tylko tyle, że w przypadku Androida można użyć LLVM do tego, aby móc używać w projekcie kodu w C lub C++. Czyli Twój pomysł na rozwiązanie problemu, to hardkodowanie haseł w kodzie w C++, następnie jakaś bliżej nieokreślona customizacja LLVM i kompilacja projektu? Chciałem tylko zrozumieć, na czym konkretnie miałoby polegać takie zabezpieczenie.
Bartosz Wójcik
Ja napisałem o jakimś hardcodowaniu haseł w kodzie C++? Dedykowane narzędzia mutujące kod LLVM pozwalają na mutację C++, ObjectiveC i wszystkiego co łyknie kod, a wypluje pośredni kod LLVM zaraz przed kompilacją. Zabezpieczenie polega na mutacji kodu, zmianie codeflowa, ukrywaniu stałych i offsetów, dodanie elementów obfuskacji kodu, mutacji tych samych instrukcji np. do 3 różnych wersji wykonujących tą samą operację, wstawianie bloków sprawdzających sumy kontrolne w prologach i epilogach funkcji i wielu innych modyfikacji wyjściowego kodu.
0
wiciu napisał(a):

Podałeś mało szczegółów, ale nie widzę problemu, żeby coś takiego zrobić. Jeżeli aplikacja ma mieć aktywne funkcje po podaniu jakiegoś kodu, to najlepiej stworzyć back-end, który zajmie się autoryzacją i po autoryzacji pozwoli na korzystanie z aplikacji lub pobranie odpowiednich danych. Żeby to osiągnąć aplikacja przynajmniej raz będzie musiała się połączyć z internetem. Oczywiście należy pamiętać o tym, żeby aplikacja nie miała hardkodowanych żadnych haseł, kluczy, etc. Wtedy nawet, jak ktoś ją zdekompiluje i znajdzie adres serwera oraz end-point, to i tak bez znajomości wspomnianego kodu nie będzie mógł się autoryzować. Jest wiele metod autoryzacji. W przypadku aplikacji mobilnych, popularna jest metoda autoryzacji poprzez token, ale trzeba wtedy pamiętać o tym, żeby szyfrować połączenie.

Bardzo się cieszymy, że znasz dużo mądrych słów. Z pewnością jesteś szczęśliwym człowiekiem. Pomocy w tym zero. Dziękuję.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.