App schützen

  • 9 Antworten
  • Letztes Antwortdatum
S

Snipestyle

Erfahrenes Mitglied
3
Hey,

ich habe eine kurze Frage. Gibt es eine Möglichkeit meine App zu schützen? Momentan ist es so, dass wenn ich die Dateiendung von .apk auf .zip änder man auf alle Dateien zugreifen kann, dies möchte ich aber gerne verhindern.

Grüße
Marcel
 
Kurz und knapp: Nein, kannst du nicht.

Vor allem nur auf zip ändern und Ressourcen anschauen ist ja das kleinste "Übel". Kann man alles auch dekompilieren und dann sieht man deinen Java-Code. Da kann man dann bspw. Proguard einsetzen, um den Code etwas zu verschleiern, aber richtig unterbinden kannst du sowas nicht.
 
So ein paar Möglichkeiten hat man aber schon, die sind kein perfekter Schutz, halten aber den üblichen App-Modder davon ab, seine Finger in Deiner apk zu baden.

Das Geheimnis liegt darin, dass native Libraries zu hacken die Fähigkeiten des 0815-Modders übersteigen.

Dazu gehst Du hin, und gliederst ein paar entscheidende Funktion in nativen Code (c oder c++) aus. In den Funktionen rufst Du eine Check-Funktion (auch in nativem Code geschrieben), die ein 'already-checked' Flag abruft. Ist das gesetzt, kehrt sie sofort zurück (um den Check, der Zeit kostet nicht bei jedem Aufruf durchführen zu müssen), ansonsten führt sie einmal einen initial Check durch, in dem geprüft wird, dass die Inhalte der apk nicht gemodded wurden (md5-Checksumme der Dateien prüfen).

EDIT: Diesen Abschnitt wegen zur Diskussion in einen extra Thread ausgegliedert: https://www.android-hilfe.de/forum/...ne-software-vor-modding-schuetzen.525103.html

Schützenswerte Dateien, die die App zur Laufzeit benötigt, allerdings keine Bilder oder Layouts sind, sondern von App explizit geladen werden, kann man auch beispielsweise mit Tripple-DES Verschlüsselung verschleiern, und den Entschlüssungs-Code in der Nativen Library haben. Der entschlüsselt natürlich nur, wenn der Check erfolgreich war.

Mit etwas Mühe kann man dem 0815-Modder das Modden schon schön schwer machen.

Das sind keine unüberwindbaren Hindernisse, aber die Leute, die es drauf haben, solche Hindernisse zu überwinden, geben sich meistens mit Modden nicht ab, sondern entwickeln lieber selbst. Die anderen kann man damit stoppen.

MfG Uwe
 
Zuletzt bearbeitet von einem Moderator:
EDIT: Die juristischen Aspekte in einen anderen Thread ausgegliedert: https://www.android-hilfe.de/forum/...ne-software-vor-modding-schuetzen.525103.html

Ich frage mich immer warum und wovor man die App schützen soll?
Wenn Leute Grafiken etc aus deiner App rausholen und privat nutzen, hast du keinen Schaden von und es ist legal, sollten die dies öffentlich nutzen z.B. in einer App kannste eine Abmahnung schicken und oder klagen.
 
Zuletzt bearbeitet von einem Moderator:
  • Danke
Reaktionen: DieGoldeneMitte
Der Thread ist zwar jetzt schon etwas älter, aber ich will ihn mal aufgreifen - da er mich auch beschäftigt.

amfa schrieb:
Ich frage mich immer warum und wovor man die App schützen soll?

Die Verschlüsselung bestimmter Daten macht natürlich Sinn. Proguard ist zwar ein guter Ansatz, aber: Strings stehen im Klartext drin und ein halbwegs intelligenter Programmierer kann den Code trotzdem verstehen.

In einem meiner Projekte habe ich diese "Sicherheitslücke" erkannt. Ich kommuniziere mit einem Server (über HTTPS) und sende diesem Daten, woraus ein Token berechnet wird. Nun ist es durch decompilieren relativ einfach zu sehen, wie ich den Token berechne. Jetzt könnte jemand auf die Idee kommen diesen Algorythmus zu nutzen, um eine Angriffe auf meinem Server zu starten.

Lösung: Meine Idee ist es, Methoden als Nativen Code zu schreiben (in C oder C++), welche im Android Studio benutzt werden können. Dort gibt es dann z.B. eine Methode getUrl():String (Natürlich kann sie auch getA() heissen). Die Strings selbst speichert man als verschlüsselten String ab.

Eine SEHR EINFACHE Verschlüsselung funktioniert so:

Code:
private String encryptDecrypt(String value) {
        byte[] result = value.getBytes();
        for (int i = 0; i < result.length; i++) {
            result[i] = (byte) (result[i] ^ i); // Funktioniert nur bis 255 Zeichen (Ein Byte)
        }
return new String(result);
}

Natürlich müsste man sich eine Formel ausdenken, die wesentlich schwerer zu knacken ist (Eine art Hash aus den vorherigen Bytes), so müsste der String dann rückwärts decodiert werden.
Dadurch dass diese Formel und der verschlüsselte String in der Nativen Bibliothek ist, denke ich dass diese schwerer auszulesen sind.

Um an den Echten String zu kommen, muss man die Methode aufrufen die den String entschlüsselt.
Natürlich könnte man daraus auch ein BASE64 String machen, welcher dann wieder direkt im JAVA Code steht. Aber die Decodierung muss zwingend Native sein.

Ich habe das noch nicht getestet, es ist eine Idee.
 
