Jak uniknąć inżynierii wstecznej pliku APK?

764

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:

  1. Jak mogę całkowicie zapobiec inżynierii wstecznej APK na Androida? czy to możliwe?
  2. Jak mogę chronić wszystkie zasoby, zasoby i kod źródłowy aplikacji, aby hakerzy nie mogli w żaden sposób zhakować pliku APK?
  3. 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?
sachin003
źródło
120
Wygląda na to, że korzystasz z „bezpieczeństwa przez zaciemnienie”, jeśli Twój system przetwarzania płatności opiera się na działaniu klienta pozostającego tajnym.
PeterJ
43
Czy zastanawiałeś się nad napisaniem ważnych części kodu w C / C ++ i dodaniem ich jako skompilowanej biblioteki? Można je rozłożyć na kod asemblera, ale inżynieria wsteczna dużej biblioteki z asemblera jest bardzo czasochłonna.
Leo
60
Witamy w podstawowej kwestii tworzenia dowolnego zasobu cyfrowego. Hakerzy mogą zejść do poziomu instrukcji maszynowych, więc jeśli komputer może odczytać plik, może zostać zhakowany w trybie otwartym / skopiowany, brak zaciemnienia lub DRM może całkowicie zatrzymać określonego hakera. Jeśli potrzebujesz bezpieczeństwa, upewnij się, że klucze prywatne nigdy nie znajdują się w źródle i wiedz na etapie projektowania, że ​​tylko izolacja (zdalny i / lub dedykowany sprzęt) może je kiedykolwiek chronić.
Keith
16
Pamiętaj, że w zależności od tego, co robi Twoja aplikacja do przetwarzania płatności, mogą obowiązywać przepisy prawne i prawne, które wpływają na twoją aplikację i mogą potencjalnie narazić Cię na surowe kary: zobacz Zgodność z PCI, zaczynając od pcicomplianceguide.org/pcifaqs.php#11 .
bloopletech,

Odpowiedzi:

371

 1. Jak mogę całkowicie uniknąć inżynierii wstecznej pakietu APK na Androida? czy to możliwe?

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ąć.

 2. Jak mogę chronić wszystkie zasoby, zasoby i kod źródłowy aplikacji, aby hakerzy nie mogli w żaden sposób zhakować pliku APK?

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ą.

 3. 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?

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.

