ProGuard funktioniert nicht!?

  • Antworten:25
  • OffenNicht stickyNicht beantwortet
  • Forum-Beiträge: 106

07.03.2014, 16:16:56 via Website

Hallo,

ich verwende Android Studio und bei der APK Erstellung wende ich ProGuard in der Standardeinstellung (siehe Bilder), also so wie es bei der Installation des Android Studios ausgeliefert wird. Ich habe nun ein AKP erstellt und wollte testen ob es wirklich verschlüsselt ist bzw. unlesbar ist. Doch leider ist es lesbar und zwar voll. Ich habe mit dem folgenden Ablauf das ganze leserlich bekommen hier....

Wie kann das sein. Hab ich was falsch gemacht. Anbei noch der Inhalt der ProGuard-Datei.

# This is a configuration file for ProGuard.
# http://proguard.sourceforge.net/index.html#manual/usage.html

-dontusemixedcaseclassnames
-dontskipnonpubliclibraryclasses
-verbose

# Optimization is turned off by default. Dex does not like code run
# through the ProGuard optimize and preverify steps (and performs some
# of these optimizations on its own).
-dontoptimize
-dontpreverify
# Note that if you want to enable optimization, you cannot just
# include optimization flags in your own project configuration file;
# instead you will need to point to the
# "proguard-android-optimize.txt" file instead of this one from your
# project.properties file.

-keepattributes *Annotation*
-keep public class com.google.vending.licensing.ILicensingService
-keep public class com.android.vending.licensing.ILicensingService

# For native methods, see http://proguard.sourceforge.net/manual/examples.html#native
-keepclasseswithmembernames class * {
native <methods>;
}

# keep setters in Views so that animations can still work.
# see http://proguard.sourceforge.net/manual/examples.html#beans
-keepclassmembers public class * extends android.view.View {
void set*(***);
*** get*();
}

# We want to keep methods in Activity that could be used in the XML attribute onClick
-keepclassmembers class * extends android.app.Activity {
public void *(android.view.View);
}

# For enumeration classes, see http://proguard.sourceforge.net/manual/examples.html#enumerations
-keepclassmembers enum * {
public static **[] values();
public static ** valueOf(java.lang.String);
}

-keep class * implements android.os.Parcelable {
public static final android.os.Parcelable$Creator *;
}

-keepclassmembers class **.R$* {
public static <fields>;
}

# The support library contains references to newer platform versions.
# Don't warn about those in case this app is linking against an older
# platform version. We know about them, and they are safe.
-dontwarn android.support.**

Kann mir jemand helfen.
Danke!

Grüße

— geändert am 07.03.2014, 17:05:20

Antworten
  • Forum-Beiträge: 1.727

07.03.2014, 16:20:16 via Website

Wieso machst du Screenshots von Text ? :angry:

Dafür brauchst du meinst kein dex 2 jar, ich schätze mal Proguard ist bei dir gar nicht gelaufen, wenn ja würdest du es deutlich sehen
wärend du das APK baust.

Windmate HD, See you @ IO 14 , Worked on Wundercar, Glass V3, LG G Watch, Moto 360, Android TV

Antworten
  • Forum-Beiträge: 11.219

07.03.2014, 16:21:26 via Website

Sieht ganz so aus als unterstützt ProGuard die neuen Api Versionen noch nicht...
"The Support Lib. contains references to newer Platforn Versions"
Was für eine Lib benutzt du denn?

LG Pascal //It's not a bug, it's a feature. :) ;)

Antworten
  • Forum-Beiträge: 106

07.03.2014, 16:31:09 via Website

Hallo

Wieso machst du Screenshots von Text ?

Was meinst du denn damit?

Grüße

Antworten
  • Forum-Beiträge: 106

07.03.2014, 16:33:02 via Website

Hallo Pascal,

meinst du die SDK Version, oder was meinst du welche Lib ich benutze?
<uses-sdk android:minSdkVersion="8" android:targetSdkVersion="19" />

Grüße

— geändert am 07.03.2014, 16:37:29

Antworten
  • Forum-Beiträge: 11.219

07.03.2014, 16:57:07 via Website

Text kann man such reinkopieren, da braucht man keine Screenshots machen.
ok also sdk etc. ist klar, aber was benutzt du für eine Lib?

LG Pascal //It's not a bug, it's a feature. :) ;)

Antworten
  • Forum-Beiträge: 106

