File di codice esterni
Quando la cifratura del codice viene applicata a un metodo, Babel Obfuscator può estrarre il codice cifrato di quel metodo e memorizzarlo in un file binario separato, fuori dall’assembly target. Questo file binario contiene il codice MSIL cifrato del metodo e può essere caricato in memoria dalla BVM in fase di esecuzione, quando il metodo viene chiamato.
Poiché il codice cifrato non è presente nell’eseguibile principale, può essere distribuito separatamente dall’applicazione. Questo apre diversi scenari, tra cui la creazione di licenze basate sulle funzionalità, in cui il file esterno con il codice cifrato viene distribuito insieme alla licenza.
Per generare file cifrati per metodi specifici devi contrassegnare i metodi cifrati con la proprietà Source della funzionalità “msil encryption”. In questo modo indichi a Babel quali metodi cifrare ed estrarre in un file separato. Source è una delle proprietà XML disponibili per la funzionalità “msil encryption”, insieme a Cache, MinInstructionCount e MaxInstructionCount (vedi Regole XML). Assegnando un nome univoco alla proprietà Source puoi associarlo a tutti i metodi selezionati dalla regola e generare un file separato che contiene i dati cifrati di quei metodi.
<Rule name="encrypt algorithms" feature="msil encryption" exclude="false">
<Target>Methods</Target>
<Pattern>ACME.Algorithms::*</Pattern>
<Properties>
<Source>algorithms</Source>
</Properties>
<Description>Encrypt code in Algorithms class.</Description>
</Rule>Questa regola per la funzionalità msil encryption indica a Babel Obfuscator di cifrare tutti i metodi della classe Algorithms. Imposta inoltre la proprietà Source su “algorithms”, così Babel memorizza il bytecode cifrato in un file esterno chiamato “algorithms.eil”.
Quando in fase di esecuzione viene chiamato un metodo qualsiasi della classe Algorithms, la BVM deve recuperare il bytecode cifrato memorizzato nel file esterno algorithms.eil. Per farlo, la BVM cerca un metodo con la seguente firma:
[Obfuscation(Feature="msil encryption get stream")]
internal static Stream GetSourceStream(string source) Questo metodo deve essere decorato con l’attributo System.Reflection.ObfuscationAttribute e con la funzionalità “msil encryption get stream”. Quando la BVM trova questo metodo, lo chiama con il nome dell’origine dei dati cifrati associata ai metodi cifrati (in questo caso “algorithms”). Il metodo GetSourceStream deve quindi restituire un oggetto Stream che contiene il bytecode cifrato dell’origine dati richiesta. A quel punto la BVM può decifrare ed eseguire il metodo richiesto.