Autore Topic: [Medio] Inserire il controllo di licenza nella propria applicazione  (Letto 3248 volte)

Offline ultimoprofeta

  • Utente junior
  • **
  • Post: 124
  • Respect: 0
    • Google+
    • http://it.linkedin.com/pub/christian-giupponi/29/628/810
    • ultimoprofeta
    • Mostra profilo
  • Dispositivo Android:
    HTC Desire HD
  • Market Developer Name:
    ItalianDevTeam
  • Sistema operativo:
    Mac OSX Lion
Re:[Medio] Inserire il controllo di licenza nella propria applicazione
« Risposta #15 il: 11 Maggio 2011, 10:12:49 CEST »
0
Rispondo da solo al mio quesito, per chi avesse lo stesso problema, in pratica quando si vuole regalare l'applicazione a qualcuno la si fa comprare e poi gli si fa un rimborso  8-)

Non sarebbe più comodo ricreare l'apk senza il controllo e passarglielo?  o_O

Offline mimmog

  • Utente senior
  • ****
  • Post: 684
  • Respect: +10
    • MisterX_Dev
    • Mostra profilo
  • Dispositivo Android:
    Galaxy Note e Galaxy Nexus
  • Market Developer Name:
    MisterX_Dev
  • Sistema operativo:
    Windows 7
Re:[Medio] Inserire il controllo di licenza nella propria applicazione
« Risposta #16 il: 11 Maggio 2011, 10:35:54 CEST »
0
Quando ci sono gli aggiornamenti dell'applicazione però il market non li fa scaricare perchè vede che non è originale

Offline ROS

  • Utente normale
  • ***
  • Post: 196
  • Respect: +4
    • Mostra profilo
  • Sistema operativo:
    Ubuntu 10.04
Re:[Medio] Inserire il controllo di licenza nella propria applicazione
« Risposta #17 il: 22 Settembre 2011, 11:12:51 CEST »
0
EDIT: sono riuscito ad implementarlo ma non mi e' chiaro il funzionamento...:D

In teoria le app con questo controllo non si potrebbero installare nella memoria esterna, no? Perche' hanno a che fare con un servizio e ho letto da qualche parte che le app che lavorano con un qualsiasi servizio vanno salvate nella memoria interna per forza! Attualmente do la possibilita' all'utente di scegliere dove installare...conviene la tolga?
« Ultima modifica: 22 Settembre 2011, 19:49:53 CEST da Melanogaster »

Offline ozzem

  • Nuovo arrivato
  • *
  • Post: 13
  • Respect: 0
    • Mostra profilo
Re:[Medio] Inserire il controllo di licenza nella propria applicazione
« Risposta #18 il: 26 Novembre 2011, 13:20:06 CET »
0
ottimo tutorial, mi chiedevo se fosse possibile implementare il controllo di licenza in modo da poter fare prima un check della connettività..e quindi un controllo condizionato soltanto alla presenza della connessione

Offline LeoMar75

  • Nuovo arrivato
  • *
  • Post: 4
  • Respect: +1
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy S2
  • Market Developer Name:
    LeoMar75
  • Sistema operativo:
    Windows 7, Ubuntu
Re:[Medio] Inserire il controllo di licenza nella propria applicazione
« Risposta #19 il: 14 Gennaio 2012, 12:07:55 CET »
0
ottimo tutorial, mi chiedevo se fosse possibile implementare il controllo di licenza in modo da poter fare prima un check della connettività..e quindi un controllo condizionato soltanto alla presenza della connessione

Ciao il controllo della connectività è abbastanza semplice da implementare, basta che aggiungi questo metodo nella classe Main.java

Codice: [Seleziona]
            private boolean isOnline() {
                ConnectivityManager cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
                NetworkInfo netInfo = cm.getActiveNetworkInfo();
                if (netInfo != null && netInfo.isConnectedOrConnecting()) {
                    return true;
                }
                return false;
            }

poi nel metodo onCreate della classe Main.java

Codice: [Seleziona]
...
                String deviceId = Utils.getId(getApplicationContext());
                Log.i("Main:onCreate", deviceId);

                if (deviceId.equals(preferences.getString("deviceId", ""))) {
                        Log.i("Main:onCreate", "checked license");
                        startMainActivity();
                } else if (!isOnline()){
                        toast("No Connection Detected!\nPlease retry later!");
                        // qui fai quello che vuoi..
                }
...

infine, assicurati di aggiungere questi permessi nel file manifest.xml

Codice: [Seleziona]
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

Comunque volevo ringraziare l'autore di questo ottimo tutorial, ma anche sottolineare che io ci metterei meno di due minuti a bypassare questo license check... Davvero semplice..
Il punto debole di questa implementazione risulta nel fatto che il license code è in una activity differente da quella MainActivity della nostra app. Se decompiliamo l'apk possiamo semplicemente cambiare il file manifest.xml e modificarlo come segue:

Codice: [Seleziona]
                <activity android:label="@string/app_name" android:name=".Main"
                        android:theme="@android:style/Theme.Translucent.NoTitleBar">
                       
        </activity>
        <activity android:name=".MainActivity"
                          android:configChanges="orientation|keyboardHidden"
                  android:label="@string/app_name">
                          <intent-filter>
                                <action android:name="android.intent.action.MAIN" />
                                <category android:name="android.intent.category.LAUNCHER" />
                        </intent-filter>
        </activity>

In pratica abbiamo spostato l'intent-filter per "android.intent.action.MAIN" nella MainActivity, in questo modo quando avviamo l'app non verrà eseguita l'activity Main che dovrebbe controllare la licenza...

Un piccolo miglioramento potrebbe essere quello di controllare nuovamente nell' onCreate() della MainActivity il valore "deviceId" salvato dalla classe Main nello SharedPreferences, con questa piccola modifica il tipo di attacco descritto sopra fallirebbe!

Comunque anche in questo caso decompilando il codice si potrebbe facilmente bypassare questo controllo dello SharedPreferences nella MainActivity, basterebbe modificare il jump alla label...

Come vedete è davvero un giochetto da ragazzi bypassare questo ORRENDO sistema che Google ci fornisce per la protezione da copia!

L'unico consiglio che posso darvi è di obfuscare il codice utilizzando ProGuard, in questo caso quando disassembliamo il codice è davvero difficile (quasi impossibile) capire la parte di codice smali relativa al controllo della variabile nello SharedPreferences.

Altra cosetta, ho visto che in rete c'è molta confusione in merito al fatto di testare l'app prima che venga uplodata sul Market. Per prima cosa create una nuova istanza di emulatore AVD ma stando attenti a selezionare l'immagine Google APIs. Con questa immagine sarà possibile aggiungere nell'emulatore un account Google, per poter testare l'app prima che venga uplodata dovete necessariamente utilizzare il vostro account publisher.

Spero di esservi stato utile!

EDIT
Ragazzi lasciate perdere questo SCHIFO MESSO A DISPOSIZIONE DA GOOGLE..... si bypassa il controllo di licenza in meno di due minuti, tutto tempo sprecato..... un semplice reverse engineering (decompilazione dell'apk) e in attimo si modifica il codice per bypassare il controllo....

Google EPIC FAIL!
« Ultima modifica: 19 Gennaio 2012, 14:33:45 CET da LeoMar75 »

Offline MagOscuro

  • Utente normale
  • ***
  • Post: 151
  • Respect: +8
    • Google+
    • giovannid
    • giovanni.daddabbo
    • magoscuro
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy S2
  • Market Developer Name:
    Engigna
  • Sistema operativo:
    Windows/Mac/Linux
Re:[Medio] Inserire il controllo di licenza nella propria applicazione
« Risposta #20 il: 23 Gennaio 2012, 09:46:16 CET »
0
Ma quindi alla fine meglio inserirlo o no?
Nel momento in cui dubiti di poter volare, perdi per sempre la facoltà di farlo
----
È stata trovata una soluzione al tuo problema?Evidenzia il post più utile premendo . È un ottimo modo per ringraziare chi ti ha aiutato .

Offline LeoMar75

  • Nuovo arrivato
  • *
  • Post: 4
  • Respect: +1
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy S2
  • Market Developer Name:
    LeoMar75
  • Sistema operativo:
    Windows 7, Ubuntu
Re:[Medio] Inserire il controllo di licenza nella propria applicazione
« Risposta #21 il: 23 Gennaio 2012, 10:37:30 CET »
0
Ma quindi alla fine meglio inserirlo o no?

Ciao, guarda alla fine credo sia meglio inserirlo piuttosto che non avere nessun tipo di protezione!

Alcune raccomandazioni sono quelle di inserire il codice di controllo licenza nella tua MainActivity quindi non avere un activity separata solo per la licenza.
In questo modo non basterà una semplice modifica sul manifest per bypassare il controllo.

Comunque sia, il problema di fondo sta nel fatto che decompilando l'apk si vede chiaramente dove avviene la chiamata al controllo licenza, bypassare una "if" è davvero semplice, per ovvie ragioni non sto qui a spiegare come crakkare una app.

L'unica vera soluzione, che tra le altre cose è stata la risposta ufficiale di Google in merito a questo sistema di protezione già hacked, è quella di utilizzare ProGuard.

Il debug dell'app (stack trace di errore quando l'app è stata pubblicata) diventa piuttosto difficile dopo l'utilizzo di proguard, ma la cosa brutta è che il tuo codice potrebbe non funzionare correttamente, dovresti ritestare tutta l'app, ed aggiungere filtri nella config di proguard per escludere tutto quello che porta problemi.