07.03.2014, 17:05:03 via Website

Hallo,

Zu den Screenshots, da habt ihr recht. Sorry ändere ich gleich, wenn es noch geht.

Zur Lib: Wo finde ich den genau diese Angabe. Ihrgend wie weiß ich nicht genau was du meinst. Stehe auf dem Schlauch :-(.

Meinst du diese Angabe?

<orderEntry type="library" exported="" name="support-v4-19.0.0" level="project" />
<orderEntry type="library" exported="" name="ComAndroidSupportAppcompatV71900.aar" level="project" />




Grüße

— geändert am 07.03.2014, 17:09:37

Antworten
  • Forum-Beiträge: 11.219

07.03.2014, 17:09:54 via Website

Was sind das Für libs?
Du musst doch wissen welche du in deinem Projekt verwendest?
Edit: Normalerweise sollte man keine Apps dekompilieren, da das illegal ist. :(
ProGuard verwendet man nur, als obfusicator wenn man Quellcode etwas schwerer lesbar machen will.

— geändert am 07.03.2014, 17:11:51

LG Pascal //It's not a bug, it's a feature. :) ;)

Antworten
  • Forum-Beiträge: 106

07.03.2014, 17:12:12 via Website

Hi,

ich habe ein Standardprojekt gemacht. Dort verwende ich keine zusätzlichen Libs.
Deshalb verstehe ich die Frage leider nicht :-)

Grüße

Antworten
  • Forum-Beiträge: 106

07.03.2014, 17:24:56 via Website

Hallo,

ich wollte meine App die ich gedacht habe, dass ich Sie mit Proguard obfuskiert hätte, zum testen ob Proguard funktioniert hat decompilieren. Deshalb hatte ich den Link mit angebeben.

Eiegntlich will ich wie gesagt korrekt Proguard einsetzten. Was mir scheinbar nicht gelingt.

Grüße

Antworten
  • Forum-Beiträge: 106

07.03.2014, 17:52:10 via Website

Hallo,

so, ich hab jetzt folgendes in meiner build.gradle:

buildTypes {
release {
runProguard true
proguardFiles 'proguard-android.txt'
}
debug {
runProguard true
proguardFiles 'proguard-android.txt'
}
}

Dabei habe ich die proguard-rules.txt umbennant in proguard-android.txt und diese liegt jetzt im Projekt.

Es passiert sogar scheinbar etwas. Wenn ich jetzt das Projekt im Debug Modus laufen lasse, erhalte ich unter build/apk eine neues apk. Wenn ich das nun dekompiliere sind manche Packages umbenannt in Buchstaben und manche nicht. Der Quelltext ist auch noch kompett lesbar. Gerade die Passwörter als String sind super lesbar. Liegt das jetzt am Config-File von Proguard oder funktioniert es noch nicht richtig?

Grüße

Antworten
  • Forum-Beiträge: 11.219

07.03.2014, 17:56:47 via Website

Passwörter speichert man nie im Klartext in der App. Hash Funktion verwenden, aber auch über rainbowtables etc. wieder knackbar.
natürlich wird das Passwort davon nicht verschlüsselt, es muss ja während der Laufzeit abrufbar sein. ProGuard schreibt nur Klassen- Variablen- und Package Namen um, damit man den Zusammenhang nicht so leicht versteht.( Mit ein Bisschen Einarbeitung versteht man das auch)

LG Pascal //It's not a bug, it's a feature. :) ;)

Antworten
  • Forum-Beiträge: 106

07.03.2014, 18:00:55 via Website

Hallo,

ich kenne Obfuskation nur aus dem .Net Bereich und da gibt es Yano und das macht genau dass mit den String, nämlich unleserlich.

Das stimmt mit den Passwörtern, aber ich benötige diese um in einen Abgesicherten Berecih im Web zu kommen mittels Digest Auth. Wie soll ich das in diesem Fall sonst amchen. Geht das auch anderst?

Aber, warum schreibt er nicht alle Klassen oder Packages um?

Grüße

Antworten
  • Forum-Beiträge: 106

07.03.2014, 22:01:56 via Website

Hallo,

ich komme leider nicht weiter. Manche Klassen bekomme ich nicht umbenannt, z.b alle Activity Klassen!
Vielleicht hat jeamd ein gutes fertiges Script schon, was ein optimum an Veränderungen herbei führt.

Grüße

— geändert am 07.03.2014, 22:03:17

Antworten
  • Forum-Beiträge: 1.727

08.03.2014, 10:13:15 via Website

Activities, Views etc pp kannst du zwar umbennen aber dann findet die Runtime diese nicht mehr. Führst du in einem Layout ein CustomView auf wird das erst geladen wenn es nötig ist, daher musst du proguard auch sagen das er es in "ruhe" lassen soll, genau sowas steht in dem standard generierten config file von proguard. Evt liest du dir mal genauer an was Proguard so macht.

Wenn du viel Code in einer Activity hast ist das eher ein 'smell' ich verstehe das man den evtl schützen möchte, dafür würde es sich anbieten den in Klassen auszulagern der nichts mit den Activites/Fragments zu tun hat. Bei click auf Button X delegierst du in Methode X von Klasse Y, so würde sich dann grob lesen wenn du das dekompilierst.

Proguard offusciert keine Strings da es Laufzeit einbußen gibt (Langsam), es gibt ein Tool $$ das die Proguard Leute verkaufen namens Dexguard, was einiges mehr kann.

Windmate HD, See you @ IO 14 , Worked on Wundercar, Glass V3, LG G Watch, Moto 360, Android TV

Antworten
  • Forum-Beiträge: 106

08.03.2014, 10:52:52 via Website

Guten Morgen Mac,

vielen Dank erste einmal für die ausführliche Antwort!
Na, Smell Code ist es nicht gerade, aber nicht jeden Code lagert man ständig aus :-)
Ja, für die kostenpflichtige Version konnte ich meinen Chef bisher nicht überreden. Daher fällt das flach.