Eigentlich kann man nur das komplette Dekompilieren des Codes ein bisschen erschweren (z.B ProGuard). Schützen kannst Du ihn aber nicht, das die CPU den Code auch lesen muss.
Einzelne Werte kann man auch aus dem RAM auslesen und auch wieder schreiben (zu Laufzeit). Dagegen gibt es kein Mittel. ;) Verschlüsselungen sind auch kein wirklich probates Mittel, das sie die App verlangsamen.

Ein guter Programmierer sieht aber auch schon an der Funktionsweise der App, wie sie aufgebaut ist. Und kann so recht viel Programmcode rekonstruieren.

u.k-f schrieb:
Das sind keine unüberwindbaren Hindernisse, aber die Leute, die es drauf haben, solche Hindernisse zu überwinden, geben sich meistens mit Modden nicht ab, sondern entwickeln lieber selbst.

Hängt davon ab, gerade Spiele werden auch von den fähigeren Leute gehackt (Zeitmangel, keine Lust Geld zu zahlen, usw.)
 
Ja, das ist mir bewusst. Aber die meisten Anfänger können damit nix anfangen. Auf Geschwindigkeit kommt es bei ein paar Strings nicht an. Da ist es wichtiger, dass die URL und der Kommunikationsalgorythmus nicht rekonstruiert werden kann.

Wenn der "Hacker" die Webkommunikation versteht - da sie ja im Klartext ist, könnte er auch Daten aus einer Datenbank auslesen - selbst, wenn er keine Berechtigung hat - einfach durch verändern der SQL Statements.

Wenn Du sowas liest:
sqlQuery = "SELECT * FROM Contacts WHERE OWNERID='"+ currentUser.getId() + "'"; könnte man durch Ändern zu
sqlQuery = "SELECT * FROM Contacts";

die gesamten Kontakte aller Benutzer auslesen. Ich hab jetzt mal Tabellenverknüpfungen weggelassen. Auch Sicherheitsabfragen, die an den Server gesendet werden könnten...

Aber unverschlüsselte Abfragen in JAVA Code sehe ich seit gestern sehr kritisch.

Wenn Du die URL zum Server hast, und den Aufbau von Abfragen - Sicher würde man keinen SQL String an den Server schicken, sondern ein Script aufrufen: https://blablabla.de/getContacts.php und per Post z.B. eine SessionId + UserId mitgeben.

Kurz: Es geht darum sicherheitsreleavte Informationen zu verschleiern.
 
URL keine Chance. Adressen sind im Internet immer öffentlich (Außer du benutzt so etwas wie TOR). Die Daten kannst du verschlüsselt per POST verschicken, dann wir es schon aufwendiger.

Solange du irgend einen Schlüssel auf den Device berechnest, ist die Verbindung nicht wirklich sicher. Es gibt genug Menschen die Assembler können. Wenn interessante Daten (etwas, was man zu Geld machen kann) auf den Server sind, dann ist der Server zum Abschuss freigegeben.

Direkt mit SQL-Statements über das Internet aus einer Datenbank zu lesen ist NO GO. So was macht man nur, wenn man gehackt werden will!!
 
markus.tullius schrieb:
Direkt mit SQL-Statements über das Internet aus einer Datenbank zu lesen ist NO GO. So was macht man nur, wenn man gehackt werden will!!

Das ist mir schon bewusst, das man sowas nicht macht, deshalb ja das Script getcontacts.php (Im Beispiel). Die URL ist ja auch nicht so wichtig. Aber die Art und Weise, wie mit dem Server kommuniziert wird.

Bei mir geht es um eine z.B. um eine Funktion in meinen Apps. Der Kunde erfährt die Domain ja sowieso, weil er per eMail einen Link erhält. Da ich keine Zugangsdaten in der App speichern kann / will, habe ich mir einen Algorythmus ausgedacht, der dem Server sagt "Ich sende aus der App xy". Wenn der Algorythmus durch decompiling bekannt ist, dann kann jeder die Anfragen nachstellen.

Ich habe mich noch nie mit Google Cloud Messaging beschäftigt. Eventuell ist das ne alternative für mein Problem.
Ich weiß aber auch nicht, ob es so gut ist, wenn sämtliche IDs wie Google Services, Crashlytics etc. für andere bekannt sind Diese IDs sind ja auch statisch in den Resourcen.

Mal nebenbei: Durch das Dekompilieren könnte man auch Premium Features freischalten und diese nutzen. Ich muss das einfach mal nachstellen, in dem ich eine Test App programmiere und aus dieser nach dem Decompilieren AdMob enterne oder Premiumfeatures aktiviere :p

Vielleicht gibt es noch ne andere Möglichkeit die Kommunikation zu autorisieren und wichtige App Codes zu schützen.

Ich weiß jetzt nicht, ob es möglich ist den Hashwert des Zertifikats der App durch die App auszulesen. Evtl. über den PackageManager. Aber selbst an dem kommt dann jeder ran, wenn das geht. Mir fehlt gerade echt ne Idee ;-)

Ich werde in der Nacht drüber nachdenken ;)
 
Es gibt kein Mechanismus, der sichere Passwörter auf den Client generiert, da man den Code und die Passwörter immer auslesen kann!

Entweder du arbeitest mit Passwörter / Schlüssel, oder du lässt es sein. Und akzeptierst das Risiko.
 

Ähnliche Themen

G
Antworten
0
Aufrufe
132
Gerdchen07
G
G
Antworten
1
Aufrufe
384
Gerdchen07
G
G
Antworten
13
Aufrufe
595
Gerdchen07
G
L
Antworten
2
Aufrufe
549
Lexub
L
migi01
Antworten
26
Aufrufe
1.985
migi01
migi01
Zurück
Oben Unten