Nel mio caso, visto che ho utilizzato le librerie "android.support.v4", ho dovuto aggiungere nella config le seguenti linee:

-dontwarn **CompatHoneycomb
-dontwarn **CompatHoneycombMR2
-dontwarn **CompatCreatorHoneycombMR2

-keep class android.support.v4.** { *; }
-keep public class * extends android.support.v4.**
-keep public class * extends android.app.Fragment

Comunque sia, la config già messa a disposizione da Eclipse nella root del tuo progetto: "proguard.cfg" dovrebbe escludere potenziali errori.
Se vuoi essere ancora più sicuro che proguard non creii casini, allora aggiungi nel file config di proguard:

-dontshrink
-dontoptimize

Per maggiori info riguardanti ProGuard e l'integrazione in Eclipse vi rimando alla documentazione ufficiale: ProGuard | Android Developers

Nota:
Assicurati di scaricare l'ultima versione di proguard dopo ogni aggiornamento dell'sdk. Per aggiornare basta scaricare l'ultima versione di proguard e copiare le directory bin e lib dentro android-sdk\tools\proguard.
Questo evita dei problemi quando dopo l'esportazione dell'apk Eclipse fallisce con il seguente errore: "Error conversion to Dalvik format failed with error 1"
« Ultima modifica: 23 Gennaio 2012, 13:11:06 CET da LeoMar75 »

Offline Tostis

  • Nuovo arrivato
  • *
  • Post: 4
  • Respect: 0
    • Mostra profilo
  • Market Developer Name:
    Tostis
Re:[Medio] Inserire il controllo di licenza nella propria applicazione
« Risposta #22 il: 26 Gennaio 2012, 11:48:31 CET »
0
Ciao a tutti! Ho realizzato un'applicazione e l'ho caricata sul market senza pubblicarla. Vi chiedo se sia normale che, selezionando "Respond Normally", il controllo della licenza restituisca NOT_LICENSED. Effettuo i test sia con l'emulatore che sul cellulare entrambi legati all'account google dello sviluppatore. Aggiungo di non aver acquistato l'applicazione perchè ancora in draft.

Offline LeoMar75

  • Nuovo arrivato
  • *
  • Post: 4
  • Respect: +1
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy S2
  • Market Developer Name:
    LeoMar75
  • Sistema operativo:
    Windows 7, Ubuntu
Re:[Medio] Inserire il controllo di licenza nella propria applicazione
« Risposta #23 il: 26 Gennaio 2012, 11:53:56 CET »
0
Ciao a tutti! Ho realizzato un'applicazione e l'ho caricata sul market senza pubblicarla. Vi chiedo se sia normale che, selezionando "Respond Normally", il controllo della licenza restituisca NOT_LICENSED. Effettuo i test sia con l'emulatore che sul cellulare entrambi legati all'account google dello sviluppatore. Aggiungo di non aver acquistato l'applicazione perchè ancora in draft.

Ciao si non preoccuparti è normale poichè l'app è ancora in Draft!

Offline frecciak

  • Utente normale
  • ***
  • Post: 219
  • Respect: +15
    • Mostra profilo
  • Dispositivo Android:
    galaxy s
  • Sistema operativo:
    windows 7
Re:[Medio] Inserire il controllo di licenza nella propria applicazione
« Risposta #24 il: 01 Febbraio 2012, 22:57:39 CET »
0
grazie mille per la guida..
c'è solo una cosa che non riesco a capire:
Codice (Java): [Seleziona]
// REPLACE WITH YOUR OWN SALT , THIS IS FROM EXAMPLE
    private static final byte[] SALT = new byte[] {
            -46, 65, 30, -128, -103, -57, 74, -64, 51, 88,
            -95, -45, 77, -117, -36, -113, -11, 32, -64, 89
    };
intende dire di mettere 20 numeri a caso (tra positivi e negativi) oppure questi numeri si trovano in qualche modo?
« Ultima modifica: 02 Febbraio 2012, 02:39:22 CET da frecciak »
Se le risposte ti hanno aiutato, metti un ..a te non costa nulla, ma a chi ti ha aiutato fa molto piacere riceverlo!!

Offline LeoMar75

  • Nuovo arrivato
  • *
  • Post: 4
  • Respect: +1
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy S2
  • Market Developer Name:
    LeoMar75
  • Sistema operativo:
    Windows 7, Ubuntu
