Italian Problema con Password

Gottrik

Member
Licensed User
Longtime User
Salve, mi scuso in anticipo … non sono esperto

Ho realizzato un’applicazione che distribuisco con una password.

Per definire di volta in volta una diversa password riconducibile di volta in volta ad un singolo dispositivo Android ho provato ad utilizzare questi due metodi:


Primo metodo:


Sub Pippo ()
Dim Codice As String
Dim P As Phone
Codice = P.GetSettings("android_id")
‘Msgbox (Codice,"Android ID = ")
End Sub


Con il mio Samsung S3 ottengo questo Codice : 5f1dca2342e00ad1

L’applicazione, configurata sul Codice 5f1dca2342e00ad1 legge il codice del telefono e se questo coincide prosegue, altrimenti visualizza il messaggio “Applicazione non registrata ecc. ecc. “ e si ferma.

Forse il procedimento è un po’ macchinoso perché ogni volta io devo creare una applicazione personalizzata, però a me sta bene così … non è un problema.

Questo sistema però ha un difetto : il Codice cambia tutte le volte che viene eseguito il “reset” del telefono …

Allora ho provato questo secondo metodo ( suggerito da Erel … ),che ho applicato senza pormi molte domande, anche perché ci ho capito poco …


Codice = (GetDeviceId)

Sub GetDeviceId As String
Api = r.GetStaticField("android.os.Build$VERSION", "SDK_INT")
If Api < 9 Then
'Old device
If File.Exists(File.DirInternal, "__id") Then
Return File.ReadString(File.DirInternal, "__id")
Else
Dim id As Int
id = Rnd(0x10000000, 0x7FFFFFFF)
File.WriteString(File.DirInternal, "__id", id)
Return id
End If
Else
'New device
Return r.GetStaticField("android.os.Build", "SERIAL")
End If
End Sub

Con questo secondo metodo ottengo, sempre con il mio Samsung S3, il Codice = 479000ead176113c , che è poi lo stesso che appare in fase di compilazione tramite in nostro validissimo b4a ( grazie Erel ), quindi tutto sembra OK :

Installing file to device. 6.91
Device serial: 479000ead176113c
Completed successfully.

Ho perciò deciso di utilizzare questo secondo metodo , che forse potrebbe anche avere il vantaggio di non subire il cambiamento del codice tutte le volte che viene eseguito il “reset” del telefono, ma questo non ho potuto ancora verificarlo …

A questo punto … sorpresa !

Esistono dei telefoni strani (?) , per esempio “ Elephone P6000 ” che, forse perché prodotti da fabbricanti che non hanno la certificazione Android ( può essere ? ) , con il secondo metodo sopra descritto visualizzano sempre questo Codice 0123456789ABCDEF , uguale per tutti i telefoni !

Ora, se diversi telefoni dichiarano lo stesso codice … addio Password … con grande soddisfazione di tutti quelli che pretendono che un’applicazione sia gratuita per il solo fatto che sia stata progettata da qualcun altro … e se chiedi qualcosa in cambio del tuo lavoro, si arrabbiano pure …

Per concludere, anche a voi risulta l’esistenza di telefoni che dichiarano sempre lo stesso codice 0123456789ABCDEF ?

Oppure ho preso lucciole per lanterne …

Grazie

p.s

Purtroppo non ho potuto verificare se, utilizzando il primo metodo, questi “strani” telefoni dichiarano tutti il medesimo codice …
 

LucaMs

Expert
Licensed User
Longtime User
Ciao.

Direi che sei esperto più che a sufficienza, da come hai scritto ;).

Non posso confermarti se esistono dispositivi che, con quella routine, restituiscano sempre lo stesso codice, però a questo punto potresti utilizzare direttamente parte di quella routine, quella per i dispositivi vecchi:
B4X:
If File.Exists(File.DirInternal, "__id") Then
    Return File.ReadString(File.DirInternal, "__id")