<project>/libs/armeabi/libstuff.so
Bhavesh Patadiya
źródło
1
Do transakcji płatniczej użyłem standardu ISO 8585, w tej chwili schemat tego standardu jest w parze klucz-wartość za pomocą kolekcji Java HashMap, a gdy wykonam inżynierii wstecznej w apk, dostanę cały schemat. Czy można uniknąć otrzymania schematu narażone za pomocą inżynierii odwrotnej. Czy Twoja ostatnia sugestia dotycząca bibliotek Share może być przydatna w tym przypadku? Doy, masz jakieś linki, dzięki czemu mogę uzyskać dostęp do bibliotek udostępniania w Androidzie.
sachin003
4
co powiesz na szyfrowanie swoich ciągów w kodzie i odszyfrowywanie ich w czasie wykonywania? Jeśli przeprowadzasz deszyfrowanie na zdalnym serwerze, jak sugerowały inne osoby, nie masz problemu, że klucz deszyfrujący znajduje się w źródłach.
kutschkem
tak, szyfrowanie jest dobre, ale nie jest pewne, że nie zostanie zhakowany. Jeśli szyfruję ciąg w celu ich odszyfrowania, potrzebuję jednego unikalnego identyfikatora w kodzie. a jeśli ktokolwiek będzie w stanie go zdekompilować, bardzo łatwo będzie uzyskać identyfikator Unique.
Bhavesh Patadiya
dlaczego dodałeś edytowane rzeczy? to wszystko jest normalne.
Mohammed Azharuddin Shaikh
@hotveryspicy: tak, usunąłem teraz znak „edytowałem” z odpowiedzi. zedytowałem odpowiedź, ponieważ chciał dowiedzieć się więcej o tym, jak przydatne są biblioteki Share w tym przypadku.
Bhavesh Patadiya
126

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.

  1. Użyj narzędzi takich jak ProGuard. Spowodują one zaciemnienie kodu i utrudnią odczytanie po dekompilacji, jeśli nie niemożliwe.
  2. Przenieś najbardziej krytyczne części usługi z aplikacji do usługi internetowej, ukrytej za językiem serwera, takim jak PHP. Na przykład, jeśli masz algorytm, którego napisanie zajęło ci milion dolarów. Oczywiście nie chcesz, aby ludzie wykradali go z Twojej aplikacji. Przenieś algorytm i pozwól mu przetwarzać dane na zdalnym serwerze, a następnie użyj aplikacji, aby po prostu dostarczyć dane. Lub użyj NDK, aby zapisać je natywnie w plikach .so, które są znacznie mniej podatne na dekompilację niż apki. Nie sądzę, aby dekompilator plików .so istniał na razie (a nawet gdyby tak było, nie byłby tak dobry jak dekompilatory Java). Ponadto, jak wspomniano w komentarzach @nikolay, należy używać protokołu SSL podczas interakcji między serwerem a urządzeniem.
  3. Podczas przechowywania wartości na urządzeniu nie przechowuj ich w surowym formacie. Na przykład, jeśli masz grę i przechowujesz ilość waluty gry, którą użytkownik ma w SharedPreferences. Załóżmy, że to 10000monety. Zamiast zapisywać 10000bezpośrednio, zapisz go za pomocą algorytmu takiego jak ((currency*2)+1)/13. Zamiast 10000zapisywać 1538.53846154w 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.
  4. Możesz zrobić podobnie dla zadań po stronie serwera. Teraz na przykład weźmy twoją aplikację do przetwarzania płatności. Załóżmy, że użytkownik musi dokonać płatności $200. Zamiast wysyłać surową $200wartość 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, że Charlieodpowiada $47i Johndo $3. Zamiast wysyłać $200, możesz wysłać Charliecztery razy iJohncztery 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 co nkilka dni.
  5. Na koniec możesz wstawić do aplikacji losowy, bezużyteczny kod źródłowy, aby haker szukał igły w stogu siana. Wstaw losowe klasy zawierające fragmenty z Internetu lub po prostu funkcje do obliczania losowych rzeczy, takich jak sekwencja Fibonacciego. Upewnij się, że te klasy się kompilują, ale nie są używane przez rzeczywistą funkcjonalność aplikacji. Dodaj wystarczającą liczbę fałszywych klas, a hakerowi trudno będzie znaleźć Twój prawdziwy kod.

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ć.

Raghav Sood
źródło
136
Zamiast wykonywać sztuczki z wartościami wysyłanymi na serwer, użyj protokołu SSL i sprawdź poprawność certyfikatu serwera. Bezpieczeństwo przez zaciemnienie jest ogólnie złym pomysłem.
Nikolay Elenkov
48
możesz wstawić losowy, bezużyteczny kod źródłowy do swojej aplikacji . To też nie może pomóc. Spowoduje to tylko powiększenie aplikacji, a jednocześnie utrudni jej utrzymanie.
Anirudh Ramanathan
4
Możesz także sfałszować użycie niepotrzebnego kodu i wysłać dane do serwera, który je odrzuci. Może fałszywe bezpieczeństwo, ale ból w dupie dla potencjalnego hakera, prawda?
Benoit Duffez
19
Jeśli twój algorytm jest wart milion dolarów, to tylko dlatego, że nie ma dekompilatora .soplikó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.
Phoshi,
23
Nie rozumiem, dlaczego ta odpowiedź ma tak wysoki wynik. 3. i 4. dla jednego są po prostu głupie i nie będą stanowić żadnego zabezpieczenia.
Matti Virkkunen,
117

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ć.

tylerl
źródło
21
Pierwszy akapit jest najlepszą odpowiedzią. Jeśli atakujący kontroluje sprzęt, zawsze będzie w stanie jakoś pokonać oprogramowanie. Wszystko, co naprawdę musi być chronione, musi pozostać na sprzęcie, który kontrolujesz, to takie proste. Ostatni akapit, dotyczący ROI, również jest na miejscu.
Daniel Pryden,
88

