Primero de todo presentarme, me he dedicado a la programación desde 1981, habiendo programado en multiples lenguajes a lo largo del tiempo, empezando con ensamblador como primer lenguaje en aquella epoca, en la actualidad me dedico a la programacion en visual basic de aplicaciones de gestion.
Quisiera plantear el desarrollo de un encriptador de ejecutables con las siguientes consideraciones.
Los encriptadores actuales utilizan de base técnicas de cifrado y desencriptacion basadas en operaciones booleanas como XOR, imagino que además sumaran muchas más medidas, lo que sí es cierto es que veo que la mayoría de los ejecutables (troyanos) son detectados por los antivirus, aunque los encriptemos con cualquiera de los programas actuales y son detectados incluso estando cifrados.
Posibles causas:
El comportamiento casi por norma es modificar el ejecutable con una cabecera (rutina de desencriptacion) que es la primera porción de código que se ejecuta, descifrando en memoria la zona de código del (troyano) para pasar a continuación a su ejecución, de tal forma que cuando el troyano es descifrado en memoria, los antivirus detectan los patrones del troyano con facilidad, siendo detectados sin remedio.
Es ilógico crear un archivo ejecutable cifrado, que no sea detectable mientras está inactivo, y sea detectable en cuanto se ejecuta, ya que los antivirus podrían utilizar no solo la búsqueda de patrones sobre los datos sin ejecutar del ejecutable, sino que podrían autoejecutarlos para comprobar cualquier mutación de una porción de la memoria donde está ubicado el archivo ejecutable para la búsqueda de patrones de troyanos, siempre siendo detectables.
Es por esto que se podría utilizar una técnica diferente en la ejecución de un troyano cifrado para hacerlo indetectable.
Primero no utilizar técnicas de cifrado XOR para cifrar o descifrar con un byte aunque sean muy rápidas, es preferible sacrificar un poco de velocidad para aumentar la efectividad.
Si el código del troyano, no la zona de datos, solo el código ejecutable mide 1500 bytes por ejemplo, podríamos invertir el orden y ponerlos en el archivo ejecutable al revés de tal forma que el primer byte sea el ultimo y el siguiente sea el antepenúltimo y así sucesivamente ó incluso utilizar un sistema de ordenación basado en una semilla aleatoria para enrevesar mas el asunto, además de que el byte en cuestión lo xoreemos con 3 números diferentes en vez de con un solo numero, (posteriormente lo tendríamos que desxorear con el 3er numero, después con el 2º numero y por ultimo con el 1er numero para obtener el byte correcto) ó utilizar otra técnica de cifrado o desencriptacion posible, aunque esto ultimo realmente no es lo importante, lo importante es la desordenacion cifrada del codigo del troyano para hacerlo mas indetectable.
Lo realmente importante sería lo siguiente, el código ejecutable del troyano está compuesto de instrucciones cada una de ellas de una longitud en bytes diferente, las habrá de diferentes longitudes, por esto podríamos buscar la instrucción más larga de todo el código ejecutable y tomarla como patrón de tal forma que podríamos modificar el código ejecutable para ajustar todas las instrucciones a la longitud máxima que hemos determinado, que quiero decir con esto, si hay una longitud máxima de una instrucción de pongamos 9 bytes, rehacer todas las instrucciones a 9 bytes de longitud con NOP (no operacionales) aumentando la longitud del código ejecutable del troyano de 1500 a por ejemplo 2900 después de ajustar todas las instrucciones, ¡para que hacemos esto!, por un lado para desvirtuar los patrones que buscan los antivirus y por otro lado para utilizar una técnica de ejecución del troyano diferente a la utilizada en la actualidad, haciendo lo siguiente la cabecera de nuestro ejecutable contendría una rutina de desencriptacion y ejecución del código del troyano por partes, o sea se descifra solamente una instrucción que como habíamos dicho era de 9 bytes por ejemplo y se ejecuta la misma, después se descifra la siguiente instrucción y se ejecuta, siguiendo el orden según hayamos establecido por ejemplo seudoaleatorio, hasta el final de tal forma que nunca revelamos la totalidad del código del troyano en ningún momento, solo desciframos cada instrucción una a una para ser ejecutada, para hacer esto hay que tener en cuenta que no interactuemos con la pila ni con el contenido de los registros del microprocesador (haciendo copias de respaldo), de tal forma que cuando desencriptemos una instrucción y la ejecutemos, los registros y la pila estén en el mismo estado para la siguiente instrucción y así la ejecución del troyano sea limpia y sin errores.
Es normal que este proceso provoque una perdida sustancial de la velocidad de ejecución del troyano pero será a costa de que la ejecución del troyano no sea detectada.
Es de lógica que la detección por parte de los antivirus no solamente sea del código que se está ejecutando sino también del comportamiento de los ejecutables al nivel de que hacen en el sistema, por lo que podríamos decir que la detección del troyano podría existir, aunque esto habría que dejarlo para hacer pruebas sobre los diferentes antivirus y comprobar que es lo que detectan si detectan algo y la efectividad de la técnica utilizada.
Inconvenientes de la rutina:
Debido a que la ejecución de código no siempre es lineal, por lo que se realizan saltos condicionales o relativos (etc.), no siempre sería posible la ejecución así a la ligera de instrucción por instrucción, por lo que sería necesario tener en consideración cual es la instrucción a ejecutar para poder evaluar si es o no posible ejecutarla, o habría que descifrar por adelantado otras partes del código cifrado, no sé en la actualidad cuantos opcodes habría que tener en cuenta para poder determinar la ejecución de la instrucción o tomar otras medidas para poder seguir con la ejecución del código, aquí es donde radica la complejidad de esta rutina de ejecución, todo esto que digo siempre debeis tener en cuenta que hace mucho tiempo que no programo en ensamblador y seguramente hay temas actuales que no tomo en consideracion, pido perdon por adelantado.
A tener en cuenta:
La cabecera encriptadora/desencriptadora/ejecutadora debería ser polimórfica, dividiendo la misma en minimodulos(subrutinas independientes) movibles, creando multiformas en la memoria durante su ejecución para evitar formar parte de un “patrón” detectable por los antivirus, la ordenacion de los minimodulos tendria que ser generada tambien a traves de una semilla aleatoria, pero nunca partiendo de una semilla original, empezando con una semilla por ejemplo a partir de la hora minutos y segundos del reloj, y cambiando a partir de cada momento de la misma forma, o sea completamente aleatoria y casi infinita en formas, esto seria rizar el rizo.
Quisiera que comentarais que pensais para darle forma a la idea, ademas de si hay interes en desarrollar la idea.
Un saludo a todos/as y muchas gracias
ErOzE