Else
    Dim id As Int
    id = Rnd(0x10000000, 0x7FFFFFFF)
    File.WriteString(File.DirInternal, "__id", id)
Return id
End If

In questo modo avrai "sempre" un codice diverso.

Premesso che ancora non ho mai pubblicato app e che quando lo farò la mia app non avrà bisogno di questo tipo di "protezione" in quanto, basandosi sulla pubblicità, venga pure scopiazzata ed installata miliardi di volte, meglio :D...
penso che un codice valido potrebbe essere un mix tra un tuo codice per una determinata app (quindi la MiaAppGioco avrà codice 34adfsj330 sempre, la MiaAppSport avrà 3r09uasdnv,...), un indirizzo email ed un nome utente, "mixati" tramite qualche routine specifica.


Per pubblicare codice qui, usa:
upload_2015-12-15_18-48-0.png
 

valentino s

Active Member
Licensed User
Longtime User
Ciao tutti :) rnd crea un numero random. Ogni volta che verra' generato (applicazione cancellata e reinstallata) dovrai riabilitare l'app.
Usa la coppia email e password se vuoi che l'utente possa sempre accedere senza il tuo intervento manuale, anche quando cancelli e reinstalli l'app.
Cosi' puo' abilitare anche l'app su piu' device dello stesso utente.
Se poi abilita troppi device puoi sempre collegare l'app ad un server (che dara' un codice sblocco) e tracciare il nome del dispositivo e bloccare l'app, ma siccome fai un'app alla volta credo che non sia quello che ti interessa :)
ciao
v.
 

Gottrik

Member
Licensed User
Longtime User
Grazie LucaMs

