Strumenti / strategia di offuscamento .NET [chiuso]


160

Il mio prodotto ha diversi componenti: ASP.NET, App di Windows Form e Servizio Windows. Il 95% circa del codice è scritto in VB.NET.

Per motivi di proprietà intellettuale, devo offuscare il codice e fino ad ora ho usato una versione di dotfuscator che ora ha più di 5 anni. Sto pensando che è tempo di passare a uno strumento di nuova generazione. Quello che sto cercando è un elenco di requisiti che dovrei considerare quando cerco un nuovo offuscatore.

Quello che so dovrei cercare finora:

  • Serializzazione / De-serializzazione . Nella mia soluzione attuale, dico semplicemente allo strumento di non offuscare i membri dei dati di una classe perché il dolore di non poter caricare dati precedentemente serializzati è semplicemente troppo grande.
  • Integrazione con il processo di compilazione
  • Lavorare con ASP.NET . In passato, ho riscontrato questo problema a causa della modifica dei nomi DLL (spesso ne hai uno per pagina) - che non tutti gli strumenti gestiscono bene.

Diversi duplicati: google.com/…
John Rasch,


Vedi Agile.net .NET Obfuscator per una soluzione alternativa per offuscare il tuo codice. In particolare, controlla la sua funzionalità di virtualizzazione del codice.
sutton bernard

Guarda un buon elenco di offuscatori da ArmDot a Xenocode qui su SO: stackoverflow.com/a/60054/1480104
Artem Razin,

Risposte:


44

Di nuovo con .Net 1.1 l'offuscamento era essenziale: decompilare il codice era facile, e si poteva passare dall'assemblaggio, a IL, al codice C # e farlo compilare di nuovo con pochissimo sforzo.

Ora con .Net 3.5 non ne sono affatto sicuro. Prova a decompilare un assembly 3.5; quello che ottieni è molto lontano dalla compilazione.

Aggiungi le ottimizzazioni da 3.5 (molto meglio di 1.1) e il modo in cui i tipi anonimi, i delegati e così via vengono gestiti dalla riflessione (sono un incubo da ricompilare). Aggiungi espressioni lambda, compilatore "magico" come Linq-sintassi e varfunzioni C # 2 yield(che si traducono in nuove classi con nomi illeggibili). Il tuo codice decompilato finisce molto per essere compilabile.

Un team di professionisti con molto tempo potrebbe ancora riprogrammarlo, ma lo stesso vale per qualsiasi codice offuscato. Il codice che hanno ottenuto sarebbe irraggiungibile e altamente probabile che fosse molto difettoso.

Consiglierei di firmare le chiavi dei tuoi assembly (il che significa che se gli hacker possono ricompilarne uno devono ricompilare tutto) ma non credo che l'offuscamento ne valga la pena.


128
Totalmente in disaccordo. La firma non può sostituire l'offuscamento. La firma è mirata contro l'hacking del codice. Ma se tu cosa nascondere la tua idea, gli algoritmi, ecc. Offuscamento è l'unico modo.
Shrike,

25
Non credo che la firma possa sostituire l'offuscamento, rende solo molto più difficile l'hacking. L'offuscamento non riesce a nascondere la tua idea - se vogliono copiarlo lo farà comunque, e l'offuscamento non lo renderà nemmeno molto più difficile. In particolare, poiché gli algoritmi sono tutti gli operatori l'offuscamento non ha molto effetto su di essi - di solito sono una delle cose più facili da estrarre.
Keith,

6
L'offuscamento potrebbe non valerne la pena se si parla di un team con molte risorse disponibili, ma l'offuscamento è ottimo per proteggersi dallo sviluppatore "medio" che non vuole altro che usare Reflector per aprire il proprio assieme e salvare il codice sorgente come progetto e apportare modifiche. L'offuscamento ha il suo posto e escluderlo completamente è l'atteggiamento sbagliato da avere. È uno strato di difesa.
Rasoio

5
Quando si decompila, l'origine si trova in uno stato disordinato ma logicamente segue ancora gli stessi percorsi. Non esiste un voodoo 'magico' del compilatore. Lo so perché di recente avevo perso un repository e usato reflector per recuperare il codice sorgente. L'offuscamento è solo una sofferenza da "mantenere", se non fa parte del processo di creazione. Aggiunge sovraccarico, ma stiamo tutti scrivendo app ad alta intensità computazionale? No. È uno strato debole di difesa per un attaccante debole.
Rasoio

