Zajmuję się tworzeniem aplikacji przetwarzania płatności dla Androida i chcę, aby zapobiec hakerów dostępu do wszelkich zasobów, aktywów lub kod źródłowy z APK pliku.
Jeśli ktoś zmieni rozszerzenie .apk na .zip, może go rozpakować i łatwo uzyskać dostęp do wszystkich zasobów i zasobów aplikacji, a korzystając z dex2jar i dekompilatora Java, może również uzyskać dostęp do kodu źródłowego. Inżynieria wsteczna pliku APK systemu Android jest bardzo łatwa - więcej informacji zawiera pytanie Przepełnienie stosu Inżynieria wsteczna z pliku APK do projektu .
Korzystałem z narzędzia Proguard dostarczonego z zestawem Android SDK. Kiedy dokonuję inżynierii wstecznej pliku APK wygenerowanego przy użyciu podpisanego magazynu kluczy i Proguard, otrzymuję zaciemniony kod.
Jednak nazwy komponentów Androida pozostają niezmienione, a niektóre kody, takie jak kluczowe wartości używane w aplikacji, pozostają niezmienione. Zgodnie z dokumentacją Proguard narzędzie nie może zaciemniać komponentów wymienionych w pliku manifestu.
Teraz moje pytania to:
- Jak mogę całkowicie zapobiec inżynierii wstecznej APK na Androida? czy to możliwe?
- Jak mogę chronić wszystkie zasoby, zasoby i kod źródłowy aplikacji, aby hakerzy nie mogli w żaden sposób zhakować pliku APK?
- Czy istnieje sposób na uczynienie hakowania trudniejszym, a nawet niemożliwym? Co jeszcze mogę zrobić, aby chronić kod źródłowy w moim pliku APK?
źródło
Odpowiedzi:
AFAIK, nie ma żadnej sztuczki dla całkowitego uniknięcia inżynierii odwrotnej.
A także bardzo dobrze powiedziane przez @inazaruk: Cokolwiek zrobisz ze swoim kodem, potencjalny atakujący może go zmienić w dowolny sposób, który uzna za możliwy . Zasadniczo nie można chronić aplikacji przed modyfikacją. Wszelkie zabezpieczenia, które tam umieścisz, można wyłączyć / usunąć.
Możesz jednak wykonywać różne sztuczki, aby utrudniać hakowanie. Na przykład użyj zaciemnienia (jeśli jest to kod Java). Zwykle znacznie spowalnia to inżynierię wsteczną.
Jak wszyscy mówią i jak zapewne wiesz, nie ma 100% bezpieczeństwa. Ale miejscem, w którym można zacząć na Androida, który wbudował Google, jest ProGuard. Jeśli masz możliwość włączenia bibliotek współdzielonych , możesz dołączyć potrzebny kod do C ++ w celu zweryfikowania rozmiarów plików, integracji itp. Jeśli potrzebujesz dodać zewnętrzną bibliotekę natywną do folderu biblioteki APK na każdej kompilacji, możesz z niej skorzystać według poniższej sugestii.
Umieść bibliotekę w natywnej ścieżce biblioteki, która domyślnie ma wartość „libs” w folderze projektu. Jeśli zbudowałeś natywny kod dla celu „armeabi”, umieść go w libs / armeabi . Jeśli został zbudowany z armeabi-v7a, umieść go w libs / armeabi-v7a.
źródło
AFAIK, nie można już chronić plików w katalogu / res, ponieważ są one obecnie chronione.
Istnieją jednak kroki, które możesz podjąć, aby chronić swój kod źródłowy, a przynajmniej to, co robi, jeśli nie wszystko.
10000
monety. Zamiast zapisywać10000
bezpośrednio, zapisz go za pomocą algorytmu takiego jak((currency*2)+1)/13
. Zamiast10000
zapisywać1538.53846154
w SharedPreferences. Jednak powyższy przykład nie jest idealny i będziesz musiał opracować równanie, które nie straci waluty na błędach zaokrąglania itp.$200
. Zamiast wysyłać surową$200
wartość do serwera, wyślij serię mniejszych, predefiniowanych wartości, które się sumują$200
. Na przykład umieść plik lub tabelę na swoim serwerze, która równoważy słowa z wartościami. Więc powiedzmy, żeCharlie
odpowiada$47
iJohn
do$3
. Zamiast wysyłać$200
, możesz wysłaćCharlie
cztery razy iJohn
cztery razy. Na serwerze zinterpretuj ich znaczenie i dodaj je. Zapobiega to wysyłaniu przez hakera dowolnych wartości na serwer, ponieważ nie wiedzą, które słowo odpowiada jakiej wartości. Jako dodatkową miarę bezpieczeństwa możesz również mieć równanie podobne do punktu 3 i zmieniać słowa kluczowe con
kilka dni.Podsumowując, nie ma sposobu, aby chronić swoją aplikację w 100%. Możesz uczynić to trudniejszym, ale nie niemożliwym. Twój serwer internetowy może być zagrożony, haker może dowiedzieć się słów kluczowych, monitorując wiele transakcji i słowa kluczowe, które wysyłasz, haker może starannie przejrzeć źródło i dowiedzieć się, który kod jest atrapą.
Możesz tylko walczyć, ale nigdy nie wygrywać.
źródło
.so
plików, nie oznacza, że nie mogę odczytać zestawu :) Większość z nich wpada w tę samą pułapkę, po prostu zaciemnia zamiast odpowiednio się chronić. Zaciemnianie działa tylko wtedy, gdy atakujący nie jest wart czasu, więc jeśli zbudujesz coś na podstawie tych technik, lepiej mieć nadzieję, że nie będą one popularne, w przeciwnym razie wpadniesz w błąd, ponieważ nagle twoja baza kodu jest nie do utrzymania i potrzebuje ogromnych zmian.W żadnym momencie historii komputerów nigdy nie było możliwe zapobieganie inżynierii wstecznej oprogramowania, gdy przekazujesz jego roboczą kopię atakującemu. Ponadto, najprawdopodobniej nigdy nie będzie to możliwe .
Po zrozumieniu tego istnieje oczywiste rozwiązanie: nie zdradzaj napastnikowi swoich sekretów. Chociaż nie możesz chronić zawartości swojego pliku APK, możesz chronić wszystko, czego nie rozpowszechniasz. Zazwyczaj jest to oprogramowanie po stronie serwera używane do aktywacji, płatności, egzekwowania reguł i innych soczystych fragmentów kodu. Można chronić cenne aktywa przez nie dystrybuując ich w swoim pliku APK. Zamiast tego skonfiguruj serwer, który odpowiada na żądania z Twojej aplikacji, „wykorzystuje” zasoby (cokolwiek to może znaczyć), a następnie odsyła wynik z powrotem do aplikacji. Jeśli ten model nie działa w przypadku zasobów, które masz na myśli, możesz przemyśleć swoją strategię.
Ponadto, jeśli Twoim głównym celem jest zapobieganie piractwu aplikacji : nawet nie zawracaj sobie tym głowy. Spędziłeś już więcej czasu i pieniędzy na ten problem, niż jakikolwiek środek antypiracki mógłby kiedykolwiek mieć nadzieję, że cię uratuje. Zwrot z inwestycji w rozwiązanie tego problemu jest tak niski, że nawet nie ma sensu o tym myśleć.
źródło
Podstawy bezpieczeństwa technologii informatycznych opierają się na tych trzech podstawowych zasadach; jedynym naprawdę bezpiecznym komputerem jest ten zamknięty w sejfie, w klatce Farradaya, w stalowej klatce. Są komputery, które spędzają większość swojego życia serwisowego właśnie w tym stanie; raz w roku (lub krócej) generują klucze prywatne dla zaufanych głównych urzędów certyfikacji (przed wieloma świadkami z kamerami rejestrującymi każdy centymetr pokoju, w którym się znajdują).
Obecnie większość komputerów nie jest używana w tego typu środowiskach; są fizycznie poza domem, podłączone do Internetu za pośrednictwem bezprzewodowego kanału radiowego. Krótko mówiąc, są wrażliwe, podobnie jak ich oprogramowanie. Dlatego nie można im ufać. Istnieją pewne rzeczy, które komputery i ich oprogramowanie muszą wiedzieć lub robić, aby były użyteczne, ale należy zadbać o to, aby nigdy nie wiedziały lub nie robiły wystarczająco dużo, aby spowodować szkody (przynajmniej nie trwałe uszkodzenie poza granicami tego pojedynczego komputera ).
Już to wszystko wiedzieliście; dlatego próbujesz chronić kod swojej aplikacji. Ale na tym polega pierwszy problem; narzędzia zaciemniające mogą sprawić, że kod będzie bałaganem dla człowieka, który będzie próbował go przekopać, ale program wciąż musi działać; oznacza to, że faktyczny przepływ aplikacji i dane, z których korzysta, nie mają wpływu na zaciemnianie. Biorąc pod uwagę niewielką wytrwałość, atakujący może po prostu zaciemnić kod, a nie jest to nawet konieczne w niektórych przypadkach, w których to, na co patrzy, nie może być niczym innym, jak tym, czego szuka.
Zamiast tego powinieneś starać się upewnić, że atakujący nie może nic zrobić z twoim kodem, bez względu na to, jak łatwo jest mu uzyskać wyraźną kopię. Oznacza to, że nie ma zakodowanych na stałe tajemnic, ponieważ te sekrety nie są tajne, gdy tylko kod opuści budynek, w którym został opracowany.
Te kluczowe wartości, które zapisałeś na stałe, powinny zostać całkowicie usunięte z kodu źródłowego aplikacji. Zamiast tego powinni być w jednym z trzech miejsc; pamięć ulotna na urządzeniu, która jest trudniejsza (ale nadal nie niemożliwa) dla atakującego w celu uzyskania kopii offline; na stałe w klastrze serwerów, do którego kontrolujesz dostęp żelazną pięścią; lub w drugim magazynie danych niezwiązanym z urządzeniem lub serwerami, takim jak karta fizyczna lub w pamięci użytkownika (co oznacza, że ostatecznie znajdzie się w pamięci ulotnej, ale nie musi długo).
Rozważ następujący schemat. Użytkownik wprowadza dane uwierzytelniające aplikacji z pamięci do urządzenia. Musisz niestety ufać, że urządzenie użytkownika nie jest już zagrożone przez keyloggera lub trojana; najlepsze, co możesz zrobić w tym zakresie, to wdrożyć zabezpieczenia wieloskładnikowe, zapamiętując trudne do sfałszowania informacje identyfikujące o urządzeniach, z których korzystał użytkownik (MAC / IP, IMEI itp.), i zapewniając co najmniej jeden dodatkowy kanał przez którą próbę logowania na nieznanym urządzeniu można zweryfikować.
Poświadczenia, po ich wprowadzeniu, są zaciemniane przez oprogramowanie klienckie (przy użyciu bezpiecznego skrótu), a poświadczenia zwykłego tekstu są odrzucane; spełniły swój cel. Zaciemnione dane uwierzytelniające są przesyłane bezpiecznym kanałem do serwera uwierzytelnionego za pomocą certyfikatu, który ponownie je szyfruje w celu wygenerowania danych służących do weryfikacji ważności logowania. W ten sposób klient nigdy nie wie, co jest faktycznie porównywane z wartością bazy danych, serwer aplikacji nigdy nie zna poświadczeń w postaci zwykłego tekstu za tym, co otrzymuje do sprawdzania poprawności, serwer danych nigdy nie wie, w jaki sposób są tworzone dane przechowywane do sprawdzania poprawności, a mężczyzna środek widzi tylko bełkot, nawet jeśli bezpieczny kanał zostałby naruszony.
Po weryfikacji serwer przesyła z powrotem token kanałem. Token jest użyteczny tylko w bezpiecznej sesji, składa się z losowego szumu lub zaszyfrowanej (a zatem weryfikowalnej) kopii identyfikatorów sesji, a aplikacja kliencka musi wysłać ten token w tym samym kanale do serwera w ramach dowolnego żądania zrobić coś. Aplikacja kliencka zrobi to wiele razy, ponieważ nie może zrobić nic, co wiązałoby się z pieniędzmi, poufnymi danymi lub czymkolwiek innym, co samo w sobie mogłoby być szkodliwe; zamiast tego musi poprosić serwer o wykonanie tego zadania. Aplikacja kliencka nigdy nie zapisuje żadnych poufnych informacji w trwałej pamięci na samym urządzeniu, przynajmniej nie w postaci zwykłego tekstu; klient może poprosić serwer za pośrednictwem bezpiecznego kanału o klucz symetryczny do szyfrowania dowolnych danych lokalnych, które serwer zapamięta; w późniejszej sesji klient może poprosić serwer o ten sam klucz do odszyfrowania danych do użycia w pamięci ulotnej. Te dane też nie będą jedyną kopią; wszystko, co klient przechowuje, również powinno zostać przesłane w jakiejś formie na serwer.
Oczywiście powoduje to, że twoja aplikacja jest silnie uzależniona od dostępu do Internetu; urządzenie klienckie nie może wykonywać żadnej ze swoich podstawowych funkcji bez odpowiedniego połączenia i uwierzytelnienia przez serwer. Tak naprawdę nie różni się od Facebooka.
Komputer, którego chce atakujący, to Twój serwer, ponieważ to nie aplikacja / urządzenie klienckie może zarabiać na nim pieniądze lub powodować ból innych osób. W porządku; zyskujesz znacznie więcej za swoje pieniądze wydając pieniądze i starając się zabezpieczyć serwer, niż próbując zabezpieczyć wszystkich klientów. Serwer może znajdować się za wszelkiego rodzaju zaporami ogniowymi i innymi zabezpieczeniami elektronicznymi, a dodatkowo może być fizycznie zabezpieczony za stalą, betonem, kartą dostępu / pinami i 24-godzinnym monitoringiem wideo. Twój atakujący musiałby być naprawdę bardzo wyrafinowany, aby uzyskać jakikolwiek dostęp do serwera bezpośrednio, i powinieneś (powinnaś) o tym natychmiast wiedzieć.
Najlepsze, co może zrobić atakujący, to ukraść telefon użytkownika i dane uwierzytelniające oraz zalogować się na serwerze z ograniczonymi prawami klienta. Jeśli tak się stanie, podobnie jak utrata karty kredytowej, należy pouczyć legalnego użytkownika, aby zadzwonił pod numer 800 (najlepiej łatwy do zapamiętania, a nie na odwrocie karty, którą mieliby w torebce, portfelu lub teczce) skradzione obok urządzenia mobilnego) z dowolnego telefonu, do którego mają dostęp, co łączy je bezpośrednio z obsługą klienta. Podają, że ich telefon został skradziony, podają podstawowy unikatowy identyfikator, a konto jest zablokowane, wszelkie transakcje, które atakujący mógł przetworzyć, są wycofywane, a atakujący wraca do punktu wyjścia.
źródło
To nie jest możliwe
Gdy ktoś zmieni rozszerzenie .apk na .zip, a następnie po rozpakowaniu, ktoś może łatwo uzyskać wszystkie zasoby (z wyjątkiem Manifest.xml ), ale dzięki APKtool można również uzyskać prawdziwą zawartość pliku manifestu. Ponownie nie.
Znowu nie, ale możesz zapobiec do pewnego poziomu, to znaczy
Nawet z tym
Smali
ludzie mogą bawić się twoim kodem. Podsumowując, nie jest to MOŻLIWE.źródło
100% uniknięcie inżynierii wstecznej APK dla Androida nie jest możliwe, ale możesz użyć tych sposobów, aby uniknąć wyodrębnienia większej ilości danych, takich jak kod źródłowy, zasoby z APK i zasoby:
Użyj ProGuard, aby zaciemnić kod aplikacji
Użyj NDK przy użyciu C i C ++, aby umieścić rdzeń aplikacji i zabezpieczyć część kodu w
.so
plikachAby zabezpieczyć zasoby, nie dołączaj wszystkich ważnych zasobów do folderu zasobów z APK. Pobierz te zasoby w momencie pierwszego uruchomienia aplikacji.
źródło
Programiści mogą podjąć następujące kroki, aby zapobiec kradzieży pakietu APK,
najbardziej podstawowym sposobem jest użycie narzędzi takich jak
ProGuard
zaciemnianie kodu, ale do tej pory dość trudno było całkowicie uniemożliwić komuś dekompilację aplikacji.Słyszałem także o narzędziu HoseDex2Jar . Zatrzymuje
Dex2Jar
się, wstawiając nieszkodliwy kod do APK systemu Android, który dezorientuje, wyłączaDex2Jar
i chroni kod przed dekompilacją. Może to w jakiś sposób uniemożliwić hakerom dekompilację pliku APK w czytelny kod Java.Użyj aplikacji po stronie serwera, aby komunikować się z aplikacją tylko wtedy, gdy jest to potrzebne. Może to pomóc w zapobieganiu ważnym danym.
W ogóle nie możesz całkowicie chronić swojego kodu przed potencjalnymi hakerami. W jakiś sposób możesz utrudnić i nieco frustrujące zadanie w zakresie dekompilacji kodu. Jednym z najbardziej wydajnych sposobów jest pisanie w natywnym kodzie (C / C ++) i przechowywanie go jako skompilowane biblioteki.
źródło
Oto kilka metod, które możesz wypróbować:
źródło
Niemożliwy
Niemożliwy
Bardziej trudne - możliwe, ale w rzeczywistości będzie trudniejsze głównie dla przeciętnego użytkownika, który po prostu szuka go w przewodnikach po hakowaniu. Jeśli ktoś naprawdę chce zhakować twoją aplikację - zostanie ona zhakowana wcześniej czy później.
źródło
To jest niemożliwe
Programiści mogą podjąć takie kroki, jak użycie narzędzi takich jak ProGuard w celu zaciemnienia kodu, ale do tej pory dość trudno było całkowicie uniemożliwić komuś dekompilację aplikacji.
To naprawdę świetne narzędzie, które może zwiększyć trudność „odwrócenia” kodu, jednocześnie zmniejszając jego powierzchnię.
Zintegrowana obsługa ProGuard: ProGuard jest teraz wyposażony w Narzędzia SDK. Programiści mogą teraz zaciemniać swój kod jako zintegrowaną część kompilacji wydania.
Podczas badań dowiedziałem się o HoseDex2Jar . To narzędzie ochroni Twój kod przed dekompilacją, ale wydaje się, że nie jest możliwe całkowite zabezpieczenie kodu.
Niektóre przydatne linki, możesz się do nich odwoływać.
źródło
Głównym pytaniem tutaj jest to, że pliki dex mogą zostać zdekompilowane, a odpowiedź jest taka, że mogą one być „w pewnym sensie”. Istnieje deasembler jak dedexer i maĹ,ych .
ProGuard, właściwie skonfigurowany, zaciemni Twój kod. DexGuard, który jest komercyjną rozszerzoną wersją ProGuard, może nieco pomóc. Jednak Twój kod nadal można przekonwertować na smali, a programiści z doświadczeniem w inżynierii odwrotnej będą mogli dowiedzieć się, co robisz ze smali.
Może wybierz dobrą licencję i egzekwuj ją zgodnie z prawem w najlepszy możliwy sposób.
źródło
Twój klient powinien zatrudnić kogoś, kto wie, co robi, kto może podejmować właściwe decyzje i może cię mentorować.
Mówienie powyżej o tym, że masz możliwość zmiany systemu przetwarzania transakcji na backendie, jest absurdalne - nie powinno się pozwalać na takie zmiany architektoniczne, więc nie oczekuj, że będziesz w stanie.
Moje uzasadnienie w tym zakresie:
Ponieważ domena przetwarza płatności, można bezpiecznie założyć, że PCI DSS i / lub PA DSS (i potencjalne prawo stanowe / federalne) będą miały znaczenie dla Twojej firmy - aby zachować zgodność, musisz wykazać, że jesteś bezpieczny. Aby być niepewnym, dowiedz się (poprzez testowanie), że nie jesteś bezpieczny, a następnie naprawiaj, ponownie testuj itp., Dopóki bezpieczeństwo nie zostanie zweryfikowane na odpowiednim poziomie = droga, powolna, ryzykowna droga do sukcesu. Aby właściwie postępować, poważnie myśl, zaangażuj doświadczony talent w pracę, rozwijaj się w bezpieczny sposób, a następnie testuj, naprawiaj (mniej) itp. Aż do momentu, gdy można zweryfikować bezpieczeństwo na odpowiednim poziomie = niedrogie, szybkie, droga do sukcesu niskiego ryzyka.
źródło
Jako osoba, która intensywnie pracowała na platformach płatniczych, w tym w jednej aplikacji płatności mobilnych (MyCheck), powiedziałbym, że musisz przekazać to zachowanie serwerowi, nie należy przechowywać nazwy użytkownika ani hasła do procesora płatności (w zależności od tego, co to jest) na stałe w aplikacji mobilnej, to ostatnia rzecz, jakiej chcesz, ponieważ źródło można zrozumieć, nawet jeśli zaciemnisz kod.
Ponadto nie powinieneś przechowywać w aplikacji kart kredytowych ani tokenów płatności, wszystko powinno zostać ponownie przekazane do zbudowanej przez ciebie usługi, pozwoli ci to również później, być łatwiejszym zgodnym z PCI, a firmy wydające karty kredytowe wygrały nie oddychaj (jak u nas).
źródło
Pozostałe wyżej ocenione odpowiedzi są poprawne. Chcę tylko podać inną opcję.
W przypadku niektórych funkcji, które uważasz za ważne, możesz hostować formant WebView w swojej aplikacji. Funkcjonalność zostanie następnie zaimplementowana na twoim serwerze internetowym. Będzie wyglądać, jakby działał w Twojej aplikacji.
źródło
Jeśli chcemy uniemożliwić (prawie) odwrotną inżynierię, możemy umieścić aplikację na chipie wysoce odpornym na manipulacje, który wykonuje wszystkie wrażliwe rzeczy wewnętrznie i komunikuje się z pewnym protokołem, aby umożliwić sterowanie GUI na hoście. Nawet chipy odporne na manipulacje nie są w 100% odporne na pęknięcia; po prostu postawili poprzeczkę znacznie wyżej niż metody programowe. Oczywiście jest to niewygodne: aplikacja wymaga niewielkiej brodawki USB, która trzyma chip do włożenia do urządzenia.
Pytanie nie ujawnia motywacji, by tak zazdrośnie chronić tę aplikację.
Jeśli celem jest poprawa bezpieczeństwa metody płatności poprzez ukrycie wszelkich wad bezpieczeństwa, jakie może mieć aplikacja (znana lub inna), jest to całkowicie błędne. Bity wrażliwe na bezpieczeństwo powinny w rzeczywistości być typu open source, jeśli jest to wykonalne. Powinieneś uczynić to tak łatwym, jak to możliwe dla każdego badacza bezpieczeństwa, który przegląda twoją aplikację, aby znaleźć te bity i zbadać ich działanie oraz skontaktować się z tobą. Aplikacje płatnicze nie powinny zawierać żadnych osadzonych certyfikatów. To znaczy, nie powinna istnieć żadna aplikacja serwera, która ufa urządzeniu po prostu dlatego, że ma on stały certyfikat z fabryki. Transakcji płatniczej należy dokonać wyłącznie na podstawie danych uwierzytelniających użytkownika, przy użyciu prawidłowo zaprojektowanego protokołu uwierzytelniania typu end-to-end, co wyklucza zaufanie do aplikacji, platformy lub sieci itp.
Jeśli celem jest zapobieganie klonowaniu, poza tym chipem odpornym na manipulacje, nie można nic zrobić, aby zabezpieczyć program przed inżynierią wsteczną i kopiowaniem, tak aby ktoś włączył do swojej aplikacji kompatybilną metodę płatności, dając rośnie do „nieautoryzowanych klientów”. Istnieją sposoby, aby utrudnić rozwój nieautoryzowanych klientów. Jednym z nich byłoby utworzenie sum kontrolnych na podstawie migawek pełnego stanu programu: dla wszystkich zmiennych stanu. GUI, logika, cokolwiek. Program do klonowania nie będzie miał dokładnie tego samego stanu wewnętrznego. Jasne, jest to maszyna stanu, która ma podobne widoczne z zewnątrz przejścia stanu (co można zaobserwować na wejściach i wyjściach), ale prawie nie w tym samym stanie wewnętrznym. Aplikacja serwera może przesłuchać program: jaki jest Twój szczegółowy stan? (to znaczy daj mi sumę kontrolną wszystkich zmiennych wewnętrznych stanu). Można to porównać do fałszywego kodu klienta, który wykonuje się na serwerze równolegle, przechodząc przez oryginalne przejścia stanu. Klon strony trzeciej będzie musiał powtórzyć wszystkie odpowiednie zmiany stanu oryginalnego programu, aby uzyskać prawidłowe odpowiedzi, które utrudnią jego rozwój.
źródło
Uzgodniono z @Muhammad Saqib tutaj: https://stackoverflow.com/a/46183706/2496464
I @Mumair daje dobre kroki początkowe: https://stackoverflow.com/a/35411378/474330
Zawsze można bezpiecznie założyć, że wszystko, co rozpowszechniasz na urządzeniu użytkownika, należy do użytkownika. Prosty i prosty. Możesz być w stanie użyć najnowszych narzędzi i procedur do szyfrowania swoich własności intelektualnych, ale nie ma sposobu, aby powstrzymać określoną osobę przed „zbadaniem” twojego systemu. I nawet jeśli obecna technologia może im utrudnić uzyskanie niechcianego dostępu, jutro może być jakiś łatwy sposób, a nawet następna godzina!
Tak oto pojawia się równanie:
Nawet w tak prostej jak ekonomia w grze. (Zwłaszcza w grach! Jest tam więcej „wyrafinowanych” użytkowników, a luki pojawiają się w kilka sekund!)
Jak jesteśmy bezpieczni?
Większość, jeśli nie wszystkie, naszych systemów przetwarzania kluczy (i oczywiście bazy danych) znajdujących się po stronie serwera. Pomiędzy klientem a serwerem leży szyfrowana komunikacja, sprawdzanie poprawności itp. To jest pomysł cienkiego klienta.
źródło
Sugeruję, aby spojrzeć na Chroń aplikacje przed atakami . Jest to usługa komercyjna, ale firma mojego przyjaciela z niej skorzystała i chętnie z niej korzysta.
źródło
Schemat podpisu APK v2 w systemie Android N
Klasa PackageManager obsługuje teraz weryfikację aplikacji przy użyciu schematu sygnatur APK v2. Schemat podpisu APK v2 to schemat podpisu całego pliku, który znacznie poprawia szybkość weryfikacji i wzmacnia gwarancje integralności poprzez wykrywanie wszelkich nieautoryzowanych zmian w plikach APK.
Aby zachować zgodność z poprzednimi wersjami, pakiet APK musi zostać podpisany za pomocą schematu podpisu v1 (schemat podpisu JAR) przed podpisaniem za pomocą schematu podpisu v2. W przypadku schematu podpisu v2 weryfikacja kończy się niepowodzeniem, jeśli podpiszesz pakiet APK dodatkowym certyfikatem po podpisaniu przy użyciu schematu v2.
Obsługa schematu podpisów APK v2 będzie dostępna później w N Preview Preview.
http://developer.android.com/preview/api-overview.html#apk_signature_v2
źródło
Nie ma sposobu, aby całkowicie uniknąć inżynierii wstecznej pakietu APK. Aby chronić zasoby aplikacji, zasoby, możesz użyć szyfrowania.
źródło
Zasadniczo nie jest to możliwe. To nigdy nie będzie możliwe. Jest jednak nadzieja. Możesz użyć obfuscatora , aby niektóre typowe ataki były o wiele trudniejsze do przeprowadzenia, w tym:
a.a
)Jestem pewien, że są inni, ale to są główne. Pracuję dla firmy o nazwie PreEmptive Solutions na obfuscator .NET . Mają także obfuscator Java, który działa również na Androida, a także DashO .
Jednak zaciemnianie zawsze ma swoją cenę. Warto zauważyć, że wydajność jest zwykle gorsza i zwykle zajmuje to trochę więcej czasu w związku z wydaniami. Jeśli jednak twoja własność intelektualna jest dla Ciebie niezwykle ważna, zazwyczaj jest tego warta.
W przeciwnym razie jedynym wyborem jest uczynienie go tak, aby aplikacja na system Android po prostu przechodziła na serwer, na którym znajduje się cała logika aplikacji. Ma to swoją część problemów, ponieważ oznacza to, że użytkownicy muszą mieć połączenie z Internetem, aby móc korzystać z Twojej aplikacji.
Problemem jest nie tylko Android. To problem w każdym sklepie z aplikacjami. To tylko kwestia tego, jak trudno jest dostać się do pliku pakietu (na przykład nie sądzę, że jest to bardzo łatwe na iPhone'ach, ale nadal jest możliwe).
źródło
Niemożliwe jest całkowite uniknięcie RE, ale czyniąc je bardziej złożonymi wewnętrznie, utrudniasz atakującym wyraźne działanie aplikacji, co może zmniejszyć liczbę wektorów ataku.
Jeśli aplikacja obsługuje bardzo wrażliwe dane, istnieją różne techniki, które mogą zwiększyć złożoność inżynierii wstecznej kodu. Jedną z technik jest użycie C / C ++ w celu ograniczenia łatwej manipulacji środowiskiem wykonawczym przez atakującego. Istnieje wiele bibliotek C i C ++, które są bardzo dojrzałe i łatwe do zintegrowania z JNI. Osoba atakująca musi najpierw ominąć ograniczenia debugowania, aby zaatakować aplikację na niskim poziomie. To dodatkowo komplikuje atak. Aplikacje na Androida powinny mieć Androida: debuggable = ”false” ustawiony w manifeście aplikacji, aby zapobiec łatwym manipulacjom w czasie wykonywania przez atakującego lub złośliwe oprogramowanie.
Sprawdzanie śledzenia - aplikacja może ustalić, czy jest obecnie śledzona przez debugger lub inne narzędzie do debugowania. W przypadku śledzenia aplikacja może wykonać dowolną liczbę możliwych akcji reakcji na atak, takich jak odrzucenie kluczy szyfrowania w celu ochrony danych użytkownika, powiadomienie administratora serwera lub inne tego typu odpowiedzi w celu obrony. Można to ustalić, sprawdzając flagi statusu procesu lub stosując inne techniki, takie jak porównanie wartości zwracanej przez ptrace attach, sprawdzenie procesu nadrzędnego, debuggerów czarnej listy na liście procesów lub porównanie znaczników czasu w różnych miejscach programu.
Optymalizacje - Aby ukryć zaawansowane obliczenia matematyczne i inne typy skomplikowanej logiki, użycie optymalizacji kompilatora może pomóc zaciemnić kod obiektu, aby atakujący nie mógł go łatwo zdemontować, co utrudnia osobie atakującej zrozumienie konkretnego kodu. W Androidzie można to łatwiej osiągnąć, korzystając z bibliotek kompilowanych natywnie z NDK. Ponadto użycie Obfuscatora LLVM lub dowolnego SDK-a zapewniającego ochronę zapewni lepsze zaciemnianie kodu maszynowego.
Usuwanie plików binarnych - Usuwanie własnych plików binarnych to skuteczny sposób na zwiększenie czasu i poziomu umiejętności wymaganego od atakującego w celu wyświetlenia wyglądu funkcji niskiego poziomu aplikacji. Po usunięciu pliku binarnego tablica symboli pliku binarnego jest usuwana, dzięki czemu osoba atakująca nie może łatwo debugować ani odtwarzać kodu źródłowego aplikacji. Możesz odwoływać się do technik używanych w systemach GNU / Linux, takich jak sstriping lub używanie UPX.
I w końcu musisz zdawać sobie sprawę z zaciemnienia i narzędzi takich jak ProGuard.
źródło
Jeśli Twoja aplikacja jest wrażliwa, powinieneś rozważyć część przetwarzania płatności po stronie serwera. Spróbuj zmienić algorytmy przetwarzania płatności. Użyj aplikacji na Androida tylko do zbierania i wyświetlania informacji o użytkowniku (tj. Saldo konta), a nie przetwarzaj płatności w ramach kodów Java, wyślij to zadanie na serwer za pomocą bezpiecznego protokołu SSL z zaszyfrowanymi parametrami. Utwórz w pełni zaszyfrowany i bezpieczny interfejs API do komunikacji z serwerem.
Oczywiście można go również zhakować i nie ma to nic wspólnego z ochroną kodów źródłowych, ale rozważ to jako kolejną warstwę bezpieczeństwa, która utrudni hakerom oszukiwanie Twojej aplikacji.
źródło
Czy chipy TPM (Trusted Platform Module) nie powinny za Ciebie zarządzać chronionym kodem? Stają się one powszechne na komputerach PC (zwłaszcza Apple) i mogą już istnieć w dzisiejszych układach smartfonów. Niestety nie ma jeszcze interfejsu API systemu operacyjnego, który mógłby z niego korzystać. Mamy nadzieję, że Android doda obsługę tego jednego dnia. To także klucz do czyszczenia DRM treści (nad którym Google pracuje dla WebM).
źródło
webview
ochronę zasobów + kodu na serwerzeWiele podejść; to oczywiste, że musisz poświęcić się wydajności i bezpieczeństwu
źródło
Widzę tę dobrą odpowiedź w tym wątku. Oprócz tego możesz użyć Facebooka
redex
do optymalizacji kodu. Redex działa na.dex
poziomie, którym proguard działa jako.class
poziom.źródło
100% bezpieczeństwa kodu źródłowego i zasobów nie jest możliwe w Androidzie. Ale możesz nieco utrudnić inżynierowi wstecznemu. Więcej informacji na ten temat można znaleźć w poniższych linkach:
Odwiedź Bezpieczne zapisywanie stałych wartości i https://www.agicent.com/blog/mobile-app-security-best-practices/
źródło
Plik APK jest chroniony algorytmem SHA-1 . Możesz zobaczyć niektóre pliki w folderze META-INF w APK. Jeśli wyodrębnisz dowolny plik APK, zmienisz dowolną jego zawartość i skompresujesz go ponownie, a po uruchomieniu tego nowego pliku APK na komputerze z systemem Android nie będzie on działać, ponieważ skróty SHA-1 nigdy nie będą pasować.
źródło
Chociaż zgadzam się, że nie ma 100% rozwiązania, które chroniłoby twój kod, wersja 3 HoseDex2Jar jest już dostępna, jeśli chcesz spróbować.
źródło
Narzędzie: Używając Proguard w twojej aplikacji, można ograniczyć do inżynierii wstecznej twojej aplikacji
źródło
Wiedziałem, że niektóre aplikacje bankowe używają DexGuard, który zapewnia zaciemnianie, a także szyfrowanie klas, ciągów, zasobów, plików zasobów i bibliotek rodzimych
https://www.guardsquare.com/en/products/dexguard
źródło