Archivos de código externos
Cuando se aplica el cifrado de código a un método, Babel Obfuscator puede extraer el código cifrado de ese método y almacenarlo como un archivo binario independiente, fuera del ensamblado de destino. Este archivo binario contiene el código MSIL cifrado del método, y la BVM puede cargarlo en memoria en tiempo de ejecución cuando se llama al método.
Como el código cifrado no está presente en el ejecutable principal, puede desplegarse por separado de la aplicación. Esto hace posibles varios escenarios, entre ellos la creación de licencias basadas en funciones en las que el archivo externo con el código cifrado se despliega junto con la licencia.
Para generar archivos cifrados para métodos concretos, hay que marcar los métodos cifrados con la propiedad Source de la función «msil encryption». Así se indica a Babel qué métodos debe cifrar y extraer a un archivo independiente. La propiedad Source es una de las propiedades XML disponibles para la función «msil encryption», junto con Cache, MinInstructionCount y MaxInstructionCount (consulte Reglas XML). Al asignar un nombre único a la propiedad Source, se asocia con todos los métodos que captura la regla y se genera un archivo independiente con los datos cifrados de esos métodos.
<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>Esta regla de la función msil encryption indica a Babel Obfuscator que cifre todos los métodos de la clase Algorithms. También asigna a la propiedad Source el valor «algorithms», con lo que Babel almacena el código de bytes cifrado en un archivo externo llamado «algorithms.eil».
Cuando en tiempo de ejecución se llama a cualquier método de la clase Algorithms, la BVM necesita obtener el código de bytes cifrado almacenado en el archivo externo algorithms.eil. Para ello, la BVM busca un método con la firma siguiente:
[Obfuscation(Feature="msil encryption get stream")]
internal static Stream GetSourceStream(string source) Este método debe marcarse con el atributo System.Reflection.ObfuscationAttribute y la función «msil encryption get stream». Cuando la BVM encuentra este método, lo llama con el nombre del origen de datos cifrados asociado a los métodos cifrados (en este caso, «algorithms»). El método GetSourceStream debe devolver entonces un objeto Stream con el código de bytes cifrado del origen de datos solicitado. Después, la BVM puede descifrar y ejecutar el método solicitado.