8
Che risposta orribile. Hai provato a decompilare di recente? I decompilatori sono migliorati , non peggiori. Reflector offre una qualità quasi originale, ovviamente senza commenti.
BlueRaja - Danny Pflughoeft il

50

Abbiamo provato un certo numero di offuscatori. Nessuno di essi funziona su un'app client / server di grandi dimensioni che utilizza servizi remoti. Il problema è che client e server condividono alcune dll e non abbiamo trovato alcun offuscatore in grado di gestirlo.

Abbiamo provato DotFuscator Pro, SmartAssembly, XenoCode, Salamander e diverse piccole app temporali i cui nomi mi sfuggono.

Francamente, sono convinto che l'offuscamento sia un grande trucco.

Anche i problemi che affronta non è del tutto un vero problema. L'unica cosa che devi davvero proteggere è stringhe di connessione, codici di attivazione, cose sensibili alla sicurezza del genere. Questa assurdità che un'altra società sta per decodificare tutta la tua base di codice e creare un prodotto concorrente da esso è qualcosa dall'incubo di un manager paranoico, non dalla realtà.


14
Bravo Judah! L'unico modo per rimanere avanti è sviluppare un codice nuovo e migliore, senza aggrapparsi al codice che hai già scritto. Finisci per investire tempo, fatica e forse anche denaro in qualcosa di irrilevante. L'offuscamento non ne vale la pena.
David Rutten,

180
Ecco perché non mi piace questo sistema di reputazione, hai 19 voti e non hai fornito una risposta. L'utente non sta chiedendo la tua opinione sull'offuscamento, vuole saperne di più sulle tecniche di offuscamento.
backslash17

32
Ho fornito informazioni sulle mie esperienze usando diversi offuscatori esistenti. E la mia opinione derivava da quell'esperienza.
Judah Gabriel Himango,

6
+1 per "Francamente, sono convinto che l'offuscamento sia un grande trucco". Non avresti potuto metterlo meglio di così.
Andrei Rînea,

15
Una necessità molto valida per proteggere il tuo codice è vendere costose app specializzate alle aziende che le useranno internamente solo con pochi utenti. La tentazione è di invertire il codice per consentire l'hacking e le modifiche interne per i propri scopi, evitare contratti di manutenzione o persino hackerare le versioni di prova per ottenere le chicche di cui hanno bisogno.
Brady Moritz,

44

Sono "Knee Deep" in questo momento, cercando di trovare una buona soluzione. Ecco le mie impressioni finora.

Xenocode - Ho una vecchia licenza per Xenocode2005 che usavo per offuscare i miei assiemi .net 2.0. Ha funzionato bene su XP ed è stata una soluzione decente. Il mio progetto attuale è .net 3.5 e sono su Vista, il supporto mi ha detto di provarlo, ma la versione del 2005 non funziona nemmeno su Vista (crash), quindi io e ora devo comprare 'PostBuild2008' a un prezzo incredibile di $ 1900. Questo potrebbe essere un buon strumento ma non lo scoprirò. Troppo caro.

Reactor.Net - Questo è un prezzo molto più interessante e ha funzionato bene sul mio eseguibile standalone. Anche il modulo Licensing è stato bello e mi avrebbe risparmiato un sacco di sforzi. Sfortunatamente, manca una caratteristica chiave e questa è la capacità di escludere cose dall'offuscamento. Ciò rende impossibile ottenere il risultato di cui avevo bisogno (unire più assiemi, offuscarne alcuni, non offuscare altri).

SmartAssembly - Ho scaricato l'Eval per questo e ha funzionato perfettamente. Sono stato in grado di ottenere tutto ciò che desideravo e l'interfaccia era di prima classe. Il prezzo è ancora un po 'pesante.

Dotfuscator Pro - Impossibile trovare il prezzo sul sito Web. Attualmente in discussione per ottenere un preventivo. Sembra inquietante.

Confuser - un progetto open source che funziona abbastanza bene (confondere ppl, proprio come suggerisce il nome).

Nota: Secondo quanto riferito, ConfuserEx è "rotto" in base al numero 498 sul repository GitHub.