Appena possibile proverò il tuo suggerimento.
La mia applicazione non è stata "pubblicata" , la distribuisco ai vari utilizzatori con un "passa parola" tra appassionati di tiro di precisione con la carabina.
( se va bene, 20 copie all'anno ... )

Avrò sempre un codice diverso anche con questi "strani" telefoni ?

Per ora, allo scopo di impedire "copie pirata" e solo con i telefoni "strani" con codice "0123456789ABCDEF" ho inserito una protezione sulla data, oltre la quale l'applicazione non funzionerà e visualizzerà il messaggio " Programma protetto, contattare ecc. ecc. ".

Alla scadenza, invierò copia funzionante solo a chi ha pagato .

Come vedi è una soluzione da principiante, però non sapevo cosa altro fare ...

Ciao
 

udg

Expert
Licensed User
Longtime User
Ciao a tutti.
@Gottrik : prova a dare un'occhiata alla mia libreria dgUID, dove ho riportato i vari metodi di identificazione discussi sul forum.
Ti confermo che diversi produttori (per lo più asiatici) impostano un valore comune su tutti i cellullari. E purtroppo non esiste un metodo sicuro di identificazione univoca di uno specifico device. Come ti è stato suggerito, la tattica migliore è combinarne un paio e contare sull'onestà degli utilizzatori.
Nel tuo caso, se gestisci le vendite direttamente e se i numeri sono quelli che dicevi, allora potresti addirittura ricompilare il programma con codici dedicati ai vari utenti e poi avere una funzione che all'apertura dell'app va a confrontarsi con un server in modo da verificare che in quello stesso momento quel particolare codice non risulti già attivo. Ovviamente avresti bisogno anche di un heartbeat in modo che il server possa resettare quel codice se non riceve segnali per un tempo x.
Ma l'idea generale, resta.

ps: se posso darti un consiglio, non complicarti troppo la vita perché alla fine non ne vale la pena.

udg
 

valentino s

Active Member
Licensed User
Longtime User
Confermo il consiglio di @udg di non avere certezze assolute.

Non dimenticare i social drm, come si diceva una volta: banalmente all'apertura dell'app ti trovi il nome della persona al quale il software viene dato.

Prima di dare in giro la tua app, con il suo nome, ci pensera' due volte. MAgari meglio se dall'app si puo' mandare suggerimenti allo sviluppatore senza poter cambiare il nome del mittente :)

ciao

v.
 

luciano deri

Active Member
Licensed User
Longtime User
Se il dispositivo ha lo slot per la sim ha sicuramente un codice imei che è univoco per definizione. E' l'identificativo con si tracciano i cellulari all'interno della rete GSM. Se non ha una sim, prendo il numero seriale. I vecchi modelli che non hanno un seriale prendo mi accontento del'ID che può effettivamente essere manipolato. Ti consiglio di non usare direttamente questo codice come password di accesso, ma criptalo con un metodo tuo prima di confrontarlo con la password.
B4X:
Public Sub GetDeviceId As String
Dim p As Phone
Dim r As Reflector
Dim Api As Int
  Id = ""
   Api = r.GetStaticField("android.os.Build$VERSION", "SDK_INT")
   If Api < 9 Then
      'vecchi modelli
      Id= p.GetSettings("android_id")
      Id = "A" & Id
   Else
      'nuovi modelli
      Dim pid As PhoneId
      Log("IMEI:" & pid.GetDeviceId)
       Id = pid.GetDeviceId
       If Id <> "" Then
               Id = "I" & Id ' il carattere iniziale mi suggerisce che tipo di ID ho preso
       Else
          Id= r.GetStaticField("android.os.Build", "SERIAL")
          If Id.ToLowerCase = "unknown" Then
               Id= p.GetSettings("android_id")
          End If
        Id = "S" & Id
       End If                
   End If
   Return Id
End Sub
 

Gottrik

Member
Licensed User
Longtime User
Ringrazio tutti per i consigli che mi avete inviato ( proverò il codice di Luciano Deri ).
Per ora, visto che i dispositivi "strani" che utilizzano la mia applicazione sono solo tre, continuerò ad utilizzare il blocco del programma alla scadenza di una certa data:

Dim Anno As String
Anno = DateTime.GetYear(DateTime.Now)
If Anno > 2015 Then
Protdata = 0
Msgbox("Programma protetto ..."," contattare ecc. ecc.")
Else
Protdata = 1
End If

Poi, in presenza di Protdata = 1 l'applicazione continuerà a funzionare
A questo punto l'utilizzatore "onesto" mi chiederà una applicazione che io realizzerò con:

If Anno > 2016 ecc.
( si bloccherà a inizio 2017 ... )

Mentre l'utilizzatore "pirata" rimarrà a bocca asciutta, a meno di eliminare la "data automatica" dal suo dispositivo, ma a questo punto dovrà
poi fare i conti con tutti gli avvisi Google che riceverà , penso proprio che non gli convenga ...
E' chiaro che questo mio ripiego ha un senso solo dovendomi confrontare con un ridotto numero di telefoni "strani"
( ma dove li vendono ... al mercato di Forcella (NA) ? )

Saluti
 

Gottrik

Member
Licensed User
Longtime User
Scusa LucaMs, cosa vuol dire "un saltino" ?
Stiamo parlando di un utilizzatore "normale" oppure di uno sviluppatore che in qualche modo è riuscito ad entrare nel mio codice ?
Quando la data è maggiore di quella che io ho previsto la mia app visualizza il messaggio e poi si chiude ... come può avvenire il "saltino" ?

Però mi rendo conto che continuare questa discussione potrebbe risultare noioso per te ed altri esperti ... soprattutto per il fatto che io sono
ignorante in materia ... test con un server online ? La mia app deve funzionare anche in assenza di scheda sim ed in assenza di collegamento dati ...

Se la cosa si fa lunga possiamo anche chiuderla qui ... grazie a tutti
 

LucaMs

Expert
Licensed User
Longtime User
Rispondevo a te, riguardo al "pirata", quindi parlavo di hacker "esperto" (basta far sì che il confronto ritorni sempre True o saltare direttamente quel codice, eliminarlo...).
Per un utente onesto e senza connessione va bene anche la tua soluzione.
 

Gottrik

Member
Licensed User
Longtime User
Anche se l'applicazione è stata compilata utilizzando l'opzione "obfuscated" ( grazie Erel ! )
 

LucaMs

Expert
Licensed User
Longtime User
La domanda non è chiarissima (anche perché ho perso il filo e sto anche dormendo in piedi :D).

Vuoi sapere se un hacker può bypassare il controllo anche se l'app è offuscata? Non ne sono certo ma penso di sì.
Con gli exe di Windows smanettai, millenni fa, ed era possibile eseguire il codice passo-passo, fino a trovare il punto incriminato e modificare il codice assembly.
Suppongo sia possibile anche con Android.

Le migliori protezioni, secondo me, ripeto:
1) non proteggerle affatto, puntando a "guadagnare" anche con le copie pirata (guardagnare tra virgolette perché temo che ben pochi riescano ad incassare decentemente e, a quanto pare, nessuno di questo sito, visto che il mio Club dei 100.000 $ non ha soci :D)
2) usare "trucchetti" basati su dati su server.
 

