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:
- Wie kann ich das Reverse Engineering eines Android APK vollständig verhindern ? Ist das möglich?
- Wie kann ich alle Ressourcen, Assets und den Quellcode der App schützen, damit Hacker die APK-Datei in keiner Weise hacken können?
- 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?
quelle
Antworten:
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.
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.
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.
quelle
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.
10000
Münzen. Anstatt10000
direkt zu speichern, speichern Sie es mit einem Algorithmus wie((currency*2)+1)/13
. Stattdessen10000
speichern Sie1538.53846154
in 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.$200
. Anstatt einen Rohwert$200
an 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
, undJohn
zu$3
. Also anstatt zu senden$200
, können Sie alsoCharlie
viermal senden undJohn
vier 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 allen
paar Tage ändern .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.
quelle
.so
heiß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.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.
quelle
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.
quelle
Das ist nicht möglich
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.
Wieder nein, aber Sie können bis zu einem gewissen Grad verhindern, das heißt,
Auch mit
Smali
können Leute mit Ihrem Code spielen. Alles in allem ist es nicht möglich.quelle
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:
Verwenden Sie ProGuard, um den Anwendungscode zu verschleiern
Verwenden Sie NDK mit C und C ++ , um Ihren Anwendungskern und einen sicheren Teil des Codes in
.so
Dateien abzulegenFü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.
quelle
Entwickler können die folgenden Schritte unternehmen, um den Diebstahl einer APK zu verhindern:
Am einfachsten ist es, Tools
ProGuard
zu 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
Dex2Jar
durch das Einfügen von harmlosem Code in eine Android-APK,Dex2Jar
die 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.
quelle
Hier sind einige Methoden, die Sie ausprobieren können:
quelle
Unmöglich
Unmöglich
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.
quelle
Das ist unmöglich
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.
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.
quelle
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.
quelle
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.
quelle
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).
quelle
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.
quelle
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.
quelle
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:
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.
quelle
Ich empfehle Ihnen, sich Softwareanwendungen vor Angriffen schützen anzusehen . Es ist ein kommerzieller Dienst, aber die Firma meines Freundes hat ihn genutzt und sie sind froh, ihn zu nutzen.
quelle
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
quelle
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.
quelle
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:
a.a
)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).
quelle
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.
quelle
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.
quelle
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).
quelle
webview
erstellen , die über den Schutz von Ressource + Code auf dem Server auf das System zugreiftMehrere Ansätze; Dies ist offensichtlich, dass Sie zwischen Leistung und Sicherheit opfern müssen
quelle
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.dex
Ebene, auf der Proguard als.class
Ebene arbeitet.quelle
Eine 100% ige Sicherheit des Quellcodes und der Ressourcen ist in Android nicht möglich. Aber Sie können es dem Reverse Engineering etwas schwer machen. Weitere Details hierzu finden Sie unter den folgenden Links:
Besuchen Sie das sichere Speichern konstanter Werte und https://www.agicent.com/blog/mobile-app-security-best-practices/.
quelle
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.
quelle
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.
quelle
Tool: Wenn Sie Proguard in Ihrer Anwendung verwenden, kann das Reverse Engineering Ihrer Anwendung eingeschränkt werden
quelle
Ich wusste, dass einige Banking-Apps DexGuard verwenden, das die Verschleierung sowie die Verschlüsselung von Klassen, Zeichenfolgen, Assets, Ressourcendateien und nativen Bibliotheken ermöglicht
https://www.guardsquare.com/de/products/dexguard
quelle