Informazioni sull'output offuscato
Passaggio 1 - Utilizzo di un disassembler
.NET Framework SDK viene fornito con un disassembler denominato ildasm che consente la decompilazione di assembly .NET in istruzioni in linguaggio assembly IL. Per avviare ildasm, verificare che .NET Framework SDK sia installato e presente nel percorso predefinito per le applicazioni e digitare ildasm nella riga di comando.
Nota: se l'operazione non riesce e Visual Studio risulta installato, è probabile che ildasm non sia presente nel percorso corretto. Per aprire un prompt dei comandi di Visual Studio, dal menu Start scegliere Visual Studio [versione] | Visual Studio Tools | Prompt dei comandi di Visual Studio [versione]. Digitare ildasm.
- Scegliere il menu File | Apri e cercare:
C:\Programmi\PreEmptive Solutions\Dotfuscator Professional Edition 4.0\samples\GettingStarted\bin\Debug
- Scegliere GettingStarted.exe, quindi fare clic su Apri. Viene visualizzato l'assembly disassemblato:
- Per confrontare l'applicazione HelloWorld non offuscata attualmente visualizzata con la versione offuscata, avviare un'altra copia di ildasm. Cercare:
C:\Programmi\PreEmptive Solutions\Dotfuscator Professional Edition 4.0\samples\GettingStarted\Dotfuscated
- Scegliere GettingStarted.exe, quindi fare clic su Apri.
Affiancare le finestre ildasm. Individuare somiglianze e differenze tra le due finestre.
Nell'assembly disassemblato non offuscato i nomi dei metodi sono facilmente comprensibili. Ad esempio, è possibile ipotizzare che il metodo ConverseButton_Click: void (object, class [mscorlib]System.EventArgs) venga chiamato quando si fa clic sul pulsante Converse. Si osservi ora la versione offuscata. Il metodo chiamato quando si fa clic sul pulsante Converse risulta difficile da individuare. Il metodo SaySomething è inoltre mancante: è stato rimosso in quanto non utilizzato in alcuna parte del codice.
Fare doppio clic sui metodi SayHello:string() nell'assembly originale e a:string() nell'assembly offuscato. I due metodi sono in effetti equivalenti. A un esame più attento del codice IL disassemblato, si noterà tuttavia che nella versione offuscata le stringhe sono state crittografate in modo da rendere più difficile la lettura del codice. Individuare ad esempio la riga seguente nella versione non offuscata:
IL_0000: ldstr "Hello, my name is "
Osservare ora la versione offuscata cercando di individuare la stessa stringa. L'individuazione risulta difficile in quanto la stringa è stata crittografata e ha assunto la forma seguente:
IL_0000: ldstr bytearray (09 42 26 44 29 46 2B 48 26 4A 67 4C 6D 4E 22 50
28 52 73 54 3B 56 36 58 34 5A 3E 5C 7D 5E 36 60
12 62 43 64 )
È possibile immaginare quanto ciò possa complicare la decodifica del codice, soprattutto nel caso di applicazioni più complesse.
Passaggio 2 – Decompilazione
A questo punto, si potrebbe avere l'impressione che il codice sorgente sia accessibile soltanto a una ristretta cerchia di tecnici che conoscono il linguaggio assembly IL. È tuttavia possibile ricreare il codice sorgente dall'applicazione utilizzando un decompilatore come Reflector o Anakrino. Tali utilità sono in grado di decompilare un assembly .NET risalendo direttamente a un linguaggio di alto livello, quale C#, VB .NET o C++.
In questa sezione vengono utilizzati due decompilatori disponibili gratuitamente:
- Reflector per .NET, http://www.aisto.com/roeder/dotnet/
- Anakrino (versione con interfaccia utente grafica) / Exemplar (versione con riga di comando), http://www.saurik.com/net/exemplar/
L'esecuzione di Anakrino/Exemplar sul file GettingStarted.exe offuscato con Dotfuscator genera il seguente errore:
Exemplar.exe has encountered a problem and needs to close. We are sorry for the inconvenience.
L'esecuzione di .NET Reflector sul file GettingStarted.exe offuscato con Dotfuscator e il tentativo di esaminare un metodo quale a() generano la seguente eccezione:
This item appears to be obfuscated and can not be translated.
System.NotSupportedException: Cannot resolve local variable 'Label_0047'.
at Reflector.CodeModel.Memory.GotoStatement.Resolve()
at _12.VisitBlockStatement(IBlockStatement statement)
at _111.VisitStatement(IStatement value)
at _119.VisitMethodDeclaration(IMethodDeclaration value)
at _125.VisitMethodDeclaration(IMethodDeclaration value)
at _126.VisitMethodDeclaration(IMethodDeclaration value)
at _123.VisitMethodDeclaration(IMethodDeclaration value)
at _146._1(Boolean )
Dotfuscator Professional è stato pertanto in grado di impedire la decodifica del codice offuscato da parte di due dei principali decompilatori disponibili.
© 2002-2007 PreEmptive Solutions. Tutti i diritti riservati.