Wie vermeide ich das Reverse Engineering einer APK-Datei?


764

Ich entwickle eine Zahlungsverarbeitungs-App für Android und möchte verhindern, dass ein Hacker auf Ressourcen, Assets oder Quellcode aus der APK- Datei zugreift .

Wenn jemand die Erweiterung .apk in .zip ändert, kann er sie entpacken und problemlos auf alle Ressourcen und Ressourcen der App zugreifen. Mit dex2jar und einem Java-Dekompiler kann er auch auf den Quellcode zugreifen. Das Reverse Engineering einer Android-APK-Datei ist sehr einfach. Weitere Informationen finden Sie unter Frage zum Stapelüberlauf. Reverse Engineering von einer APK-Datei zu einem Projekt .

Ich habe das mit dem Android SDK gelieferte Proguard-Tool verwendet. Wenn ich eine APK-Datei zurückentwickle, die mit einem signierten Keystore und Proguard erstellt wurde, erhalte ich verschleierten Code.

Die Namen der Android-Komponenten bleiben jedoch unverändert, und einige Codes, wie die in der App verwendeten Schlüsselwerte, bleiben unverändert. Gemäß der Proguard-Dokumentation kann das Tool die in der Manifest-Datei genannten Komponenten nicht verschleiern.

Jetzt sind meine Fragen:

  1. Wie kann ich das Reverse Engineering eines Android APK vollständig verhindern ? Ist das möglich?
  2. Wie kann ich alle Ressourcen, Assets und den Quellcode der App schützen, damit Hacker die APK-Datei in keiner Weise hacken können?
  3. Gibt es eine Möglichkeit, das Hacken schwieriger oder sogar unmöglich zu machen? Was kann ich noch tun, um den Quellcode in meiner APK-Datei zu schützen?

120
Es hört sich so an, als würden Sie "Sicherheit durch Dunkelheit" verwenden, wenn Ihr Zahlungsverarbeitungsschema davon abhängt, dass der Betrieb des Kunden geheim bleibt.
PeterJ

43
Haben Sie darüber nachgedacht, die wichtigen Teile des Codes in C / C ++ zu schreiben und als kompilierte Bibliothek hinzuzufügen? Sie können in Assembly-Code zerlegt werden, aber das Reverse Engineering einer großen Bibliothek aus Assembly ist äußerst zeitaufwändig.
Leo


60
Willkommen bei der grundlegenden Frage der Erstellung digitaler Assets. Hacker können auf die Ebene der Maschinenanweisungen gelangen. Wenn also ein Computer die Datei lesen kann, kann sie offen gehackt / kopiert werden, ohne dass eine Verschleierung oder DRM einen bestimmten Hacker jemals vollständig stoppen kann. Wenn Sie Sicherheit benötigen, stellen Sie sicher, dass sich die privaten Schlüssel niemals in der Quelle befinden, und wissen Sie in der Entwurfsphase, dass sie nur durch Isolation (Remote- und / oder dedizierte Hardware) geschützt werden können.
Keith

16
Beachten Sie, dass es je nach Funktionsweise Ihrer Zahlungsverarbeitungs-App möglicherweise gesetzliche und rechtliche Bestimmungen gibt, die sich auf Ihre App auswirken und Sie möglicherweise schwerwiegenden Strafen aussetzen können: Siehe PCI-Konformität, beginnend mit pcicomplianceguide.org/pcifaqs.php#11 .
bloopletech

Antworten:


372

 1. Wie kann ich das Reverse Engineering einer Android APK vollständig vermeiden? Ist das möglich?

AFAIK, es gibt keinen Trick, um Reverse Engineering vollständig zu vermeiden.

Und auch sehr gut gesagt von @inazaruk: Was auch immer Sie mit Ihrem Code tun, ein potenzieller Angreifer kann ihn auf jede Weise ändern, die er oder sie für machbar hält . Sie können Ihre Anwendung grundsätzlich nicht vor Änderungen schützen. Und jeder Schutz, den Sie dort einsetzen, kann deaktiviert / entfernt werden.

 2. Wie kann ich alle Ressourcen, Assets und den Quellcode der App schützen, damit Hacker die APK-Datei in keiner Weise hacken können?

Sie können jedoch verschiedene Tricks ausführen, um das Hacken zu erschweren. Verwenden Sie beispielsweise die Verschleierung (wenn es sich um Java-Code handelt). Dies verlangsamt normalerweise das Reverse Engineering erheblich.

 3. Gibt es eine Möglichkeit, das Hacken schwieriger oder sogar unmöglich zu machen? Was kann ich noch tun, um den Quellcode in meiner APK-Datei zu schützen?

Wie jeder sagt und wie Sie wahrscheinlich wissen, gibt es keine 100% ige Sicherheit. Der Startpunkt für Android, den Google eingebaut hat, ist ProGuard. Wenn Sie die Option haben, gemeinsam genutzte Bibliotheken einzuschließen , können Sie den erforderlichen Code in C ++ einfügen, um die Dateigröße, Integration usw. zu überprüfen. Wenn Sie bei jedem Build eine externe native Bibliothek zum Bibliotheksordner Ihres APK hinzufügen müssen, können Sie ihn verwenden durch den folgenden Vorschlag.

Fügen Sie die Bibliothek in den nativen Bibliothekspfad ein, der standardmäßig "libs" in Ihrem Projektordner ist. Wenn Sie den nativen Code für das Ziel 'armeabi' erstellt haben, legen Sie ihn unter libs / armeabi ab . Wenn es mit armeabi-v7a erstellt wurde, setzen Sie es unter libs / armeabi-v7a.

<project>/libs/armeabi/libstuff.so

1
Für die Zahlungstransaktion habe ich den ISO 8585-Standard verwendet. Das Schema für diesen Standard befindet sich derzeit in einem Schlüssel-Wert-Paar unter Verwendung der HashMap-Sammlung von Java. Wenn ich Reverse Engineering für apk durchführe, erhalte ich alle Schemas. Ist es möglich, das Erhalten von Schemas zu vermeiden? über Reverse Engineering ausgesetzt. Kann Ihr letzter Vorschlag für Freigabebibliotheken in diesem Fall hilfreich sein? Doy, du hast irgendwelche Links, damit ich auf die Freigabebibliotheken in Android zugreifen kann.
Sachin003

4
Wie wäre es, wenn Sie Ihre Zeichenfolgen im Code verschlüsseln und zur Laufzeit entschlüsseln? Wenn Sie die Entschlüsselung auf einem Remote-Server durchführen, wie von anderen vorgeschlagen, tritt nicht das Problem auf, dass sich der Entschlüsselungsschlüssel in den Quellen befindet.
Kutschkem

Ja, Verschlüsselung ist ein Weg, aber es ist nicht sicher, nicht gehackt zu werden. Wenn ich String verschlüssele, um sie zu entschlüsseln, brauche ich eine eindeutige ID im Code. und wenn jemand in der Lage ist, es zu dekompilieren, ist es sehr einfach, die eindeutige ID zu erhalten.
Bhavesh Patadiya

Warum hast du bearbeitetes Zeug hinzugefügt ? es ist alles regelmäßig.
Mohammed Azharuddin Shaikh

@hotveryspicy: Ja, ich habe jetzt die Markierung "bearbeitet" aus der Antwort entfernt. Ich habe meine Antwort bearbeitet, weil er mehr darüber wissen wollte, wie nützlich Bibliotheken in diesem Fall sind.
Bhavesh Patadiya

