Como menciono en un comentario, esto es posible en .NET usando el espacio de nombres mágico System.Reflection.Emit. Simplemente crea un nuevo DynamicMethod y emite códigos de operación [válidos], y luego llama a Invoke.
He pasado las últimas horas tratando de crear un escaparate simple para un programa "limpio" que crearía nuevas copias de sí mismo con código il cifrado. El enfoque que elegí fue tener un método Exec, tomar los il-bytes (usando MethodBase.GetMethodBody), encriptarlos y emitir un nuevo ensamblado con la clave iv + y los bytes cifrados. El método principal se descifraría, crearía un nuevo DynamicMethod, llamaría al DynamicILInfo.SetCode y con suerte funcionaría. No lo hizo.
La cosa de cifrado/descifrado funcionó, y mi código emitido fue correcto. Sin embargo, parece que no puede tomar los bytes brutos de un ensamblaje y simplemente ejecutarlos en otro.
Datos (de BitConverter.ToString) de la ejecución A y ejecución B.
A: 28-01-00-00-0A ...
B: 28-11-00-00-0A ...
A menos que sepa los valores de bytes para cada código de operación, abra ILDAsm, elija Ver> Mostrar bytes. También hay una vista> Mostrar valores de token que también ayuda a eliminar errores. Presione ctrl-m para Ver> MetaData> ¡Mostrar! para resolver tokens y otras criaturas mágicas.
"28 01 00 00 0A" -> LLAMADA 0A000001 -> [Según ctrl-m] MethodBase.GetCurrentMethod
Estos valores simbólicos diferentes se generan secuencialmente por el compilador. Esto significa que es imposible garantizar que todo funcione con bytes sin formato. Solo piense en el caso común en el que el compilador solo creó tokens para cada llamada de método requiere descifrar su matriz de bytes, y usted llama a Console.WriteLine en su código cifrado. No se escribe dicho token, y obtendrá una "BadImageFormatException: Bad binary signature" al invocar su método dinámico.
lo dejo como tarea para la lectura (o hasta que estoy aburrido de nuevo) para transformar la matriz de bytes, durante el proceso de emisión, a un formato que el descifrador puede leer y emiten de bytes il reales. El proceso de emisión creará todos los tokens necesarios, por lo que debería funcionar.
Si desea alejarse de todo lo maravilloso de emitir códigos de operación, realice una compilación dinámica a partir de código almacenado como cadenas (que, por supuesto, puede cifrarse). Esto, sin embargo, pierde tanto inteligencia, frescura y todo lo demás que se puede utilizar para medir la genialidad pura del desarrollador (¡USTED!). Consulte this tutorial para ver rápidamente la compilación dinámica y la ejecución de C# dentro de las cadenas.
¿Qué es el motor polimórfico? – OscarRyz
Supongo que el motor polimórfico tiene algo que ver con la frase de run-on? :) –
¿Está planeando codificar virus administrados? :) –