[PROYECTO]Desarrollo de un cifrador indetectable

Iniciado por ErOzE, 3 Marzo 2011, 16:02 PM

0 Miembros y 3 Visitantes están viendo este tema.

ErOzE

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

[Zero]

He pensado en esa idea varias veces pero nunca se me dió por intentarlo, no sé tampoco si hay algo parecido hecho. Podemos intentarlo, pero estaría bien plantear ideas antes, por ejempo para evitar el problema de saltos etc.

Saludos

"El Hombre, en su orgullo, creó a Dios a su imagen y semejanza.”
Nietzsche

ErOzE

Cita de: [Zero] en  3 Marzo 2011, 16:36 PM
He pensado en esa idea varias veces pero nunca se me dió por intentarlo, no sé tampoco si hay algo parecido hecho. Podemos intentarlo, pero estaría bien plantear ideas antes, por ejempo para evitar el problema de saltos etc.

Saludos
Pues si, lo importante es darle forma entre todos, pulir la idea, y todo antes de empezar siquiera el desarrollo.

Como comentario lo ultimo que digo sobre que la cabecera sea polimorfica, quiero aclarar que la aplicacion que crearia el ejecutable a partir del troyano, el archivo cifrado en cuestion, es en ese punto donde el ejecutable nuevo cifrado, tomaria la forma concreta y determinada en cada ordenador, por lo que el mismo troyano creado por uno o por otra persona, nunca tendria la misma cabecera. si con la hora como decia añadimos el numero de serie del disco duro del ordenador donde se crea el ejecutable cifrado, daria siempre como resultado un ejecutable unico y diferente.

Karcrack

Lo he leido muy rapido, asi que no se si lo he entendido completamente... El proyecto consistiria en virtualizador de codigo... es decir, las instrucciones originales serian cifradas o bien reemplazadas por otras, y luego habria una parte encargada de interpretar ese codigo ejecutando las instrucciones... Algo como esto?
http://www.oreans.com/es/codevirtualizer.php

ErOzE

#4
Cita de: Karcrack en  3 Marzo 2011, 16:53 PM
Lo he leido muy rapido, asi que no se si lo he entendido completamente... El proyecto consistiria en virtualizador de codigo... es decir, las instrucciones originales serian cifradas o bien reemplazadas por otras, y luego habria una parte encargada de interpretar ese codigo ejecutando las instrucciones... Algo como esto?
http://www.oreans.com/es/codevirtualizer.php

No, no consiste en un virtualizador de codigo, sino como se propone seria una cabecera que desencriptaria y ejecutaria el codigo del troyano poco a poco, codigo que además estaria desordenado en si mismo, además de que la propia cabecera estaria en si misma tambien desordenada.

un virtualizador esta bien para proteger codigo, pero dará como producto cuando lo utilicemos para ofuscar un troyano un producto siempre igual, que una vez que lo identifiquen los desarrolladores de antivirus, seria facilmente detectable.

Elemental Code

Vendria a ser como un descifrado progresivo instruccion por instruccion ¿?¿?
:huh: :huh:

I CODE FOR $$$
Programo por $$$
Hago tareas, trabajos para la facultad, lo que sea en VB6.0

Mis programas

ErOzE

Cita de: Elemental Code en  3 Marzo 2011, 20:14 PM
Vendria a ser como un descifrado progresivo instruccion por instruccion ¿?¿?
:huh: :huh:


Exacto, pero como se ha dicho habrá ocasiones (muchas) en las que la zona a descifrar para ser procesada, no será de una instruccion, imagina que la instruccion a ejecutar es la carga en la direccion tal de un valor que esta en la direccion tal ó el resultado de una operacion anterior, por lo que la cabecera tendria que considerar y evaluar las necesidades de las instrucciones que se van a ir procesando para ir descifrando las zonas que vayan a ser necesitadas.

Arkangel_0x7C5

la cosa reria asi, activas el flag de paso a paso, y descibras siempre en bloques de 9, luego le pasas lo descifrado a un desensamblador para que calcule y de informacion de la instrucion.....

Karcrack

Y la finalidad de descifrar instruccion por instruccion y ejecutar que ventajas tiene? :-\ Quiero decir, seria exactamente igual que hacer un crypter runtime... pero complicandolo de forma innecesaria...

ErOzE

#9
Cita de: Karcrack en  4 Marzo 2011, 13:39 PM
Y la finalidad de descifrar instruccion por instruccion y ejecutar que ventajas tiene? :-\ Quiero decir, seria exactamente igual que hacer un crypter runtime... pero complicandolo de forma innecesaria...

la finalidad principal es que nunca tendra la misma forma. esa es la ventaja. imagina que cuando creas el troyano con la cabecera de la que hablamos en tu ordenador, el codigo cifrado del troyano sera diferente que el mismo que yo generaria en mi ordenador aunque ambos usemos el mismo troyano, sin embargo cuando el troyano se esta ejecutando tanto el archivo tuyo como el mio haran lo mismo. gracias

la verdad es que la idea en si es complicada, pero poniendo un simil, imagina que el codigo del troyano fueran 10 bytes, que estarian originalmente asi, 1,2,3,4,5,6,7,8,9,0 pero una vez desordenado a la hora de cifrarlo en tu ordenador fuera en este instante 2,5,1,0,9,6,5,7,3,4,8 y ademas cifrado, logicamente tu semilla se quedara en tu cabecera para que la misma sepa el orden en que tiene que ir descifrando las instrucciones, una a una o multiples para la ejecucion del troyano, pero ojo debes pensar que un lugar en la memoria es donde esta el troyano cifrado, y otra parte reservada en la memoria de la longitud real del troyano estara llena de ceros, pero en la posicion adecuada iran apareciendo las instrucciones descifradas para ser ejecutadas, volviendolas a 0 una vez ejecutadas y apareciendo las nuevas sucesivamente pero nunca todas juntas a la vez, rompiendo por completo cualquier patron a buscar, no se si me explico correctamente o si se plasmar la idea bien para que se me entienda. a la vez que pensaba que la propia cabecera tambien cambiara de forma.
 

por cierto como funciona un crypter runtime, descrifra todo el codigo a ejecutar y luego lo ejecuta ¿no?, con lo que una vez terminado el descifrado, el codigo en abierto del troyano estaria en memoria y seria detectado con muchisima facilidad por los antivirus. ¿si ó no?, te pregunto porque no se realmente como funciona el crypter runtime de que hablas.