126

AFAIK, Sie können die Dateien im Verzeichnis / res nicht mehr schützen, als sie derzeit geschützt sind.

Es gibt jedoch Schritte, die Sie unternehmen können, um Ihren Quellcode zu schützen, oder zumindest, was er tut, wenn nicht alles.

  1. Verwenden Sie Tools wie ProGuard. Diese verschleiern Ihren Code und erschweren das Lesen beim Dekompilieren, wenn nicht sogar unmöglich.
  2. Verschieben Sie die wichtigsten Teile des Dienstes aus der App in einen Webservice, der sich hinter einer serverseitigen Sprache wie PHP verbirgt. Wenn Sie beispielsweise einen Algorithmus haben, für dessen Schreiben Sie eine Million Dollar benötigt haben. Sie möchten offensichtlich nicht, dass Leute es aus Ihrer App stehlen. Verschieben Sie den Algorithmus und lassen Sie ihn die Daten auf einem Remote-Server verarbeiten. Verwenden Sie die App, um sie einfach mit den Daten zu versorgen. Oder verwenden Sie das NDK, um sie nativ in .so-Dateien zu schreiben, die viel seltener dekompiliert werden als apks. Ich glaube nicht, dass es derzeit einen Dekompiler für .so-Dateien gibt (und selbst wenn dies der Fall wäre, wäre er nicht so gut wie die Java-Dekompiler). Wie in den Kommentaren erwähnt, sollten Sie bei der Interaktion zwischen Server und Gerät SSL verwenden.
  3. Speichern Sie Werte beim Speichern auf dem Gerät nicht in einem Rohformat. Wenn Sie beispielsweise ein Spiel haben und den Betrag in Spielwährung speichern, den der Benutzer in SharedPreferences hat. Nehmen wir an, es sind 10000Münzen. Anstatt 10000direkt zu speichern, speichern Sie es mit einem Algorithmus wie ((currency*2)+1)/13. Stattdessen 10000speichern Sie 1538.53846154in den SharedPreferences. Das obige Beispiel ist jedoch nicht perfekt, und Sie müssen daran arbeiten, eine Gleichung zu erstellen, die nicht durch Rundungsfehler usw. an Aktualität verliert.
  4. Ähnliches können Sie für serverseitige Aufgaben tun. Nehmen wir als Beispiel Ihre Zahlungsabwicklungs-App. Angenommen, der Benutzer muss eine Zahlung von leisten $200. Anstatt einen Rohwert $200an den Server zu senden, senden Sie eine Reihe kleinerer, vordefinierter Werte, die sich summieren $200. Stellen Sie beispielsweise eine Datei oder Tabelle auf Ihrem Server bereit, die Wörter mit Werten gleichsetzt. Sagen wir das alsoCharlie entspricht $47, und Johnzu $3. Also anstatt zu senden$200 , können Sie also Charlieviermal senden undJohnvier Mal. Interpretieren Sie auf dem Server, was sie bedeuten, und addieren Sie sie. Dies verhindert, dass ein Hacker beliebige Werte an Ihren Server sendet, da er nicht weiß, welches Wort welchem ​​Wert entspricht. Als zusätzliche Sicherheitsmaßnahme können Sie auch hierfür eine Gleichung ähnlich Punkt 3 verwenden und die Schlüsselwörter alle npaar Tage ändern .
  5. Schließlich können Sie zufälligen nutzlosen Quellcode in Ihre App einfügen, sodass der Hacker nach einer Nadel im Heuhaufen sucht. Fügen Sie zufällige Klassen ein, die Ausschnitte aus dem Internet enthalten, oder Funktionen zum Berechnen zufälliger Dinge wie der Fibonacci-Sequenz. Stellen Sie sicher, dass diese Klassen kompiliert werden, aber nicht von der eigentlichen Funktionalität der App verwendet werden. Fügen Sie genug dieser falschen Klassen hinzu, und der Hacker würde es schwer haben, Ihren echten Code zu finden.

Alles in allem gibt es keine Möglichkeit, Ihre App 100% zu schützen. Sie können es schwieriger machen, aber nicht unmöglich. Ihr Webserver könnte kompromittiert werden, der Hacker könnte Ihre Keywords herausfinden, indem er mehrere Transaktionsbeträge überwacht, und die Keywords, die Sie dafür senden. Der Hacker könnte die Quelle sorgfältig durchgehen und herausfinden, welcher Code ein Dummy ist.

Sie können sich nur wehren, aber niemals gewinnen.


136
Verwenden Sie SSL und überprüfen Sie das Serverzertifikat ordnungsgemäß, anstatt Tricks mit Werten auszuführen, die Sie an Ihren Server senden. Sicherheit durch Dunkelheit ist im Allgemeinen eine schlechte Idee.
Nikolay Elenkov

48
Sie können zufälligen nutzlosen Quellcode in Ihre App einfügen . Das kann auch nicht wirklich helfen. Dadurch wird Ihre Anwendung nur aufgebläht, und die Wartung wird schwieriger.
Anirudh Ramanathan

4
Sie können auch den nutzlosen Code fälschen und die Daten an den Server senden, der sie verwirft. Falsche Sicherheit vielleicht, aber ein Schmerz im Arsch für den potenziellen Hacker, oder?
Benoit Duffez

19
Wenn Ihr Algorithmus eine Million Dollar wert ist, .soheißt das nicht, dass ich keine Assembly lesen kann , nur weil es keinen Dekompiler für Dateien gibt :) Die meisten davon fallen in dieselbe Falle und verschleiern nur, anstatt sich richtig zu schützen. Die Verschleierung funktioniert nur, wenn es sich nicht lohnt, die Zeit eines Angreifers durchzuarbeiten. Wenn Sie also etwas auf diesen Techniken aufbauen, hoffen Sie besser, dass sie nicht populär werden. Andernfalls sind Sie durcheinander, weil Ihre Codebasis plötzlich nicht mehr gewartet werden kann braucht große Veränderungen.
Phoshi

23
Ich verstehe nicht, warum diese Antwort eine so hohe Punktzahl hat. 3. und 4. für einen sind einfach nur albern und werden überhaupt keine Sicherheit bedeuten.
Matti Virkkunen

117

Zu keinem Zeitpunkt in der Geschichte des Computing war es jemals möglich, das Reverse Engineering von Software zu verhindern, wenn Sie Ihrem Angreifer eine Arbeitskopie davon geben. Außerdem wird es höchstwahrscheinlich niemals möglich sein .

Wenn dies verstanden ist, gibt es eine offensichtliche Lösung: Geben Sie Ihre Geheimnisse nicht an Ihren Angreifer weiter. Während Sie den Inhalt Ihrer APK nicht schützen können , können Sie alles schützen, was Sie nicht verteilen. In der Regel handelt es sich hierbei um serverseitige Software, die beispielsweise für Aktivierung, Zahlungen, Durchsetzung von Regeln und andere wichtige Code-Teile verwendet wird. Sie können wertvolle Vermögenswerte schützen, indem Sie sie nicht in Ihrer APK verteilen. Richten Sie stattdessen einen Server ein, der auf Anforderungen Ihrer App reagiert, die Assets "verwendet" (was auch immer das bedeuten mag) und das Ergebnis dann an die App zurücksendet. Wenn dieses Modell für die Assets, an die Sie denken, nicht funktioniert, sollten Sie Ihre Strategie überdenken.