8
puoi pubblicare quanto dotfuscator citato?
Anthony Johnston,

6
@Anthony Di recente ho acquistato una licenza all'inizio del 2011. Il preventivo era di $ 2475 USD per il minimo 1 build machine + 1 licenza per sviluppatori. Include 12 mesi di aggiornamenti e supporto.
Yoshi,

2
Non stavo usando .NET Reactor quando è stato pubblicato questo post, ma ora puoi escludere parti del tuo codice dall'offuscamento usando l'attributo System.Reflection.Obfuscation. Ci sono anche alcune impostazioni che ti permettono di fare cose come escludere tutti i metodi o tutti i tipi serializzabili.
benteight,

5
DotFuscator mi ha quotato $ 4999, che è stato ridotto a $ 4500 a causa di uno sconto del 10%. Questo era per 1 licenza di sviluppo! Nelle discussioni è stato ridotto a $ 2500 ma è ancora troppo costoso.
Oliver,

3
.NET Reactor ora ha un editor delle regole di esclusione che consente di escludere determinate classi, metodi o proprietà dall'offuscamento. Inoltre, è possibile utilizzare la casella di controllo "Unisci solo" per escludere una specifica DLL
dall'offuscamento


18

Ho usato l'assemblaggio intelligente. Fondamentalmente, scegli una dll e la restituisce offuscata. Sembra funzionare bene e finora non ho avuto problemi. Molto, molto facile da usare.


6
Lo Smartassembly è abbastanza inutile. Un cracker inserisce la tua applicazione in DumbAssembly e tutta la "protezione" viene rimossa con un clic del mouse: woodmann.com/collaborative/tools/index.php/Dumbassembly
Elmue

2
A partire da ora, la navigazione sicura di Google segnala il sito di woodmann come non sicuro. Inoltre, il sito di Woodmann contiene un intero articolo su di lui che in precedenza aveva subito un'infezione da malware, quindi non voglio davvero navigare nel suo sito quando Google non si fida di esso.
Brian,

10

Ho provato quasi tutti gli offuscatori sul mercato e SmartAssembly è il migliore secondo me.


6
Lo Smartassembly è abbastanza inutile. Un cracker inserisce l'applicazione in DumbAssembly e tutta la "protezione" viene rimossa con un clic del mouse: woodmann.com/collaborative/tools/index.php/Dumbassembly
Elmue

3
A partire da ora, la navigazione sicura di Google segnala il sito di woodmann come non sicuro. Inoltre, il sito di Woodmann contiene un intero articolo su di lui che in precedenza aveva subito un'infezione da malware, quindi non voglio davvero navigare nel suo sito quando Google non si fida di esso.
Brian,

9

Ho anche usato SmartAssembly. Ho scoperto che Ezrinz .Net Reactor è molto meglio per me su applicazioni .net. Offusca, supporta Mono, unisce assiemi e ha anche un modulo di licenza molto carino per creare una versione di prova o collegare la licenza a una macchina particolare (molto facile da implementare). Il prezzo è anche molto competitivo e quando avevo bisogno di supporto erano veloci. Eziriz

Giusto per essere chiaro, sono solo un cliente a cui piace il prodotto e che non è in alcun modo collegato con l'azienda.


Ho un certo numero di amici che giurano su .Net Reactor - anche se non sul sito Web dei prodotti c'è anche un utile gruppo google per il prodotto: groups.google.com/group/net-reactor-users?hl=it
Bittercoder

2
+1 per Eziriz. Ho avuto ottimi risultati con esso. È il migliore che ci sia in questo momento, IMO.
Druido,

4
.NET Reactor succhia. Ho cambiato il mio computer, inviato due volte e-mail riguardo al file di licenza e non ho ricevuto risposta. La licenza di .NET Reactor è bloccata dall'hardware.
OrElse,

2
È normale. Come ti aspetti che ti credano? Come fanno a sapere che hai davvero cambiato il tuo computer e non stai cercando di eseguire una licenza del tuo amico sul tuo computer? Per questo è un blocco hardware! Se potesse essere utilizzato su più computer, un blocco hardware sarebbe inutile.
Elmue,

(PS. Abbiamo scelto Reactor in gran parte sulla base di questa risposta SO.)
Chris

7

La risposta breve è che non puoi.