Pierwsza zasada bezpieczeństwa aplikacji: każda maszyna, na którą atakujący uzyskuje nieograniczony fizyczny lub elektroniczny dostęp, należy teraz do twojego atakującego, niezależnie od tego, gdzie faktycznie jest lub za co zapłaciłeś.

Druga zasada bezpieczeństwa aplikacji: każde oprogramowanie, które wykracza poza fizyczne granice, w którym atakujący nie może przeniknąć, należy teraz do atakującego, niezależnie od tego, ile czasu spędziłeś na jego kodowaniu.

Trzecia zasada: wszelkie informacje, które opuszczają te same fizyczne granice, których atakujący nie może przeniknąć, należą teraz do atakującego, bez względu na to, jak cenne są dla Ciebie.

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.

KeithS
źródło
1
idealna odpowiedź !! Po prostu uwielbiam twój sposób na uzyskanie danych z serwera za pomocą jakiegoś zaszyfrowanego tokena, myślę, że po tym jest prawie niemożliwe do odkodowania.
dharam
Wiem, że to trochę za późno, ale co z dostępem do części serwera. Usługi takie jak Microsoft azure zapewniają coś takiego w celu uzyskania dostępu do swojego serwera: MobileServiceClient mClient = nowy MobileServiceClient („MobileServiceUrl”, // Zamień na powyższy adres URL witryny „AppKey”, // zastąp to kluczem aplikacji to) i praktycznie każdy, kto ma dostęp do tego, może uzyskać dostęp do swojego serwera, edytuj go
edwinj
@edwinj - Nie ma problemu w informatyce, którego nie można rozwiązać za pomocą innej warstwy pośredniej. Twój fragment kodu stanowi podstawowy pomysł na dostęp do mobilnej usługi klienta Azure; zapewnia podstawowy poziom bezpieczeństwa przed „przejazdami” przednich drzwi Microsoftu. Możesz z kolei dodać dodatkowe warstwy, takie jak wymaganie klucza sesji (w zasadzie czym jest zaszyfrowany token) przy każdym wywołaniu usługi, a aby uzyskać ten klucz, muszą najpierw uwierzytelnić się przy użyciu kombinacji wiedzy na temat poświadczeń i schematu szyfrowania.
KeithS
1
Jedna z najlepszych odpowiedzi.
debo.stackoverflow
64

 1. Jak mogę całkowicie uniknąć inżynierii wstecznej pakietu APK na Androida? czy to możliwe?

To nie jest możliwe

 2. Jak mogę chronić wszystkie zasoby, zasoby i kod źródłowy aplikacji, aby hakerzy nie mogli w żaden sposób zhakować pliku APK?

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.

 3. 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?

Znowu nie, ale możesz zapobiec do pewnego poziomu, to znaczy

  • Pobierz zasób z sieci i wykonaj proces szyfrowania
  • Użyj wstępnie skompilowanej biblioteki natywnej (C, C ++, JNI, NDK)
  • Zawsze wykonuj haszowanie ( klawisze MD5 / SHA lub dowolną inną logikę)

Nawet z tym Smaliludzie mogą bawić się twoim kodem. Podsumowując, nie jest to MOŻLIWE.

Mohammed Azharuddin Shaikh
źródło
7
@TrevorBoydSmith: Szyfrowanie niewiele pomaga, gdy system operacyjny jest open source i można go rootować. System potrzebuje klucza, aby odszyfrować plik APK i uruchomić pliki. A jeśli system ma klucz i mam nieograniczony dostęp do systemu, to wiem, gdzie znaleźć klucz i mogę się do niego dostać. To znaczy, że teraz mam też klucz .
cHao 13.12.12
4
@TrevorBoydSmith: Jednak część „jak to zrobić” zabija cały pomysł. Po prostu nie ma możliwości bezpośredniego wykonania zaszyfrowanego kodu; w pewnym momencie odszyfrowany kod musi być dostępny. Co oznacza (1), że musi istnieć klucz (do którego ja, jako root, prawdopodobnie mam dostęp), i (2) być może uda mi się znaleźć czystą kopię w pamięci RAM i po prostu nie będę się martwić szyfrowaniem.
cHao
3
@TrevorBoydSmith: Problem polega na tym, że w tym przypadku po prostu nie można podnieść kosztów na tyle, aby nie było to opłacalne. Nie mówimy tu o kluczach do brutalnego wymuszania; mówimy o tym, że już je mamy - system operacyjny musi mieć klucze, a my mamy system operacyjny. Jedynym sposobem, aby to naprawić, byłoby wyłączenie systemu operacyjnego. Powodzenia z tym; nawet Apple nie może sobie z tym poradzić. :)
cHao
3
@TrevorBoydSmith: Nie sądzę, że podniesienie kosztów w ogóle jest niemożliwe. Uważam (i mówię) w szczególności , że twoja sugestia jest niemożliwa - ponieważ jest . MATLAB nie jest Androidem i ma pewne swobody, których Android nie ma. W szczególności ma zaciemnienie na boku; o wiele trudniej jest ukryć klucz szyfrujący. Android nie może tego zrobić. Każdy, kto ma kod źródłowy, będzie wiedział, gdzie chują się klucze, i będzie miał narzędzie do ich odzyskania w ciągu 10 minut od ogłoszenia funkcji. Nie tylko można to zrobić; to wręcz banalne .
cHao
6
@TrevorBoydSmith: Niczego nie nalegałem. Upieram się przy tym, że statyczne, zmieniające się, ruchome itp. Nie mają znaczenia . W systemie operacyjnym open source samo szyfrowanie nie chroni kodu przed nikim, kto mógłby go poddać inżynierii wstecznej. Ponieważ potrafię odczytać kod odszyfrowujący, niezależnie od tego, w jaki sposób klucz jest pozyskiwany, używany i / lub przechowywany, widzę, jak to zrobiłeś i powielasz - nawet łatwiej niż mógłbym odwrócić niektóre super tajne kod aplikacji.
cHao
37

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:

  1. Użyj ProGuard, aby zaciemnić kod aplikacji

  2. Użyj NDK przy użyciu C i C ++, aby umieścić rdzeń aplikacji i zabezpieczyć część kodu w .soplikach

  3. Aby zabezpieczyć zasoby, nie dołączaj wszystkich ważnych zasobów do folderu zasobów z APK. Pobierz te zasoby w momencie pierwszego uruchomienia aplikacji.