Auch wenn Ihr primäres Ziel ist es App - Piraterie zu verhindern : nicht einmal die Mühe. Sie haben bereits mehr Zeit und Geld für dieses Problem aufgewendet, als eine Maßnahme zur Bekämpfung von Piraterie jemals hoffen könnte, Sie zu retten. Der Return on Investment zur Lösung dieses Problems ist so gering, dass es keinen Sinn macht, darüber nachzudenken.


21
Der erste Absatz ist die beste Antwort. Wenn Ihr Angreifer die Hardware kontrolliert, kann er Ihre Software immer irgendwie besiegen. Alles, was wirklich geschützt werden muss, muss auf der von Ihnen kontrollierten Hardware bleiben. So einfach ist das. Und der letzte Absatz über den ROI ist ebenfalls genau richtig.
Daniel Pryden

88

Erste Regel der App-Sicherheit: Jeder Computer, auf den ein Angreifer uneingeschränkten physischen oder elektronischen Zugriff erhält, gehört jetzt Ihrem Angreifer, unabhängig davon, wo er sich tatsächlich befindet oder was Sie dafür bezahlt haben.

Zweite Regel der App-Sicherheit: Jede Software, die die physischen Grenzen verlässt, in die ein Angreifer nicht eindringen kann, gehört jetzt Ihrem Angreifer, unabhängig davon, wie viel Zeit Sie mit dem Codieren verbracht haben.

Dritte Regel: Alle Informationen, die dieselben physischen Grenzen verlassen, in die ein Angreifer nicht eindringen kann, gehören jetzt Ihrem Angreifer, egal wie wertvoll sie für Sie sind.

Die Grundlagen der Sicherheit der Informationstechnologie basieren auf diesen drei Grundprinzipien. Der einzige wirklich sichere Computer ist der, der in einem Safe in einem Farraday-Käfig oder in einem Stahlkäfig eingeschlossen ist. Es gibt Computer, die den größten Teil ihrer Lebensdauer in diesem Zustand verbringen. Einmal im Jahr (oder weniger) generieren sie die privaten Schlüssel für vertrauenswürdige Root-Zertifizierungsstellen (vor einer Vielzahl von Zeugen mit Kameras, die jeden Zentimeter des Raums aufzeichnen, in dem sie sich befinden).

In diesen Umgebungen werden die meisten Computer nicht mehr verwendet. Sie sind physisch im Freien und über einen drahtlosen Funkkanal mit dem Internet verbunden. Kurz gesagt, sie sind anfällig, ebenso wie ihre Software. Ihnen ist daher nicht zu trauen. Es gibt bestimmte Dinge, die Computer und ihre Software wissen oder tun müssen, um nützlich zu sein, aber es muss darauf geachtet werden, dass sie niemals genug wissen oder tun können, um Schäden zu verursachen (zumindest keine dauerhaften Schäden außerhalb der Grenzen dieser einzelnen Maschine) ).

Du wusstest das alles schon; Aus diesem Grund versuchen Sie, den Code Ihrer Anwendung zu schützen. Aber darin liegt das erste Problem; Verschleierungswerkzeuge können den Code zu einem Chaos für einen Menschen machen, der versucht, ihn zu durchsuchen, aber das Programm muss noch ausgeführt werden. Das bedeutet, dass der tatsächliche Logikfluss der App und die von ihr verwendeten Daten von der Verschleierung nicht betroffen sind. Bei ein wenig Hartnäckigkeit kann ein Angreifer den Code einfach verschleiern, und dies ist in bestimmten Fällen nicht einmal erforderlich, in denen das, was er betrachtet, nichts anderes sein kann als das, wonach er sucht.

Stattdessen sollten Sie versuchen sicherzustellen, dass ein Angreifer mit Ihrem Code nichts anfangen kann, egal wie einfach es für ihn ist, eine eindeutige Kopie davon zu erhalten. Das heißt, keine fest codierten Geheimnisse, da diese Geheimnisse nicht geheim sind, sobald der Code das Gebäude verlässt, in dem Sie ihn entwickelt haben.

Diese von Ihnen fest codierten Schlüsselwerte sollten vollständig aus dem Quellcode der Anwendung entfernt werden. Stattdessen sollten sie sich an einem von drei Orten befinden. flüchtiger Speicher auf dem Gerät, der für einen Angreifer schwieriger (aber immer noch nicht unmöglich) ist, eine Offline-Kopie von zu erhalten; permanent auf dem Servercluster, auf den Sie mit eiserner Faust zugreifen können; oder in einem zweiten Datenspeicher, der nicht mit Ihrem Gerät oder Ihren Servern zusammenhängt, z. B. einer physischen Karte oder in den Speichern Ihres Benutzers (was bedeutet, dass er sich möglicherweise im flüchtigen Speicher befindet, aber nicht lange dauern muss).

Betrachten Sie das folgende Schema. Der Benutzer gibt seine Anmeldeinformationen für die App aus dem Speicher in das Gerät ein. Sie müssen leider darauf vertrauen, dass das Gerät des Benutzers nicht bereits durch einen Keylogger oder Trojaner gefährdet ist. Das Beste, was Sie in dieser Hinsicht tun können, ist die Implementierung einer Multi-Faktor-Sicherheit, indem Sie sich schwer zu fälschende Identifizierungsinformationen über die vom Benutzer verwendeten Geräte (MAC / IP, IMEI usw.) merken und mindestens einen zusätzlichen Kanal bereitstellen Damit kann ein Anmeldeversuch auf einem unbekannten Gerät überprüft werden.

Die eingegebenen Anmeldeinformationen werden von der Client-Software (unter Verwendung eines sicheren Hashs) verschleiert und die Anmeldeinformationen im Klartext verworfen. Sie haben ihren Zweck erfüllt. Die verschleierten Anmeldeinformationen werden über einen sicheren Kanal an den zertifikatsauthentifizierten Server gesendet, der sie erneut hasht , um die Daten zu erstellen, die zur Überprüfung der Gültigkeit der Anmeldung verwendet werden. Auf diese Weise weiß der Client nie, was tatsächlich mit dem Datenbankwert verglichen wird, der App-Server kennt nie die Klartext-Anmeldeinformationen, die hinter dem stehen, was er zur Validierung erhält, der Datenserver weiß nie, wie die Daten, die er zur Validierung speichert, erzeugt werden, und ein Mann in Die Mitte sieht nur Kauderwelsch, selbst wenn der sichere Kanal kompromittiert wurde.

Nach der Überprüfung sendet der Server ein Token über den Kanal zurück. Das Token ist nur innerhalb der sicheren Sitzung nützlich, besteht entweder aus zufälligem Rauschen oder einer verschlüsselten (und damit überprüfbaren) Kopie der Sitzungskennungen, und die Clientanwendung muss dieses Token im Rahmen einer Anforderung auf demselben Kanal an den Server senden etwas zu tun. Die Client-Anwendung wird dies viele Male tun, da sie nichts mit Geld, sensiblen Daten oder anderen Dingen tun kann, die für sich selbst schädlich sein könnten. Stattdessen muss der Server aufgefordert werden, diese Aufgabe auszuführen. Die Clientanwendung schreibt niemals vertrauliche Informationen in den persistenten Speicher des Geräts selbst, zumindest nicht im Klartext. Der Client kann den Server über den sicheren Kanal nach einem symmetrischen Schlüssel fragen, um alle lokalen Daten zu verschlüsseln, an die sich der Server erinnert. In einer späteren Sitzung kann der Client den Server nach demselben Schlüssel fragen, um die Daten für die Verwendung im flüchtigen Speicher zu entschlüsseln. Diese Daten werden auch nicht die einzige Kopie sein. Alles, was der Client speichert, sollte auch in irgendeiner Form an den Server übertragen werden.