Ich kenn das aus .Net, da gibt es eine Menge an kostenlosen Tool die Obfuskation mehr oder weniger gut durchführen.
Ich hatte hatte gehoft, dass mein Wunsch eine Standardanfrage ist und ohne großen Zeitaufwand eingebunden werden kann und dass evt. jemand eine Proguard Konfiguration hat, welche wirklich das Optimum abbildet.

Ich werd mal schauen, dass ich mich noch mehr in die Doku einlese.

Grüße

Antworten
  • Forum-Beiträge: 1.727

08.03.2014, 11:21:02 via Website

Eine Proguard Konfiguration ist meist sehr Individual. Was immer gleich bleibt sind die parameter die direkt generiert werden.
Mit Proguard kannst du extrem fiese fallen bauen, z.b gibt es die möglichkeit im XML Layout anzugeben wie die Methode heißte die bei blick auf den Button ausgeführt werden soll. Proguard denkt aber die Methode wird nicht benutzt, da erst zur Laufzeit das ganze gesucht wird, bäm. Abgesehen davon das Ich dem Compiler da mehr vertraue und mir so zumindest solchen ärger erspare, müsstest du sowas auflisten in der Proguard XML.

Für Professionelle Entwicklung ist eine 1 Developer Lizenz von 480€ aber auch nicht wirklich Teuer finde Ich, und du hast dieses "String" crypto feature für Dexguard dabei.

Ansonsten ist der beste Tip den Ich geben kann folgender, wobei es eher ein Prozess ist den man im Team leben sollte:

Am besten ist ihr nutzt von Anfang an einen CI Server der auch immer ein APK mit Proguard baut, da Code refactored wird ändert sich auch die Proguard config. Mit dem Offuskiertem APP betreibt ihr Dogfooding wie es viele erfolgreiche Unternehmen tun (z.b Google). Fehler sind dann meist Trivial zu beheben.

Ich selbst hatte mal die Aufgabe eine APP am Ende zu offuskieren, was kein trivialer task ist, da du alle libs und alle bösen xml:onClick stellen finden musst. Letzendlich stellt das je nach größe einen recht großen aufwand da, alle wege die du in einer APP gehen kannst musst du ggf testen.
Evtl könnte man heutzutage dafür Espresso Tests schreiben, was aber vorausgesetzt das diese von Anfang an mit erstellt werden.

— geändert am 08.03.2014, 11:21:29

Windmate HD, See you @ IO 14 , Worked on Wundercar, Glass V3, LG G Watch, Moto 360, Android TV

impjor

Antworten
  • Forum-Beiträge: 106

08.03.2014, 13:58:53 via Website

Hi Mac,

danke noch einmal für die ausführliche Antwort! Das zeigt mir wirklich, dass das Thema im Kontext Java/Android nicht so einfach ist. Wie gesagt, ich komme ursprünglich aus der .Net "Szene", dass ist dort deutlich einfacher. Deshalb war ich hier so irritiert.