ρяσсρєя K
źródło
7
Trzeci naprawdę ułatwia pracę atakującym. Wąchanie komunikacji sieciowej jest łatwiejsze niż inżynieria odwrotna.
totten
Aby rozwiązać problem trzeciego, można zaszyfrować pobraną zawartość i / lub użyć szyfrowanego połączenia (np. SSL / TLS)
Stradivari,
1
Szyfrowanie połączenia chroni osoby, które wąchają lub modyfikują ruch. W przypadku, gdy sam użytkownik jest złośliwy (tj. Ma twój apk i próbuje go zhakować), nadal będzie pobierał zawartość za pomocą twojej aplikacji, wydobywając zasoby jako użytkownik root; ale tak, to pomaga w walce z prostymi atakami wąchania.
Kevin Lee
Dodatkowo: 4) użyj dexguard dla większego zaciemnienia, ale jest płatne 5) użyj pliku OBB do pobrania zasobów w czasie pobierania aplikacji, pomoże to również zmniejszyć rozmiar aplikacji
Ashok Kumar
35

Programiści mogą podjąć następujące kroki, aby zapobiec kradzieży pakietu APK,

  • najbardziej podstawowym sposobem jest użycie narzędzi takich jak ProGuardzaciemnianie 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 Dex2Jarsię, wstawiając nieszkodliwy kod do APK systemu Android, który dezorientuje, wyłącza Dex2Jari 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.