Dies macht Ihre Anwendung offensichtlich stark vom Internetzugang abhängig. Das Client-Gerät kann keine seiner Grundfunktionen ausführen, ohne eine ordnungsgemäße Verbindung zum Server und dessen Authentifizierung herzustellen. Eigentlich nicht anders als Facebook.

Nun, der Computer, den der Angreifer haben möchte, ist Ihr Server, denn er und nicht die Client-App / das Client-Gerät können ihm Geld einbringen oder anderen Menschen Schmerzen bereiten. Das ist ok; Sie bekommen viel mehr Geld, wenn Sie Geld und Mühe ausgeben, um den Server zu sichern, als wenn Sie versuchen, alle Clients zu sichern. Der Server kann sich hinter allen Arten von Firewalls und anderen elektronischen Sicherheitsvorkehrungen befinden und kann außerdem physisch hinter Stahl-, Beton-, Schlüsselkarten- / Pin-Zugriff und 24-Stunden-Videoüberwachung gesichert werden. Ihr Angreifer müsste in der Tat sehr ausgefeilt sein, um direkt auf den Server zugreifen zu können, und Sie würden (sollten) sofort davon erfahren.

Das Beste, was ein Angreifer tun kann, ist, das Telefon und die Anmeldeinformationen eines Benutzers zu stehlen und sich mit den eingeschränkten Rechten des Clients beim Server anzumelden. In diesem Fall sollte der legitime Benutzer wie beim Verlust einer Kreditkarte angewiesen werden, eine 800-Nummer anzurufen (vorzugsweise leicht zu merken, und nicht auf der Rückseite einer Karte, die er in seiner Handtasche, Brieftasche oder Aktentasche tragen könnte neben dem mobilen Gerät gestohlen) von jedem Telefon, auf das sie zugreifen können und das sie direkt mit Ihrem Kundendienst verbindet. Sie geben an, dass ihr Telefon gestohlen wurde, geben eine grundlegende eindeutige Kennung an und das Konto ist gesperrt. Alle Transaktionen, die der Angreifer möglicherweise verarbeiten konnte, werden zurückgesetzt, und der Angreifer befindet sich wieder auf dem ersten Platz.


1
perfekte Antwort !! Ich habe Ihre Art, Daten mit einem verschlüsselten Token vom Server abzurufen, einfach geliebt. Ich denke, das ist danach so gut wie unmöglich zu dekodieren.
Dharam

Ich weiß, dass dies etwas spät ist, aber was ist mit dem Zugriff auf den Serverteil? Dienste wie Microsoft Azure bieten Ihnen Folgendes, um auf ihren Server zuzugreifen: MobileServiceClient mClient = neuer MobileServiceClient ("MobileServiceUrl", // Ersetzen Sie ihn durch die oben angegebene Site-URL "AppKey", // ersetzen Sie ihn durch den Anwendungsschlüssel) und so ziemlich jeden, der dies tut hat Zugriff darauf, kann auf ihren Server zugreifen und es bearbeiten
edwinj

@edwinj - Kein Problem in der Informatik, das mit einer anderen Indirektionsebene nicht gelöst werden kann. Ihr Snippet enthält die Grundidee für den Zugriff auf einen mobilen Azure-Clientdienst. Es bietet ein grundlegendes Sicherheitsniveau gegen "Drive-bys" der Microsoft-Haustür. Sie können wiederum zusätzliche Ebenen hinzufügen, z. B. einen Sitzungsschlüssel (im Grunde genommen das verschlüsselte Token) für jeden Serviceabruf. Um diesen Schlüssel zu erhalten, müssen Sie sich zunächst mit einer Kombination aus Kenntnis der Anmeldeinformationen und des Verschlüsselungsschemas authentifizieren.
KeithS

1
Eine der besten Antworten.
debo.stackoverflow

64

 1. Wie kann ich das Reverse Engineering einer Android APK vollständig vermeiden? Ist das möglich?

Das ist nicht möglich

 2. Wie kann ich alle Ressourcen, Assets und den Quellcode der App schützen, damit Hacker die APK-Datei in keiner Weise hacken können?

Wenn jemand eine .apk-Erweiterung in .zip ändert, kann jemand nach dem Entpacken problemlos alle Ressourcen (außer Manifest.xml ) abrufen , aber mit APKtool kann auch der tatsächliche Inhalt der Manifestdatei abgerufen werden . Wieder ein Nein.

 3. Gibt es eine Möglichkeit, das Hacken schwieriger oder sogar unmöglich zu machen? Was kann ich noch tun, um den Quellcode in meiner APK-Datei zu schützen?

Wieder nein, aber Sie können bis zu einem gewissen Grad verhindern, das heißt,

  • Laden Sie eine Ressource aus dem Web herunter und führen Sie einen Verschlüsselungsprozess durch
  • Verwenden Sie eine vorkompilierte native Bibliothek (C, C ++, JNI, NDK).
  • Führen Sie immer ein Hashing durch ( MD5 / SHA- Schlüssel oder eine andere Logik)

Auch mit Smalikönnen Leute mit Ihrem Code spielen. Alles in allem ist es nicht möglich.


7
@TrevorBoydSmith: Verschlüsselung hilft nicht viel, wenn das Betriebssystem Open Source und rootfähig ist. Das System benötigt einen Schlüssel, um die APK zu entschlüsseln und Dinge auszuführen. Und wenn das System einen Schlüssel hat und ich uneingeschränkten Zugriff auf das System habe, dann weiß ich, wo ich den Schlüssel finden kann und kann ihn erreichen. Das heißt, ich habe jetzt auch den Schlüssel .
CHao

4
@TrevorBoydSmith: Es ist jedoch der "How to Do" -Teil, der die ganze Idee zunichte macht. Es gibt einfach keine Möglichkeit, verschlüsselten Code direkt auszuführen. Irgendwann muss der entschlüsselte Code verfügbar sein. Das heißt, (1) es muss einen Schlüssel geben (auf den ich als Root wahrscheinlich Zugriff habe), und (2) ich kann möglicherweise sogar die eindeutige Kopie im RAM finden und mache mir sowieso keine Sorgen um die Verschlüsselung.
CHao

3
@TrevorBoydSmith: Das Problem ist, dass Sie in diesem Fall die Kosten einfach nicht genug erhöhen können, damit es sich nicht lohnt. Wir sprechen hier nicht über Brute-Forcing-Schlüssel. Wir sprechen davon , sie bereits zu haben - das Betriebssystem muss Schlüssel haben, und wir haben das Betriebssystem. Die einzige Möglichkeit, dies zu beheben, besteht darin, das Betriebssystem nicht mehr zu rooten. Viel Glück damit; Selbst Apple kann es nicht schaffen. :)
CHao

