Android - zabezpieczenie aplikacji sprzedawanej poza Google Play

Odpowiedz Nowy wątek
2014-12-25 12:06
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?

Pozostało 580 znaków

2014-12-25 15:06
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źć.


Pozostało 580 znaków

2014-12-28 12:01
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?

Pozostało 580 znaków

2014-12-29 18:08
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, 2014-12-29 18:09
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 :) - Bartosz Wójcik 2014-12-30 01:03
@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. :-) - wiciu 2014-12-30 19:06
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). - Bartosz Wójcik 2014-12-30 22:19
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. - wiciu 2014-12-30 22:33
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. - Bartosz Wójcik 2014-12-30 22:39

Pozostało 580 znaków

2015-04-05 23:48
Mniej mądry.
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ę.

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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