Sahil Mahajan Mj
źródło
3
HoseDex2Jar jest prawie bezużyteczny. To tylko „myli” dex2jar i może być łatwo zablokowane. smali / apktool itp. działają dobrze z „ukrytymi” pakietami APK.
Nikolay Elenkov
@NikolayElenkov Czy wiesz, jak działa HoseDex2Jar? Czego użyli, aby uniknąć lub pomylić dex2jar. Ponieważ nie mogę przesłać pliku apk do sieci, aby użyć HoseDex2Jar. Jeśli mogę zrobić coś takiego jak HoseDex2Jar, aby pomylić dex2jar, wtedy trudno będzie włamać się za pomocą narzędzia dex2jar.
sachin003
1
Być może źle zrozumiałeś mój punkt: to, co robi HoseDex2Jar, to przepakowanie twojego APK, aby popularne narzędzie dex2jar nie mogło (po wyjęciu z pudełka) odwrócić go. Jednak inne narzędzia potrafią i ogólnie bardzo łatwo jest go pokonać. Nie ma sensu z niego korzystać. Nikt nie wspomniał o Dexguardzie I (autor ProGuard; nie za darmo), ale na to patrzy. Robi jeszcze coś więcej niż „zwykłe” zaciemnianie.
Nikolay Elenkov
C ++ nigdy nie może być odwrócony? to trudne, ale możliwe. i istnieją narzędzia, które mogą ci w tym pomóc, takie jak hex-rays.com/products/decompiler/index.shtml (tak, mają wersję ARM. nie jest to takie trudne do zdobycia).
dkzm
tak, @VikartiAnatra: Wspomniałem również Jakoś możesz to utrudnić
Sahil Mahajan Mj
24

Oto kilka metod, które możesz wypróbować:

  1. Używaj zaciemniania i narzędzi takich jak ProGuard .
  2. Zaszyfruj część źródła i danych.
  3. Użyj zastrzeżonej wbudowanej sumy kontrolnej w aplikacji, aby wykryć naruszenie.
  4. Wprowadź kod, aby uniknąć ładowania do debuggera, tzn. Pozwól aplikacji wykryć debugger i wyjść / zabić debugger.
  5. Oddziel uwierzytelnianie jako usługę online.
  6. Korzystaj z różnorodności aplikacji
  7. Użyj techniki drukowania odcisków palców np. Do podpisów sprzętowych urządzeń z innego podsystemu przed uwierzytelnieniem urządzenia.
Shan
źródło
23

 1. Jak mogę całkowicie uniknąć inżynierii wstecznej pakietu APK na Androida? czy to możliwe?

Niemożliwy

 2. Jak mogę chronić wszystkie zasoby, zasoby i kod źródłowy aplikacji, aby hakerzy nie mogli w żaden sposób zhakować pliku APK?

Niemożliwy

 3. 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?

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.

Janot
źródło
22

 1. Jak mogę całkowicie uniknąć inżynierii wstecznej pakietu APK na Androida? czy to możliwe?

To jest niemożliwe

 2. Jak mogę chronić wszystkie zasoby, zasoby i kod źródłowy aplikacji, aby hakerzy nie mogli w żaden sposób zhakować pliku APK?

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.

 3. 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?

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ć.

RobinHood
źródło
21

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.

Abhishek Sabbarwal
źródło
4
Na marginesie (wyłączenie odpowiedzialności: IANAL) - licencja nie chroni aplikacji we wszystkich jurysdykcjach we wszystkich okolicznościach (na przykład w niektórych krajach w Europie zezwala się na demontaż w celu zwiększenia kompatybilności).
Maciej Piechotka,
12

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.

straya
źródło
8

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).

Itai Sagi
źródło
7

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.

Sarel Botha
źródło
@Sarel Botha tak dla ekranów IMP Użyłem już widoku internetowego i tak jest to również jeden ze sposobów zapewnienia bezpieczeństwa, akceptuję twoją odpowiedź.
sachin003
7

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.

Kaz
źródło
7

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:

When it comes to money, we always assume that client is untrusted.

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.