3
@ TrevorBoydSmith: Ich denke nicht, dass es unmöglich ist , die Kosten im Allgemeinen zu erhöhen . Ich denke (und sage) insbesondere , dass Ihr Vorschlag unmöglich ist - weil es so ist . MATLAB ist kein Android und hat bestimmte Freiheiten, die Android nicht hat. Insbesondere hat es eine Verschleierung auf seiner Seite; Es ist viel schwieriger, einen Verschlüsselungsschlüssel zu verbergen. Android kann das nicht. Jeder, der über den Quellcode verfügt, weiß, wo sich die Schlüssel verstecken, und verfügt über ein Tool, mit dem er sie innerhalb von 10 Minuten nach Bekanntgabe der Funktion abrufen kann. Das ist nicht nur möglich. es ist geradezu trivial .
CHao

6
@ TrevorBoydSmith: Ich habe auf nichts dergleichen bestanden. Ich bestehe darauf, dass statische Aufladung, Veränderung, Bewegung usw. keine Rolle spielen . In einem Open-Source-Betriebssystem kann die Verschlüsselung allein den Code nicht vor Personen schützen, die ihn zurückentwickeln könnten. Da ich den Code lesen kann, der die Entschlüsselung durchführen würde, unabhängig davon, wie der Schlüssel erfasst, verwendet und / oder gespeichert wird, kann ich sehen, wie Sie ihn ausgeführt und repliziert haben - noch einfacher, als ich ein Supergeheimnis rückgängig machen könnte App-Code.
CHao

37

Eine 100% ige Vermeidung des Reverse Engineering der Android-APK ist nicht möglich. Sie können jedoch auf diese Weise vermeiden, dass mehr Daten wie Quellcode, Assets aus Ihrer APK und Ressourcen extrahiert werden:

  1. Verwenden Sie ProGuard, um den Anwendungscode zu verschleiern

  2. Verwenden Sie NDK mit C und C ++ , um Ihren Anwendungskern und einen sicheren Teil des Codes in .soDateien abzulegen

  3. Fügen Sie zum Sichern von Ressourcen nicht alle wichtigen Ressourcen in den Assets-Ordner von APK ein. Laden Sie diese Ressourcen zum Zeitpunkt des ersten Starts der Anwendung herunter.


7
Der dritte erleichtert wirklich die Arbeit der Angreifer. Das Schnüffeln der Netzwerkkommunikation ist einfacher als das Reverse Engineering.
Totten

Um das Problem des dritten zu lösen, könnte man den heruntergeladenen Inhalt verschlüsseln und / oder eine verschlüsselte Verbindung (z. B. SSL / TLS) verwenden
Stradivari

1
Das Verschlüsseln der Verbindung schützt vor Personen, die den Datenverkehr abhören oder ändern. In dem Fall, in dem der Benutzer selbst böswillig ist (dh er hat Ihre apk und versucht, sie zu hacken), erhält er den Inhalt weiterhin mithilfe Ihrer App und extrahiert Ressourcen als Root-Benutzer. aber ja, es hilft gegen einfache Schnüffelangriffe.
Kevin Lee

Hinzu kommt: 4) Verwenden Sie Dexguard für eine höhere Verschleierung, aber es wird bezahlt. 5) Verwenden Sie die OBB-Datei zum Herunterladen von Assets zum Zeitpunkt des Herunterladens der App. Dies hilft auch bei der Reduzierung der App-Größe
Ashok Kumar,

35

Entwickler können die folgenden Schritte unternehmen, um den Diebstahl einer APK zu verhindern:

  • Am einfachsten ist es, Tools ProGuardzu verwenden, mit denen der Code verschleiert werden kann. Bisher war es jedoch schwierig, jemanden daran zu hindern, eine App zu dekompilieren.

  • Auch ich habe von einem Werkzeug HoseDex2Jar gehört . Es stoppt Dex2Jardurch das Einfügen von harmlosem Code in eine Android-APK, Dex2Jardie den Code verwirrt und deaktiviert und vor Dekompilierung schützt. Es könnte irgendwie verhindern, dass Hacker eine APK in lesbaren Java-Code dekompilieren.

  • Verwenden Sie eine serverseitige Anwendung, um nur dann mit der Anwendung zu kommunizieren, wenn dies erforderlich ist. Dies könnte dazu beitragen, wichtige Daten zu vermeiden.

Sie können Ihren Code überhaupt nicht vollständig vor potenziellen Hackern schützen. Irgendwie könnten Sie es schwierig und ein bisschen frustrierend machen, Ihren Code zu dekompilieren. Eine der effizientesten Möglichkeiten besteht darin, in nativen Code (C / C ++) zu schreiben und ihn als kompilierte Bibliotheken zu speichern.


3
HoseDex2Jar ist so gut wie unbrauchbar. Es "verwirrt" nur dex2jar und kann leicht blockiert werden. smali / apktool usw. funktionieren gut mit 'abgespritzten' APKs.
Nikolay Elenkov

@NikolayElenkov Weißt du, wie HoseDex2Jar funktioniert? Was sie verwendet haben, um dex2jar zu vermeiden oder zu verwirren. Weil ich meine apk-Datei nicht ins Web hochladen kann, um HoseDex2Jar zu verwenden. Wenn ich so etwas wie HoseDex2Jar tun kann, um dex2jar zu verwirren, wird es schwierig, mit dem dex2jar-Tool zu hacken.
Sachin003

1
Vielleicht haben Sie meinen Standpunkt falsch verstanden: HoseDex2Jar packt Ihre APK neu, damit das beliebte Dex2jar-Tool sie nicht (sofort einsatzbereit) umkehren kann. Andere Tools können dies jedoch, und es ist sehr einfach, es allgemein zu besiegen. Es macht keinen Sinn, es zu benutzen. Niemand erwähnte Dexguard I (vom Autor von ProGuard; nicht kostenlos), aber es ist Arbeit, die sich ansieht. Es macht ein paar mehr als "normale" Verschleierung.
Nikolay Elenkov

C ++ kann niemals rückgängig gemacht werden? es ist schwierig aber möglich. und es gibt Tools, die Ihnen dabei helfen, wie hex-rays.com/products/decompiler/index.shtml (ja, sie haben eine ARM-Version. Nicht, dass es nicht so einfach ist, sie zu bekommen).
dkzm

ja, @VikartiAnatra: Ich erwähnte auch Irgendwie könnte man es schwierig machen
Sahil Mahajan Mj

24

Hier sind einige Methoden, die Sie ausprobieren können:

  1. Verwenden Sie Verschleierung und Tools wie ProGuard .
  2. Verschlüsseln Sie einen Teil der Quelle und Daten.
  3. Verwenden Sie eine proprietäre integrierte Prüfsumme in der App, um Manipulationen zu erkennen.
  4. Führen Sie Code ein, um das Laden in einen Debugger zu vermeiden. Das heißt, die App kann den Debugger erkennen und den Debugger beenden / beenden.
  5. Trennen Sie die Authentifizierung als Onlinedienst.
  6. Verwenden Sie Anwendungsvielfalt
  7. Verwenden Sie die Fingerabdrucktechnik beispielsweise für Hardwaresignaturen der Geräte von verschiedenen Subsystemen, bevor Sie das Gerät authentifizieren.

23

 1. Wie kann ich das Reverse Engineering einer Android APK vollständig vermeiden? Ist das möglich?

Unmöglich

 2. Wie kann ich alle Ressourcen, Assets und den Quellcode der App schützen, damit Hacker die APK-Datei in keiner Weise hacken können?

Unmöglich

 3. Gibt es eine Möglichkeit, das Hacken schwieriger oder sogar unmöglich zu machen? Was kann ich noch tun, um den Quellcode in meiner APK-Datei zu schützen?