Re:[Medio] Inserire il controllo di licenza nella propria applicazione
« Risposta #25 il: 02 Febbraio 2012, 08:04:40 CET »
+1
grazie mille per la guida..
c'è solo una cosa che non riesco a capire:
Codice (Java): [Seleziona]
// REPLACE WITH YOUR OWN SALT , THIS IS FROM EXAMPLE
    private static final byte[] SALT = new byte[] {
            -46, 65, 30, -128, -103, -57, 74, -64, 51, 88,
            -95, -45, 77, -117, -36, -113, -11, 32, -64, 89
    };
intende dire di mettere 20 numeri a caso (tra positivi e negativi) oppure questi numeri si trovano in qualche modo?

Mettili a caso.

Offline frecciak

  • Utente normale
  • ***
  • Post: 219
  • Respect: +15
    • Mostra profilo
  • Dispositivo Android:
    galaxy s
  • Sistema operativo:
    windows 7
Re:[Medio] Inserire il controllo di licenza nella propria applicazione
« Risposta #26 il: 04 Febbraio 2012, 14:13:21 CET »
0
ragazzi testando la licenza ho notato che se la risposta è una delle seguenti:
-ERROR_NOT_MARKET_MANAGED
-ERROR_INVALID_PACKAGE_NAME
-ERROR_SERVER_FAILURE
-ERROR_CONTACTING_SERVER
si comporta in modo generico..

sapete se c'e' un modo per gestire in modo diverso ogni risposta del controllo licenza?
non son riuscito a estrapolare la risposta se non nel modo gia spiegato nel tutorial :(
« Ultima modifica: 04 Febbraio 2012, 17:58:48 CET da frecciak »
Se le risposte ti hanno aiutato, metti un ..a te non costa nulla, ma a chi ti ha aiutato fa molto piacere riceverlo!!

Offline salvatore.zagarella

  • Utente junior
  • **
  • Post: 108
  • Respect: +1
    • Mostra profilo
    • Ieeng Solution
Re:[Medio] Inserire il controllo di licenza nella propria applicazione
« Risposta #27 il: 17 Febbraio 2012, 17:05:50 CET »
0
Ragazzi scusate sto provando ad usare il check della licenza..però la console mi dice
Codice: [Seleziona]
[2012-02-17 16:54:27 - imAlive_licenced] ActivityManager: java.lang.SecurityException: Permission Denial: starting Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10000000 cmp=ieeng.solution.alive/.splash } from null (pid=-1, uid=-1) requires null
Credo che sbaglio anche nel manifest perchè non ho capito bene che attività inserire..
Codice (XML): [Seleziona]
<activity android:name=".splash" android:label="@string/app_name" />  <!-- .splash: prima attività in assoluto-->
        <activity android:name=".main" android:label="@string/app_name"  
           android:theme="@android:style/Theme.Translucent.NoTitleBar" > <!-- .main: attività del check licenza -->
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

Volevo inotre dirvi che l'app non c'è sul market ancora quindi non vorrei che sia questo il problema...
Che mi dite??

Offline frecciak

  • Utente normale
  • ***
  • Post: 219
  • Respect: +15
    • Mostra profilo
  • Dispositivo Android:
    galaxy s
  • Sistema operativo:
    windows 7
Re:[Medio] Inserire il controllo di licenza nella propria applicazione
« Risposta #28 il: 19 Febbraio 2012, 12:46:42 CET »
0
nel manifest devi mettere i permessi per internet e per la licenza in questo modo:
Codice (XML): [Seleziona]
<activity android:name=".splash" android:label="@string/app_name" />  <!-- .splash: prima attività in assoluto-->
        <activity android:name=".main" android:label="@string/app_name"  
           android:theme="@android:style/Theme.Translucent.NoTitleBar" > <!-- .main: attività del check licenza -->
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    <uses-permission android:name="com.android.vending.CHECK_LICENSE" />
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> // questo penso non serva, prova senza e al limite lo aggiungi se lo richiede

per quanto riguarda il fatto che l'app non è ancora pubblicata, non centra nulla..dalla console per sviluppatori vai su 'modifica profilo' e da li puoi scegliere la risposta che la ilserver darà alla tua richiesta di licenza..e puoi aggiungere altri indirizzi email per far fare il test a qualche tuo amico.
Se le risposte ti hanno aiutato, metti un ..a te non costa nulla, ma a chi ti ha aiutato fa molto piacere riceverlo!!

Offline salvatore.zagarella

  • Utente junior
  • **
  • Post: 108
  • Respect: +1
    • Mostra profilo
    • Ieeng Solution
Re:[Medio] Inserire il controllo di licenza nella propria applicazione
« Risposta #29 il: 19 Febbraio 2012, 18:45:58 CET »
0
Ragazzi non ho inserito il numero di licenza dove era scritto di inserirlo..ho lasciato tutto come nel codice originale...

Potrebbe essere quello il problema??
 :-P