Gottrik

Member
Licensed User
Longtime User
Si, LucaMS, la mia domanda era :

L'applicazione risulta esposta agli hackers anche se è stata compilata utilizzando l'opzione "obfuscated" ?
Però vedo che hai già risposto ... che tu sappia, qualcuno ha provato ?
Per quanto riguarda i "trucchetti" basati su server , sono fuori dalla mia portata ... non ho le capacità necessarie.
Ciao
 

valentino s

Active Member
Licensed User
Longtime User
Stiamo parlando di una ventina di clienti, giusto ?
B4X:
<?php

$status=array("samsungid2344" => "benvenuto Mario",
"samsungid2345" => "benvenuto Giovanni",
"samsungid2346" => "vai al diavolo, oppure contattami");

$device=$_REQUEST["device"];

$msg = array_search($device, $status);

if ($msg===FALSE) {
   $msg="Nuovo device";mail("emailsvilupaptore","nuovo device app...","device $device");
}

echo $msg;
?>

(scritto al volo, non testato, potrebbero essere errori di sintassi).

Dalla app apri un job per scaricare la pagina interessata su un file da mostrare con un webview1.loadhtml(xxx), oppure usi un bieco webviews.loadurl(url+"?device="+stringa_id_device_a_scelta) e mostri la pagina, ma avresti dei problemi quando l'app va offline.

ciao
 

imgsimonebiliato

Well-Known Member
Licensed User
Longtime User
Puoi anche usare questo:


B4X:
Dim pi As PhoneId
Log(pi.GetDeviceId)
 

LucaMs

Expert
Licensed User
Longtime User
Stiamo parlando di una ventina di clienti, giusto ?
B4X:
<?php

$status=array("samsungid2344" => "benvenuto Mario",
"samsungid2345" => "benvenuto Giovanni",
"samsungid2346" => "vai al diavolo, oppure contattami");

$device=$_REQUEST["device"];

$msg = array_search($device, $status);

if ($msg===FALSE) {
   $msg="Nuovo device";mail("emailsvilupaptore","nuovo device app...","device $device");
}

echo $msg;
?>

(scritto al volo, non testato, potrebbero essere errori di sintassi).

Dalla app apri un job per scaricare la pagina interessata su un file da mostrare con un webview1.loadhtml(xxx), oppure usi un bieco webviews.loadurl(url+"?device="+stringa_id_device_a_scelta) e mostri la pagina, ma avresti dei problemi quando l'app va offline.

ciao
Per quanto riguarda i "trucchetti" basati su server , sono fuori dalla mia portata ... non ho le capacità necessarie.

Dovrebbe avere un proprio sito, il php a disposizione... Roba troppo complicata, per chi non ne mastica.

Un DropBox (o simile) ed un file sarebbe sufficiente
 
Top