Schwieriger - möglich, aber in der Tat wird es schwieriger, vor allem für den durchschnittlichen Benutzer, der nur nach Hacking-Anleitungen googelt. Wenn jemand Ihre App wirklich hacken möchte, wird sie früher oder später gehackt.


22

 1. Wie kann ich das Reverse Engineering einer Android APK vollständig vermeiden? Ist das möglich?

Das ist unmöglich

 2. Wie kann ich alle Ressourcen, Assets und den Quellcode der App schützen, damit Hacker die APK-Datei in keiner Weise hacken können?

Entwickler können beispielsweise Tools wie ProGuard verwenden, um ihren Code zu verschleiern. Bisher war es jedoch schwierig, jemanden vollständig daran zu hindern, eine App zu dekompilieren.

Es ist ein wirklich großartiges Tool und kann die Schwierigkeit erhöhen, Ihren Code umzukehren, während der Platzbedarf Ihres Codes verringert wird.

Integrierte ProGuard-Unterstützung: ProGuard ist jetzt in den SDK-Tools enthalten. Entwickler können ihren Code jetzt als integrierten Bestandteil eines Release-Builds verschleiern.

 3. Gibt es eine Möglichkeit, das Hacken schwieriger oder sogar unmöglich zu machen? Was kann ich noch tun, um den Quellcode in meiner APK-Datei zu schützen?

Während meiner Recherche habe ich HoseDex2Jar kennengelernt . Dieses Tool schützt Ihren Code vor dem Dekompilieren, aber es scheint nicht möglich zu sein, Ihren Code vollständig zu schützen.

Einige hilfreiche Links können Sie auf sie verweisen.


21

Die Hauptfrage hier ist, dass die Dex-Dateien dekompiliert werden können und die Antwort ist, dass sie "irgendwie" sein können. Es gibt Disassembler wie Dedexer und Smali .

ProGuard, richtig konfiguriert, verschleiert Ihren Code. DexGuard, eine kommerzielle erweiterte Version von ProGuard, kann ein bisschen mehr helfen. Ihr Code kann jedoch weiterhin in Smali konvertiert werden, und Entwickler mit Reverse-Engineering-Erfahrung können anhand der Smali herausfinden, was Sie tun.

Vielleicht wählen Sie eine gute Lizenz und setzen sie gesetzlich bestmöglich durch.


4
Als Randnotiz (Haftungsausschluss: IANAL) - Die Lizenz schützt die Anwendung nicht unter allen Umständen unter allen Umständen (zum Beispiel ist in einigen Ländern in Europa eine Demontage zulässig, um die Kompatibilität zu erhöhen).
Maciej Piechotka

12

Ihr Kunde sollte jemanden einstellen, der weiß, was er tut, der die richtigen Entscheidungen treffen und Sie betreuen kann.

Es ist absurd, oben darüber zu sprechen, dass Sie das Transaktionsverarbeitungssystem im Backend ändern können. Sie sollten solche Architekturänderungen nicht vornehmen dürfen, also erwarten Sie nicht, dass Sie dies können.

Meine Begründung dazu:

Da es sich bei Ihrer Domain um eine Zahlungsabwicklung handelt, können Sie davon ausgehen, dass PCI DSS und / oder PA DSS (und potenzielle staatliche / bundesstaatliche Gesetze) für Ihr Unternehmen von Bedeutung sind. Um konform zu sein, müssen Sie nachweisen, dass Sie sicher sind. Um unsicher zu sein, stellen Sie (durch Testen) fest, dass Sie nicht sicher sind, und reparieren, wiederholen Sie den Test usw., bis die Sicherheit auf einem geeigneten Niveau überprüft werden kann = teurer, langsamer und risikoreicher Weg zum Erfolg. Um das Richtige zu tun, denken Sie im Voraus nach, setzen Sie erfahrene Talente für den Job ein, entwickeln Sie sich auf sichere Weise und testen, reparieren (weniger) usw. (weniger), bis die Sicherheit auf einem geeigneten Niveau überprüft werden kann = kostengünstig, schnell, risikoarmer Weg zum Erfolg.


8

Als jemand, der intensiv an Zahlungsplattformen gearbeitet hat, einschließlich einer mobilen Zahlungsanwendung (MyCheck), würde ich sagen, dass Sie dieses Verhalten an den Server delegieren müssen, kein Benutzername oder Passwort für den Zahlungsprozessor (je nachdem, welcher es ist) gespeichert werden sollte oder In der mobilen Anwendung fest codiert, ist dies das Letzte, was Sie möchten, da die Quelle auch dann verstanden werden kann, wenn Sie den Code verschleiern.

Außerdem sollten Sie keine Kreditkarten oder Zahlungstoken in der Anwendung speichern. Alles sollte wiederum an einen von Ihnen erstellten Dienst delegiert werden. Außerdem können Sie später leichter PCI-konform sein und die Kreditkartenunternehmen haben gewonnen Atme dir nicht den Hals runter (wie sie es für uns getan haben).


7

Die anderen Antworten hier sind richtig. Ich möchte nur eine andere Option anbieten.

Für bestimmte Funktionen, die Sie für wichtig halten, können Sie das WebView- Steuerelement in Ihrer App hosten . Die Funktionalität würde dann auf Ihrem Webserver implementiert. Es sieht so aus, als würde es in Ihrer Anwendung ausgeführt.


@Sarel Botha Ja, für IMP-Bildschirme habe ich bereits Webview verwendet. Ja, dies ist auch eine Möglichkeit, die Sicherheit zu gewährleisten. Ich akzeptiere Ihre Antwort.
Sachin003

7

Wenn wir Reverse Engineering (fast) unmöglich machen wollen, können wir die Anwendung auf einen hoch manipulationssicheren Chip stellen, der alle sensiblen Dinge intern ausführt und mit einem Protokoll kommuniziert, um die Steuerung der GUI auf dem Host zu ermöglichen. Selbst manipulationssichere Späne sind nicht 100% rissfest. Sie legen die Messlatte nur viel höher als bei Softwaremethoden. Dies ist natürlich unpraktisch: Für die Anwendung ist eine kleine USB-Warze erforderlich, die den Chip enthält, der in das Gerät eingesetzt werden soll.

Die Frage zeigt nicht die Motivation, diese Anwendung so eifersüchtig schützen zu wollen.

Wenn das Ziel darin besteht, die Sicherheit der Zahlungsmethode zu verbessern, indem Sicherheitslücken in der Anwendung (bekannt oder anderweitig) verschwiegen werden, ist dies völlig falsch. Die sicherheitsrelevanten Bits sollten in der Tat Open Source sein, wenn dies möglich ist. Sie sollten es jedem Sicherheitsforscher, der Ihre Anwendung überprüft, so einfach wie möglich machen, diese Teile zu finden, ihre Funktionsweise zu überprüfen und sich mit Ihnen in Verbindung zu setzen. Zahlungsanträge sollten keine eingebetteten Zertifikate enthalten. Das heißt, es sollte keine Serveranwendung geben, die einem Gerät vertraut, nur weil es ab Werk über ein festes Zertifikat verfügt. Eine Zahlungstransaktion sollte nur mit den Anmeldeinformationen des Benutzers unter Verwendung eines korrekt gestalteten End-to-End-Authentifizierungsprotokolls durchgeführt werden, das das Vertrauen in die Anwendung, die Plattform oder das Netzwerk usw. ausschließt.

