Reflection e caricamento dinamico di classi
Le funzionalità di reflection e caricamento dinamico delle classi costituiscono strumenti estremamente potenti dell'architettura .NET. Questo livello di personalizzazione dei programmi di runtime impedisce a Dotfuscator di determinare esattamente se è possibile rinominare in modo sicuro tutti i tipi caricati in un determinato programma.
Si consideri il frammento di codice C# riportato di seguito.
public object GetNewType() {
Type type = Type.GetType( GetUserInputString(), true );
object newInstance = Activator.CreateInstance( type );
return newInstance;
}
L'uso di questo codice consente di caricare un tipo in base al nome e di crearne un'istanza in modo dinamico. Il nome proviene inoltre da una stringa immessa dall'utente oppure da un database di runtime, da un altro programma e così via.
Dotfuscator non è in alcun modo in grado di prevedere i nomi di tipo che verranno immessi dall'utente. La soluzione consiste nell'escludere i nomi di tutti i tipi potenzialmente caricabili. È comunque possibile eseguire la ridenominazione di metodi e campi. In questo caso, un ruolo importante è svolto dall'impostazione manuale della configurazione utente e dalla conoscenza dell'applicazione sottoposta a offuscamento con Dotfuscator.
Nella maggior parte dei casi, la situazione è meno complessa. Si consideri ad esempio una lieve variazione.
public MyInterface GetNewType() {
Type type = Type.GetType( GetUserInputString(), true );
object newInstance = Activator.CreateInstance( type );
return newInstance as MyInterface;
}
In questo caso, è evidente che è necessario escludere solo un subset di tipi, ovvero i tipi che implementano MyInterface.
© 2002-2007 PreEmptive Solutions. Tutti i diritti riservati.