Esistono vari strumenti che renderanno più difficile la lettura del codice da parte di qualcuno - alcuni dei quali sono stati indicati da altre risposte.

Tuttavia, tutto ciò che fanno è rendere più difficile la lettura: aumentano la quantità di sforzo richiesto, tutto qui. Spesso questo è abbastanza per scoraggiare i lettori occasionali, ma qualcuno che è determinato a scavare nel tuo codice sarà sempre in grado di farlo.


51
if (effort.Required> codeFromScratch.Costs) DoNoReverseEngineer ();
Nicolas Dorier,

41
@NicolasDorier,Operator '>' cannot be applied to operands of type 'System.TimeSpan' and 'decimal'
Saeb Amini,

21
@Saeb sicuro che possono, passare da TimeSpan a denaro (decimale) è ciò di cui si occupa la maggior parte delle aziende.
hultqvist,

6

Abbiamo un'app multilivello con un'interfaccia asp.net e winform che supporta anche i telecomandi. Non ho avuto problemi con l'utilizzo di qualsiasi offuscatore ad eccezione del tipo di crittografia che genera un caricatore che può essere problematico in tutti i modi inaspettati e non ne vale la pena secondo me. In realtà il mio consiglio sarebbe più sulla falsariga di "Evitare la crittografia di offuscatori di tipo caricatore come la peste". :)

Nella mia esperienza, ogni offuscatore funzionerà bene con qualsiasi aspetto di .net incluso asp.net e remoting, devi solo entrare in intimità con le impostazioni e imparare fino a che punto puoi spingerlo in quali aree del tuo codice. E prenditi il ​​tempo per tentare il reverse engineering su ciò che ottieni e vedere come funziona con le varie impostazioni.

Abbiamo usato diversi nel corso degli anni nelle nostre app commerciali e ci siamo affidati a Spices obfuscator da 9rays.net perché il prezzo è giusto, fa il lavoro e hanno un buon supporto anche se non abbiamo davvero bisogno del supporto negli anni ma per essere onesti Non penso sia importante quale offuscatore usi, i problemi e la curva di apprendimento sono tutti uguali se vuoi che funzioni correttamente con il telecomando e asp.net.

Come altri hanno già detto, tutto ciò che stai realmente facendo è l'equivalente di un lucchetto, tenendo fuori gente altrimenti onesta e rendendo più difficile semplicemente ricompilare un'app.

Le licenze sono di solito l'area chiave per la maggior parte delle persone e dovresti sicuramente utilizzare un qualche tipo di sistema di certificazione con firma digitale per le licenze. La tua più grande perdita verrà dalla condivisione casuale delle licenze se non hai un sistema intelligente in atto, le persone che rompono il sistema di licenze non avrebbero mai acquistato in primo luogo.

È davvero facile andare troppo lontano e avere un impatto negativo sui tuoi clienti e sulla tua attività, fare ciò che è semplice e ragionevole e quindi non preoccuparti.


5

Negli ultimi due giorni ho sperimentato Dotfuscator Community Edition advanced (un download gratuito dopo aver registrato il CE di base fornito in bundle con Visual Studio).

Penso che il motivo per cui più persone non usano l'offuscamento come opzione predefinita è che è una seccatura seria rispetto al rischio. Sui progetti di test più piccoli ho potuto ottenere il codice offuscato in esecuzione con molto sforzo. L'implementazione di un semplice progetto tramite ClickOnce è stata problematica, ma realizzabile dopo aver firmato manualmente i manifest con mage. L'unico problema era che in caso di errore la traccia dello stack tornava offuscata e il CE non ha un deobfuscatore o un chiarificatore confezionato.

Ho cercato di offuscare un vero progetto basato su VSTO in Excel, con l'integrazione di Virtual Earth, molte chiamate al servizio web e un contenitore IOC e molta riflessione. Era impossibile.

Se l'offuscamento è davvero un requisito fondamentale, è necessario progettare l'applicazione tenendo presente questo aspetto fin dall'inizio, testando le build offuscate man mano che si procede. Altrimenti, se si tratta di un progetto abbastanza complesso, finirai con un grave dolore.


5

Crypto Obfuscator risolve tutti i tuoi dubbi e scenari. Esso:

  1. Esclude automaticamente tipi / membri dall'offuscamento in base alle regole. I tipi / campi serializzati sono uno di questi.
  2. Può essere integrato nel processo di compilazione utilizzando MSBUild.
  3. Supporta progetti ASP.Net.