Dann verhält sich Proguard ja scheinbar bei mir richtig mit der Standardkonfiguration und deshalb setzt er scheinbar nicht alle Klassen um.

Die Frage ist für mich wie gehe ich dann mit den Verschlüsselungsdaten und Passwörter um, die ich benötige um Daten vom Server abzurufen oder zu schreiben. Zumal ich dazu auch eine eigene Verschlüsselungsklasse benötigt und dort steht natürlich auch der Salt im Klartext drin. Hat jemand dazu eine Idee?

Grüße

Antworten
  • Forum-Beiträge: 11

08.03.2014, 14:03:01 via Website

Hallo Paule,
dem Thread zufolge hast du ja nun Proguard konfiguriert bekommen, das ist schonmal gut,
Das verkleinert auch die App und optimiert den Programmcode.

Deine Passwort-Geschichte ist aber ein Design-Fehler, du solltest Passwörter nicht in das Programm hineinkompilieren. Auch mit Obfuscator macht das keinen Sinn, denn die Entschlüsselungsroutine und der Schlüssel sind ja immer auch mit drin, sonst könnte das Passwort nicht aus dem Binary hervorgeholt werden. Das ist "Security by obscurity" und falsch.

Entweder du bietest in deiner App einen Passwort-Dialog an, sodass sich Benutzer anmelden können, oder du verwendest ein Token basiertes Verfahren wie z.b. OAuth 2.0 dazu gibt es Bibliotheken und auch der Server muss es unterstützen. Im Prinzip geht es darum, dass eine App einmal mit Benutzername/Passwort angemeldet wird und ein Security-Token erzeugt wird das an die App gekoppelt ist. Danach kann mit diesem Token aber ohne Interaktion angemeldet werden.

Suche mal bei ggl z.B. nach "oauth 2.0 tutorial"

Antworten
  • Forum-Beiträge: 106

09.03.2014, 10:15:50 via Website

Hallo,

das sind Passwörter um ein Hraccess Berecih zu betreten, wo ein PHP Script liegt welches Funktionen beinhaltet, also kein Loginbereich im klassischen Sinne.

Deshalb frag ich mich wie man soetwas sonst machen kann, wenn du sagst, dass man keine Passwörter in ein Executible einbauen soll.

Grüße

Antworten
  • Forum-Beiträge: 1.727

09.03.2014, 13:08:05 via Website

Passwörter sind eh so 1990, wieso fragst du den User nicht nach seinem Passwort ? Ich würde es mir auch garnicht groß merken und du hast es sicher. Ist nicht sonderlich komfortabel, aber sollte erstmal genügen

Windmate HD, See you @ IO 14 , Worked on Wundercar, Glass V3, LG G Watch, Moto 360, Android TV

Antworten
  • Forum-Beiträge: 106

09.03.2014, 13:31:37 via Website

Hi,

sorry, aber du hast es nicht verstanden. Das Passwort in der App ist NICHT für den Userzugriff sondern für einen Zugriff auf ein Script auf einem Server.
Es hat nichts mit einem Userlogin zu tun! Sonst könnte man das wirklich so machen wie du es beschreibst.

Grüße

Antworten
  • Forum-Beiträge: 3.112

09.03.2014, 15:05:05 via Website

Wenn das "Geheimnis" sich in der App befindet, um an das Script zu kommen, dann hat auch jeder darauf Zugriff, der die App besitzt.

Ist es denn so wichtig, dass das Script nur von der App ausgeführt wird?

Und warum wurde es mit Htaccess gelöst? Warum nicht einfach das Script mit einem Token aufrufen, das sich in der App befindet?
Dann könnte man es wenigstens etwas schwieriger gestalten, dass das Skript von einer 3. App ausgeführt wird, verhindern wird man es aber nicht können.

Und wenn es nur von Benutzer dieser einen App ausgeführt werden darf, dann muss man den Benutzer registrieren. Der Benutzer könnte sich direkt (z.B. mit Gmail) registrieren, oder es könnte ohne Zutun des Users geschehen (für jeden Benutzer wird ein Token generiert). Gerade beim zweiten kann zwar immer noch das Skript von einer 3. App ausgeführt werden, allerdings hat man dann schon mehr Kontrolle und erkennt evtl. Auffälligkeiten.

Antworten