Wenn das Ziel darin besteht, das Klonen zu verhindern, abgesehen von diesem manipulationssicheren Chip, können Sie nichts tun, um das Programm vor Reverse Engineering und Kopieren zu schützen, sodass jemand eine kompatible Zahlungsmethode in seine eigene Anwendung integriert und gibt Aufstieg zu "nicht autorisierten Kunden". Es gibt Möglichkeiten, die Entwicklung nicht autorisierter Clients zu erschweren. Eine Möglichkeit wäre, Prüfsummen basierend auf Schnappschüssen des vollständigen Status des Programms zu erstellen: alle Statusvariablen für alles. GUI, Logik, was auch immer. Ein Klonprogramm hat nicht genau den gleichen internen Status. Sicher, es ist eine Zustandsmaschine, die ähnliche äußerlich sichtbare Zustandsübergänge aufweist (wie durch Ein- und Ausgänge beobachtet werden kann), aber kaum den gleichen internen Zustand. Eine Serveranwendung kann das Programm abfragen: Wie ist Ihr detaillierter Status? (dh Geben Sie mir eine Prüfsumme über alle Ihre internen Statusvariablen. Dies kann mit Dummy-Client-Code verglichen werden, der parallel auf dem Server ausgeführt wird und die echten Statusübergänge durchläuft. Ein Klon eines Drittanbieters muss alle relevanten Statusänderungen des echten Programms replizieren, um die richtigen Antworten zu erhalten, was seine Entwicklung behindert.


7

Einverstanden mit @Muhammad Saqib hier: https://stackoverflow.com/a/46183706/2496464

Und @Mumair gibt gute Startschritte: https://stackoverflow.com/a/35411378/474330

Es ist immer sicher anzunehmen, dass alles, was Sie auf dem Gerät Ihres Benutzers verteilen, dem Benutzer gehört. Schlicht und einfach. Möglicherweise können Sie die neuesten Tools und Verfahren verwenden, um Ihr geistiges Eigentum zu verschlüsseln, aber es gibt keine Möglichkeit, eine entschlossene Person daran zu hindern, Ihr System zu "studieren". Und selbst wenn die aktuelle Technologie es ihnen möglicherweise erschwert, unerwünschten Zugriff zu erhalten, gibt es morgen oder sogar erst in der nächsten Stunde einen einfachen Weg!

Hier kommt also die Gleichung:

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

Selbst in einer so einfachen Wirtschaft wie im Spiel. (Besonders in Spielen! Es gibt dort "anspruchsvollere" Benutzer und Lücken, die sich in Sekundenschnelle ausbreiten!)

Wie bleiben wir sicher?

Die meisten, wenn nicht alle unserer Schlüsselverarbeitungssysteme (und natürlich die Datenbank) befinden sich auf der Serverseite. Und zwischen Client und Server liegen verschlüsselte Kommunikationen, Validierungen usw. Das ist die Idee eines Thin Clients.



4

APK Signaturschema v2 in Android N.

Die PackageManager-Klasse unterstützt jetzt das Überprüfen von Apps mithilfe des APK-Signaturschemas v2. Das APK-Signaturschema v2 ist ein Signaturschema für ganze Dateien, das die Überprüfungsgeschwindigkeit erheblich verbessert und die Integritätsgarantien stärkt, indem nicht autorisierte Änderungen an APK-Dateien erkannt werden.

Um die Abwärtskompatibilität aufrechtzuerhalten, muss eine APK mit dem v1-Signaturschema (JAR-Signaturschema) signiert werden, bevor sie mit dem v2-Signaturschema signiert wird. Beim v2-Signaturschema schlägt die Überprüfung fehl, wenn Sie die APK nach dem Signieren mit dem v2-Schema mit einem zusätzlichen Zertifikat signieren.

Die Unterstützung für das APK-Signaturschema v2 wird später in der N Developer Preview verfügbar sein.

http://developer.android.com/preview/api-overview.html#apk_signature_v2


2
Apk Signatur v2 verhindert nur, dass Ressourcen manipuliert werden, erschwert aber nicht das Reverse Engineering…
Louis CAD

1
Außerdem können Sie die Signatur einfach entfernen und erneut signieren. Die v2-Signatur ist nur ein Datenblock in der APK-Datei.
Robert

4

Es gibt keine Möglichkeit, das Reverse Engineering einer APK vollständig zu vermeiden. Zum Schutz von Anwendungsressourcen und Ressourcen können Sie die Verschlüsselung verwenden.

  • Die Verschlüsselung erschwert die Verwendung ohne Entschlüsselung. Wenn Sie einen starken Verschlüsselungsalgorithmus wählen, wird das Knacken schwieriger.
  • Hinzufügen von gefälschtem Code zu Ihrer Hauptlogik, um das Knacken zu erschweren.
  • Wenn Sie Ihre kritische Logik in einer beliebigen Muttersprache schreiben können und dies die Dekompilierung sicherlich erschwert.
  • Verwenden von Sicherheitsframeworks von Drittanbietern wie Quixxi

3

Grundsätzlich ist das nicht möglich. Es wird niemals möglich sein. Es gibt jedoch Hoffnung. Sie können einen Obfuscator verwenden , um dies zu erreichen, sodass einige häufige Angriffe viel schwieriger durchzuführen sind, darunter:

  1. Umbenennen von Methoden / Klassen (so erhalten Sie im Dekompiler Typen wie a.a )
  2. Verschleierung des Kontrollflusses (daher ist der Code im Dekompiler sehr schwer zu lesen)
  3. Verschlüsselung von Zeichenfolgen und möglicherweise Ressourcen

Ich bin mir sicher, dass es noch andere gibt, aber das sind die wichtigsten. Ich arbeite für eine Firma namens PreEmptive Solutions an einem .NET- Verschleierer. Sie haben auch einen Java-Obfuscator, der für Android funktioniert, sowie einen namens DashO .

Verschleierung ist jedoch immer mit einem Preis verbunden. Insbesondere ist die Leistung normalerweise schlechter und erfordert normalerweise etwas mehr Zeit für Releases. Wenn Ihr geistiges Eigentum für Sie jedoch äußerst wichtig ist, lohnt es sich normalerweise.

Andernfalls müssen Sie nur festlegen, dass Ihre Android-Anwendung nur an einen Server weitergeleitet wird, auf dem die gesamte Logik Ihrer Anwendung gehostet wird. Dies hat seine eigenen Probleme, da Benutzer mit dem Internet verbunden sein müssen, um Ihre App verwenden zu können.

Auch dieses Problem hat nicht nur Android. Es ist ein Problem in jedem App Store. Es geht nur darum, wie schwierig es ist, an die Paketdatei zu gelangen (zum Beispiel glaube ich nicht, dass es für iPhones sehr einfach ist, aber es ist immer noch möglich).


Wenn man den Client (die App) hackt, kann man leider das Kommunikationsformat sehen und einen eigenen Server erstellen :(
Jocky Doe

3

Es ist nicht möglich, RE vollständig zu vermeiden, aber indem Sie sie intern komplexer gestalten, erschweren Sie es Angreifern, den klaren Betrieb der App zu erkennen, was die Anzahl der Angriffsvektoren verringern kann.

Wenn die Anwendung hochsensible Daten verarbeitet, gibt es verschiedene Techniken, die die Komplexität des Reverse Engineering Ihres Codes erhöhen können. Eine Technik besteht darin, C / C ++ zu verwenden, um die einfache Laufzeitmanipulation durch den Angreifer einzuschränken. Es gibt zahlreiche C- und C ++ - Bibliotheken, die sehr ausgereift und einfach in Android-Angebote von JNI zu integrieren sind. Ein Angreifer muss zuerst die Debugging-Einschränkungen umgehen, um die Anwendung auf einer niedrigen Ebene anzugreifen. Dies erhöht die Komplexität eines Angriffs. Für Android-Anwendungen sollte im Anwendungsmanifest android: debuggable = "false" festgelegt sein, um eine einfache Manipulation der Laufzeit durch einen Angreifer oder Malware zu verhindern.

Ablaufverfolgungsprüfung - Eine Anwendung kann feststellen, ob sie derzeit von einem Debugger oder einem anderen Debugging-Tool verfolgt wird. Wenn die Anwendung verfolgt wird, kann sie eine beliebige Anzahl möglicher Angriffsreaktionsaktionen ausführen, z. B. Verwerfen von Verschlüsselungsschlüsseln zum Schutz von Benutzerdaten, Benachrichtigen eines Serveradministrators oder andere Antworten dieser Art, um sich selbst zu verteidigen. Dies kann durch Überprüfen der Prozessstatusflags oder durch Verwenden anderer Techniken wie Vergleichen des Rückgabewerts von ptrace attach, Überprüfen des übergeordneten Prozesses, Blacklist-Debugger in der Prozessliste oder Vergleichen von Zeitstempeln an verschiedenen Stellen des Programms festgestellt werden.

Optimierungen - Um erweiterte mathematische Berechnungen und andere Arten komplexer Logik auszublenden, kann die Verwendung von Compiler-Optimierungen dazu beitragen, den Objektcode so zu verschleiern , dass er von einem Angreifer nicht leicht zerlegt werden kann, was es einem Angreifer erschwert, den jeweiligen Code zu verstehen. In Android kann dies einfacher erreicht werden, indem nativ kompilierte Bibliotheken mit dem NDK verwendet werden. Darüber hinaus bietet die Verwendung eines LLVM-Verschleierers oder eines beliebigen Schutz-SDK eine bessere Verschleierung des Maschinencodes.

Entfernen von Binärdateien - Das Entfernen von nativen Binärdateien ist eine effektive Methode, um die Zeit und das Können eines Angreifers zu erhöhen, um den Aufbau der Funktionen Ihrer Anwendung auf niedriger Ebene anzuzeigen. Durch das Entfernen einer Binärdatei wird die Symboltabelle der Binärdatei entfernt, sodass ein Angreifer eine Anwendung nicht einfach debuggen oder zurückentwickeln kann. Sie können auf Techniken verweisen, die auf GNU / Linux-Systemen wie sstriping oder UPX verwendet werden.

Und endlich müssen Sie sich über Verschleierung und Tools wie ProGuard im Klaren sein.


3

Wenn Ihre App so sensibel ist, sollten Sie den Teil der Zahlungsverarbeitung auf der Serverseite berücksichtigen. Versuchen Sie, Ihre Zahlungsverarbeitungsalgorithmen zu ändern. Verwenden Sie die Android-App nur zum Sammeln und Anzeigen von Benutzerinformationen (z. B. Kontostand) und senden Sie diese Aufgabe mithilfe eines sicheren SSL-Protokolls mit verschlüsselten Parametern an Ihren Server, anstatt Zahlungen innerhalb von Java-Codes zu verarbeiten. Erstellen Sie eine vollständig verschlüsselte und sichere API für die Kommunikation mit Ihrem Server.

Natürlich kann es auch gehackt werden und hat nichts mit dem Schutz von Quellcodes zu tun. Betrachten Sie es jedoch als eine weitere Sicherheitsschicht, die es Hackern erschwert, Ihre App auszutricksen.


2

Sollen TPM-Chips (Trusted Platform Module) nicht geschützten Code für Sie verwalten? Sie werden auf PCs (insbesondere auf PCs) immer häufiger und sind möglicherweise bereits in heutigen Smartphonechips vorhanden. Leider gibt es noch keine OS-API, um davon Gebrauch zu machen. Hoffentlich wird Android eines Tages Unterstützung hinzufügen. Dies ist auch der Schlüssel zum Bereinigen von Content-DRM (an dem Google für WebM arbeitet).


2

Nichts ist sicher, wenn Sie es dem Endbenutzer zur Verfügung stellen, aber einige gängige Praktiken können es für Angreifer schwieriger machen, Daten zu stehlen.

  • Stellen Sie Ihre Hauptlogik (Algorithmen) auf die Serverseite.
  • Kommunizieren Sie mit Server und Client. Stellen Sie sicher, dass die Kommunikation zwischen Server und Client über SSL oder HTTPS gesichert ist. oder verwenden Sie andere Techniken zur Schlüsselpaargenerierung (ECC, RSA). Stellen Sie sicher, dass vertrauliche Informationen durchgehend verschlüsselt bleiben.
  • Verwenden Sie Sitzungen und verfallen Sie nach einem bestimmten Zeitintervall.
  • Verschlüsseln Sie Ressourcen und rufen Sie sie bei Bedarf vom Server ab.
  • Oder Sie können eine Hybrid-App webviewerstellen , die über den Schutz von Ressource + Code auf dem Server auf das System zugreift

Mehrere Ansätze; Dies ist offensichtlich, dass Sie zwischen Leistung und Sicherheit opfern müssen


2

Ich kann diese gute Antwort in diesem Thread sehen. Darüber hinaus können Sie Facebook verwenden redex, um den Code zu optimieren. Redex arbeitet auf einer .dexEbene, auf der Proguard als .classEbene arbeitet.



1

Wie kann ich alle Ressourcen, Assets und den Quellcode der App schützen, damit Hacker die APK-Datei in keiner Weise hacken können?

Eine APK-Datei ist mit dem SHA-1- Algorithmus geschützt . Sie können einige Dateien im META-INF- Ordner von APK sehen. Wenn Sie eine APK-Datei extrahieren und deren Inhalt ändern und erneut komprimieren und diese neue APK-Datei auf einem Android-Computer ausführen, funktioniert dies nicht, da die SHA-1-Hashes niemals übereinstimmen.


Das ist wahr; Es ist jedoch trivial, die APK (mit einem anderen Zertifikat) zu kündigen, und alles wird wieder funktionieren. Es ist möglich zu überprüfen, welche Signatur zum Signieren der APK innerhalb der Anwendung selbst verwendet wurde, und Fehler zu machen, wenn sich das Zertifikat ändert. Es ist jedoch nur geringfügig weniger trivial, diesen Code aus der Anwendung heraus zu bearbeiten.
David gegeben

Dies kann verhindern, dass das Android-Gerät geänderten Code ausführt, aber Sie können den relevanten Code trotzdem einfach extrahieren und neuen Code auf einen PC schreiben, der das tut, was Sie wollen.
Sarel Botha

1

Ich bin damit einverstanden, dass es keine 100% ige Lösung gibt, die Ihren Code schützt, aber Version 3 von HoseDex2Jar ist jetzt verfügbar, wenn Sie es ausprobieren möchten.


1

Tool: Wenn Sie Proguard in Ihrer Anwendung verwenden, kann das Reverse Engineering Ihrer Anwendung eingeschränkt werden


Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.