3
fyi @logicnp ha scritto Crypto.
Bloke CAD,

Crypto sembra non essere più supportato.
Carl,

Ne ho provati diversi, "Crypto" sembrava molto aggressivo e utile, ma quando eseguivo la DLL offuscata in De4dot ho ottenuto il codice originale ... Mi dispiace per aver rovinato la festa ....
Dave Gahan,

4

Di recente ho provato a convogliare l'output di un offuscatore libero in un altro offuscatore libero - vale a dire Dotfuscator CE e il nuovo offuscatore Babel su CodePlex. Maggiori dettagli sul mio blog .

Per quanto riguarda la serializzazione, ho spostato quel codice in un'altra DLL e l'ho incluso nel progetto. Ho pensato che non c'erano segreti lì dentro che non fossero nell'XML, quindi non aveva bisogno di offuscamento. Se esiste un codice serio in quelle classi, l'uso di classi parziali nell'assemblaggio principale dovrebbe coprirlo.


-1, perché "yo dawg, ti ho sentito come degli offuscatori, quindi ho gestito un offuscatore sull'uscita di un offuscatore ... vuoi saperne di più? Dammi i risultati della pagina". Ma trovo che il secondo paragrafo sia un ottimo suggerimento.
ANeves,

3

Dovresti usare ciò che è più economico e meglio conosciuto per la tua piattaforma e chiamarlo un giorno. L'offuscamento di linguaggi di alto livello è un problema difficile, perché i flussi di codice operativo VM non soffrono dei due maggiori problemi che i flussi di codice operativo nativo fanno: identificazione della funzione / metodo e aliasing del registro.

Quello che dovresti sapere sull'inversione di bytecode è che è già pratica standard per i tester di sicurezza rivedere il codice X86 e trovare vulnerabilità in esso. In X86 grezzo, non puoi nemmeno trovare funzioni valide, e tanto meno tenere traccia di una variabile locale durante una chiamata di funzione. In quasi nessuna circostanza gli invertitori di codice nativi hanno accesso alla funzione e ai nomi delle variabili --- a meno che non stiano rivedendo il codice Microsoft, per il quale MSFT fornisce utili informazioni al pubblico.

"Dotfuscation" funziona principalmente per funzione di codifica e nomi di variabili. Probabilmente è meglio farlo che pubblicare codice con informazioni a livello di debug, in cui Reflector sta letteralmente rinunciando al codice sorgente. Ma qualsiasi cosa tu faccia al di là di questo rischia di ottenere rendimenti decrescenti.



3

È possibile utilizzare "Dotfuscator Community Edition", disponibile per impostazione predefinita in Visual Studio 2008 Professional. Puoi leggerlo a:

http://msdn.microsoft.com/en-us/library/ms227240%28VS.80%29.aspx
http://www.preemptive.com/dotfuscator.html

La versione "Professional" del prodotto costa ma è migliore.

Hai davvero bisogno del tuo codice offuscato? Di solito, l'applicazione viene decompilata molto poco, a meno che non venga utilizzata per motivi di sicurezza. Se sei preoccupato che le persone "rubino" il tuo codice, non esserlo; la stragrande maggioranza delle persone che guardano il tuo codice sarà a scopo di apprendimento. Ad ogni modo, non esiste una strategia di offuscamento totalmente efficace per .NET: qualcuno con abbastanza abilità sarà sempre in grado di decompilare / modificare la tua applicazione.


+1 per questo. Ho provato praticamente tutti gli offuscatori .NET gratuiti là fuori e Dotfuscator era l'unico che in realtà offuscava una parte sostanziale del MSIL nelle mie applicazioni ASP.NET.
vela

@Saille, hai usato Dotfuscator - Community Edition per questo? Ho appena fatto una chat di vendita e dicono che l'edizione pro costa 2000 euro. :(
Houman,

Dotfuscator è inutile.
user626528,

3