Zennichimaro
źródło
4

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

tiagolr
źródło
2
Podpis APK v2 zapobiega jedynie manipulowaniu zasobami, ale nie utrudnia inżynierii wstecznej…
Louis CAD
1
Ponadto możesz po prostu usunąć podpis i ponownie go podpisać. Podpis v2 to tylko blok danych w pliku APK.
Robert
4

Nie ma sposobu, aby całkowicie uniknąć inżynierii wstecznej pakietu APK. Aby chronić zasoby aplikacji, zasoby, możesz użyć szyfrowania.

  • Szyfrowanie utrudni korzystanie z niego bez deszyfrowania. Wybranie jakiegoś silnego algorytmu szyfrowania utrudni pękanie.
  • Dodanie trochę fałszywego kodu do głównej logiki, aby utrudnić złamanie.
  • Jeśli potrafisz napisać swoją krytyczną logikę w dowolnym języku ojczystym, co z pewnością utrudni dekompilację.
  • Korzystanie z dowolnych ram bezpieczeństwa innych firm, takich jak Quixxi
niezmienny
źródło
3

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:

  1. Zmiana nazw metod / klas (więc w dekompilatorze dostajesz typy takie jak a.a)
  2. Przepływ kontroli zaciemniający (więc w dekompilatorze kod jest bardzo trudny do odczytania)
  3. Szyfrowanie ciągów i ewentualnie zasobów

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).

Earlz
źródło
Niestety, jeśli ktoś włamie się do klienta (aplikacji), będzie mógł zobaczyć format komunikacji i stworzyć własny serwer :(
Jocky Doe
3

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.

Sanket Prabhu
źródło
3

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.

Muhammad Saqib
źródło
2

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).

robUx4
źródło
2

Nic nie jest bezpieczne, gdy położysz je na ręce użytkowników końcowych, ale niektóre powszechne praktyki mogą utrudnić kradzież danych.

  • Umieść swoją główną logikę (algorytmy) po stronie serwera.
  • Komunikuj się z serwerem i klientem; upewnij się, że komunikacja między serwerem a klientem jest zabezpieczona przez SSL lub HTTPS; lub użyj innych technik algorytmów generowania par kluczy (ECC, RSA). Upewnij się, że poufne informacje są nadal szyfrowane od końca do końca.
  • Używaj sesji i wygasaj je po upływie określonego czasu.
  • Zaszyfruj zasoby i pobierz je z serwera na żądanie.
  • Lub możesz stworzyć aplikację Hybrid, która uzyskuje dostęp do systemu poprzez webviewochronę zasobów + kodu na serwerze

Wiele podejść; to oczywiste, że musisz poświęcić się wydajności i bezpieczeństwu

Mumair
źródło
2

Widzę tę dobrą odpowiedź w tym wątku. Oprócz tego możesz użyć Facebooka redexdo optymalizacji kodu. Redex działa na.dex poziomie, którym proguard działa jako .classpoziom.

Astma
źródło
1

Jak mogę chronić wszystkie zasoby, zasoby i kod źródłowy aplikacji, aby hakerzy nie mogli w żaden sposób zhakować pliku APK?

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ć.

Jeegar Patel
źródło
To prawda; ale rezygnacja z pakietu APK (z innym certyfikatem) jest trywialna i wszystko będzie działać ponownie. Możliwe jest sprawdzenie, który podpis został użyty do podpisania pliku APK z poziomu samej aplikacji, i błąd, jeśli certyfikat się zmieni, ale edytowanie tego kodu poza aplikacją jest nieco mniej proste.
David Biorąc pod uwagę
Może to uniemożliwić uruchamianie zmodyfikowanego kodu na urządzeniu z Androidem, ale nadal możesz łatwo wyodrębnić odpowiedni kod i napisać nowy kod na komputerze, który robi to, co chcesz.
Sarel Botha
1

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ć.

Godfrey Nolan
źródło
1

Narzędzie: Używając Proguard w twojej aplikacji, można ograniczyć do inżynierii wstecznej twojej aplikacji

Mayank Nema
źródło