ProGuard funktioniert nicht!?

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

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
Pascal P.
  • Mod
  • Blogger
  • Forum-Beiträge: 10.165

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: 92

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: 92

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
Pascal P.
  • Mod
  • Blogger
  • Forum-Beiträge: 10.165

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: 92

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
Pascal P.
  • Mod
  • Blogger
  • Forum-Beiträge: 10.165

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: 92

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: 92

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: 92

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
Pascal P.
  • Mod
  • Blogger
  • Forum-Beiträge: 10.165

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: 92

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: 92

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: 92

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

Empfohlene Artikel