Evitare il reattore. È completamente inutile (e sì, ho pagato per una licenza). Xenocode è stato il migliore che abbia mai incontrato e ha acquistato anche una licenza. Il supporto è stato molto buono ma non ne ho avuto bisogno in quanto ha funzionato. Ho testato tutti gli offuscatori che ho trovato e la mia conclusione è che lo xenocodice era di gran lunga il più robusto e ha fatto il miglior lavoro (anche la possibilità di postare il tuo exe .NET in un ex nativo che non ho visto da nessun'altra parte).

Esistono due differenze principali tra reattore e xenocodice. Il primo è che Xenocode funziona davvero. Il secondo è che la velocità di esecuzione dei tuoi assiemi non è diversa. Con il reattore era circa 6 milioni di volte più lento. Ho anche avuto l'impressione che il reattore fosse un'operazione individuale.


.NET Reactor ha molte opzioni. Alcuni implicano la protezione del runtime e rallentano un po 'l'applicazione, ma questo è il prezzo per la sicurezza aggiuntiva che ottieni. Tuttavia dubito seriamente se ci sarà qualche rallentamento se utilizzerai semplicemente offuscamento di .NET Reactor, senza altre opzioni
avitenberg


2

Ho offuscato il codice nella stessa applicazione da .Net 1, ed è stato un grosso mal di testa dal punto di vista della manutenzione. Come hai detto, il problema della serializzazione può essere evitato, ma è davvero facile fare un errore e offuscare qualcosa che non volevi offuscare. È facile interrompere la build o modificare il modello di offuscamento e non poter aprire vecchi file. Inoltre, può essere difficile scoprire cosa è andato storto e dove.

La nostra scelta è stata Xenocode, e se dovessi fare di nuovo la scelta oggi preferirei non offuscare il codice o utilizzare Dotfuscator.



1

Stiamo usando SmartAssembly sul nostro client Windows. Funziona bene.

Aggiunge anche alcuni problemi extra. La stampa dei nomi delle classi in file di registro / eccezioni deve essere offuscata. E ovviamente non è possibile creare una classe dal suo nome. Quindi è una buona idea dare un'occhiata al tuo cliente e vedere quali problemi puoi ottenere offuscando.




1

Ho dovuto usare un offuscamento / protezione delle risorse nel mio ultimo rpoject e ho trovato Crypto Obfuscator come uno strumento piacevole e semplice da usare. Il problema di serializzazione è solo una questione di impostazioni in questo strumento.


@logicnp, questo è il tuo secondo post in questa discussione che approva questo prodotto. Si prega di rivelare se si ha una relazione con lo sviluppatore di questo prodotto.
H2ONaCl

Ci dispiace ma de4dot può deo-offuscarlo. Consiglierei di usare ConfuserEx .
newbieguy,

1

Esiste una buona versione open source chiamata Obfuscar. Sembra funzionare bene. Tipi, proprietà, campi, metodi possono essere esclusi. L'originale è qui: https://code.google.com/p/obfuscar/ , ma dal momento che sembra non essere più aggiornato


Ho dato un'occhiata a questo oggi - nota la data del mio commento! - ed è un po 'complicato iniziare. Ho anche perso la maggior parte dell'ora cercando di farlo firmare nuovamente l'assembly usando un file .pfx. Ha gettato un errore incomprensibile e senza documenti; sembra che puoi firmare solo usando un .snk.
SteveCinq,



0

SmartAssembly è fantastico, sono stato utilizzato nella maggior parte dei miei progetti



-1

Offuscare non è una vera protezione.

Se si dispone di un file Exe .NET, esiste una soluzione FAR migliore .

Uso Themida e posso dire che funziona molto bene.

L'unico inconveniente di Themida è che non può proteggere .NET Dlls. (Protegge anche il codice C ++ in Exe e DLL)

Themida è di gran lunga più economico degli offuscatori qui menzionati ed è il migliore lotta alla pirateria di protezione sul mercato. Crea una macchina virtuale dove vengono eseguite parti critiche del codice ed esegue diversi thread che rilevano manipolazioni o punti di interruzione impostati da un cracker. Converte .NET Exe in qualcosa che Reflector non riconosce nemmeno più come assembly .NET.

Si prega di leggere la descrizione dettagliata sul loro sito Web: http://www.oreans.com/themida_features.php


-2

Ho provato un prodotto chiamato Rummage e fa un buon lavoro nel darti un po 'di controllo ... Anche se manca molte cose che offre Eziriz ma il prezzo per Rummage è troppo buono ...

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.