Título: Creación de vacunas en C/C++ Publicado por: ghastlyX en 17 Marzo 2008, 15:33 pm Últimamente cada vez abundan más los gusanos que se propagan por MSN, por lo que me he decidido a escribir este manual sobre como programar vacunas específicas para este tipo de malware (aunque se puede extrapolar a otros). Mi objetivo es que haya más gente con capacidad de lanzar vacunas para estos gusanos cutres pero que se propagan como la espuma.
El lenguaje de programación que usaremos será C/C++ con el compilador Dev-C++, utilizando APIs. Si no sabéis que son preguntad a Google o a Wikipedia. Empezaré desde cero y ya adelanto que no voy a hacer un tutorial demasiado avanzado, puesto que quiero que lo entienda todo el mundo. Las APIs que use las explicaré por encima, para una mayor explicación podéis consultar en MSDN: http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winprog/winprog/functions_in_alphabetical_order.asp Análisis del código maligno Bien, explicaré el método más sencillo. Este consiste en utilizar una máquina virtual y con un programa llamado Regshot mirar que cambios ha realizado en el sistema tras su ejecución. No es el mejor método porque un programa bien hecho puede evitar ser registrado por programas así, pero es mucho más sencillo que el otro método (desensamblarlo) y como este manual pretende ser básico, será el método que usaremos. Lo primero de todo será instalar un programa para crear máquinas virtuales, yo personalmente uso para eso VMWare. No voy a explicar como se crea una máquina virtual, para eso mirad el siguiente enlace: http://foro.elhacker.net/index.php/topic,158384.0.html Una vez tenemos nuestra máquina virtual con el sistema operativo instalado (Windows) ya tan sólo hay que deshabilitar las conexiones (no queremos que se propague el malware ni que ataque a otros sitios mientras lo analizamos) y cerrar todo programa no imprescindible. Hacemos una primera foto con Regshot y luego otra después de haber ejecutado el malware. Entonces hacemos que compare y tendremos nuestra lista de cambios :) Comencemos a programar Antes que nada tenéis que tener instalado Dev-C++ o vuestro compilador si usáis otro, una vez hecho, vayamos al grano. Todo programa en C/C++ se divide en funciones, que son trozos de código a los que se puede llamar. Pueden devolver una salida o no (void). En C/C++ hay una función imprescindible que es main, aquella por la que empieza el programa cuando lo ejecutamos. Tiene la siguiente estructura: Código
La función main es la que menos utilizaremos, puesto que borraremos el gusano con funciones aparte, que llamaremos desde el main. Será necesario utilizar APIs, por lo que habrá que incluir el header (archivo de cabecera) que permite usarlas, que es windows.h. También queremos comunicarnos con el usuario, por lo que hace falta stdio.h (Standard Input/Output). También nos hará falta Tlhelp32.h y ctype.h (por la función toupper). Para incluir headers hay que poner las siguientes líneas al principio del código, antes que ninguna función: Código
Matando procesos y eliminando archivos concretos Para poder eliminar un archivo que se está ejecutando, es necesario matar antes su proceso. Para ello haremos una función que llamaremos KillProcess, que recibirá como entrada una cadena con el nombre del archivo al que hay que matar el proceso. Las funciones (excepto main) se declaran antes de poner el código de otra función y después de los headers incluidos. Como salida nuestra función devolvera un entero (un número) indicando si ha tenido éxito o no. Para declarar la función habría que usar la sentencia siguiente: Código
Luego también tendríamos que poner la función en sí, por lo que hasta ahora tendríamos que tener el código así: Código
Ahora veamos como matar el proceso de un archivo. Hay que declarar una serie de variables que usaremos: Código Estas son las que necesitaremos para poder matar el proceso. No hace falta que los nombres de variable (la segunda palabra) sea la misma, estos son los que usaré yo aquí. Los tipos de variable no los podéis cambiar y tened en cuenta que C/C++ distingue mayúsculas de minúsculas. Ahora tenemos que hacer como si fuera una foto de todos los procesos que se ejecutan, para ello usaremos la API CreateToolhelp32Snapshot, que tiene la siguiente forma: Código
Luego recorremos los procesos con las APIs Process32First (para el primero) y Process32Next (para los siguientes). Tienen la siguiente forma: Código
Harán falta otras APIs: Código Para hacer todo esto, traducido a código hay que hacer lo siguiente: Código
Como ya supongo que habréis supuesto, return se utiliza para terminar la función y devolver un valor. La doble barra sirve para introducir comentarios de una línea y también son comentario todo aquello entre /* y */. Además, también podéis ver que excepto el cero del final, los return devuelven cosas como ERROR_PROCESO. Esto sirve para llamar de una forma más recordable a una salida, en vez de usar un número. Para usar estos nombres, hay que definirlos antes, en la zona de los headers. Veamos todo lo que llevamos de código, incluyendo estas definiciones: Código
Bueno, ahora que ya está hecha la función de matar el proceso, vayamos con la de borrar el archivo. Usaremos una función con la misma estructura, recibe como parámetro un archivo y de salida devuelve un entero. Para seguir poniendo de manifiesto mi gran originalidad, la llamaremos FileDelete. La declaración que habría que poner junto con la de la otra función, quedaría así: Código
Para la función es muy sencillo, tan sólo hay que ver una API, que es DeleteFile: Código
El código de la función quedaría así: Código
Y el código total por ahora: Código
Realmente la función FileDelete es inútil, podríamos llamar directamente a la API, que es lo único que hace la función. Si no hago esto es porque más adelante (en próximos capítulos xD) ampliaremos esta función. Borrando valores del registro Este será el último apartado de este capítulo, el borrado de valores del registro, para por ejemplo borrar una entrada que pueda usar un gusano para autoejecutarse al inicio. Llamaremos a nuestra función RegKill, que será así: Código
Devolverá un entero largo y como parámetros recibe un HKEY, que será en este caso HKEY_CLASSES_ROOT, HKEY_CURRENT_USER, HKEY_LOCAL_MACHINE o HKEY_USERS, que son valores predefinidos; como segundo parámetro una cadena que indica la ruta de la clave donde está el valor a borrar y como tercer parámetro otra cadena que indica el nombre del valor a borrar. Usaremos tres APIs para esta función. La primera es RegOpenKeyEx, que abre una clave del registro y tiene la siguiente forma: Código
La segunda API es RegDeleteValue, que elimina un valor de una clave del registro y tiene la siguiente forma: Código
La última es RegCloseKey, que cierra el handle abierto y tiene esta forma: Código
El código de la función quedaría así: Código
Hace falta definir al inicio ERROR_OPEN_REG. Definiendo eso e incorporando el código, queda así: Código
Ahora que ya tenemos las funciones, falta ver que poner en el main. Esto variará según qué malware queramos eliminar. Imaginemos que tenemos un malware que crea el archivo siguiente: Código: C:\gusano.exe Y se autoejecuta a cada inicio con la siguiente clave: Código: HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run\Soy un gusano malo y propagador La función main deberá llamar a las tres funciones que hemos hecho: primero tendrá que matar el proceso, luego eliminar el archivo y después borrar el valor del registro. Quedaría así nuestro main de forma cutre: Código
Pero si nos hemos molestado en poner diferentes valores a las salidas es para tenerlos en cuenta, no para pasar de ellos. Hagamos un main que mire también como les va a nuestras funciones xDD: Código El hecho de que las contrabarras aparezcan duplicadas es porque la contrabarra se usa en C/C++ para las secuencias de escape (\n simboliza un salto de línea). Para poner una contrabarra, se ponen dos. Y el código entero sería así: Código
Con esto doy por acabado este primer capítulo, escribiré el siguiente cuando el tiempo lo permita, en el que explicaré como hacer más cosas. Mañana si tengo tiempo pongo un ejercicio para que podáis practicar lo aprendido. Como deberes os digo que en la función de matar procesos hay un fallo, que no es explotable ni nada, simplemente que algunos procesos según la entrada que demos no los matará. Esto para los que sepan más de C/C++. Este texto puede ser publicado en cualquier sitio siempre que no se modifique y se cite al autor y la fuente. Un saludo de ghastlyX ;) Título: Re: Creación de vacunas en C/C++ Publicado por: Hendrix en 17 Marzo 2008, 16:05 pm Muy bueno... :)
Estoy programando una aplicacion para eso mismo, para "rastrear" que cambios produce un archivo, como crear/borrar/modificar un archivo, entradas al registro, puertos, etc. Cunado pueda la posteare, aunque sera en unos dias/semanas, ya que estoy algo liado. Un Saludo y felicidades :) Título: Re: Creación de vacunas en C/C++ Publicado por: Red Mx en 17 Marzo 2008, 17:43 pm Esta exelentemente bien le comente a ghastlyX que el codigo lo podria pasar a VB asi con la API y todo pero pues biendolo bien seria inutil ya que compilando la aplicacion en C/C++ con otros parametros funcionaria perfecto.
pero pues bueno como siempre hay varias formas de hacer las cosas que me hago uno version chorreada pero que igual sirve para lo mismo dejo el codigo cabe señalar que NO uso apis solo para poner otra forma de como se podria hacer. Y bien le comente a ghastlyX que podria programar unos bichitos en VBScript , Batch , VB , C para ver su funcionamiento espero terminar algunos. por lo pronto dejo adjunto el source y el compilado aaaaa y una aplicacion que simula ser gusano.exe pero es inofenciba tanto que no se puede propagar por si sola jejeje bueno le puse un bat para que se instale el supuesto gusano . :D Título: Re: Creación de vacunas en C/C++ Publicado por: Stone_FREE_ en 17 Marzo 2008, 23:29 pm (http://www.wf-zone.us/images/smilies/huh.gif) justo andaba buscando algo así... ya mucho batch para matar virus :xD
Y una duda que hasta ahora no he podido resolver es cómo matar un proceso inmortal mediante vacunas, por ejemplo algunos troyanos que vienen con opción de persistencia y que cuando matamos el proceso, éste vuelve a aparecer en unos segundos. A esos no los puedo eliminar mas que en modo a prueba de fallos, pero yo no quiero eso, sino matarlos como lo hacen los antivirus que así sean inmortales, el antivirus igual lo mata. Hay alguna forma para hacer eso? Y otra duda... hay algunos virus que toman el nombre de procesos conocidos como explorer.exe o lsass.exe y que no se dejan matar así nomas porque windows piensa que son procesos esenciales. Con el código que has puesto se dejan matar estos procesos?. Y gracias porque ahora por fin podré hacer mis vacunas en C++ ;) Título: Re: Creación de vacunas en C/C++ Publicado por: ghastlyX en 18 Marzo 2008, 00:50 am Citar Y una duda que hasta ahora no he podido resolver es cómo matar un proceso inmortal mediante vacunas, por ejemplo algunos troyanos que vienen con opción de persistencia y que cuando matamos el proceso, éste vuelve a aparecer en unos segundos. A esos no los puedo eliminar mas que en modo a prueba de fallos, pero yo no quiero eso, sino matarlos como lo hacen los antivirus que así sean inmortales, el antivirus igual lo mata. Hay alguna forma para hacer eso? Yo es que tengo el problemilla que nunca he usado troyanos porque no me gustan nada, así que todo lo que he trabajado con ellos ha sido para cargármelos xDD. Dime alguno que haga eso y me lo miro, seguro que se pueden matar, ya miraré el sistema de autoprotección que tienen.Citar Y otra duda... hay algunos virus que toman el nombre de procesos conocidos como explorer.exe o lsass.exe y que no se dejan matar así nomas porque windows piensa que son procesos esenciales. Con el código que has puesto se dejan matar estos procesos?. Con ese código te va a dar problemas para eso, dime lo de los troyanos que dices y para el próximo capítulo a ver si hago un código que mate ambas cosas.Y para todos en general, a ver quién le ve el fallo que comentaba en el primer post a la función de matar procesos xDD Un saludo de ghastlyX ;) Título: Re: Creación de vacunas en C/C++ Publicado por: Stone_FREE_ en 18 Marzo 2008, 09:34 am Citar Yo es que tengo el problemilla que nunca he usado troyanos porque no me gustan nada, así que todo lo que he trabajado con ellos ha sido para cargármelos xDD. Dime alguno que haga eso y me lo miro, seguro que se pueden matar, ya miraré el sistema de autoprotección que tienen. Los troyanos muchas veces nos traen complicaciones para eliminarlos, actúan silenciosamente, se camuflan en otros procesos o pueden ocultar completamente su presencia en el sistema cuando vienen combinados con rootkits. Para el usuario común puede llegar a ser una tarea muy complicada eliminarlos si nuestro antivirus no pudo. Con los que he tenido mas problemas al eliminarlos de algún equipo remoto son los troyanos inmortales. Si cierras el proceso vuelve a aparecer. Se borras el archivo vuelve a aparecer. Con las entradas del registro igual. Una vacuna que pueda solucionar eso sería de gran ayuda. Los troyanos que tienen esta opción de persistencia son el bifrost y poison ivy. Te mando por privado los servers de estos troyanos para que los puedas examinar. Saludos y gracias por tu aporte Stone_FREE_ Título: Re: Creación de vacunas en C/C++ Publicado por: Proxy Lainux en 20 Marzo 2008, 23:28 pm wow... gracias por este aporte... hasta yo que apenas estoy usando C/C++ y que vengo de visual basic le entendi a la perfeccion...
gracias ;D Título: Re: Creación de vacunas en C/C++ Publicado por: ProHideSoftware en 20 Marzo 2008, 23:57 pm Esto es Excelente!
Título: Re: Creación de vacunas en C/C++ Publicado por: ~Yey~ en 21 Marzo 2008, 12:57 pm Un gran trabajo se agradece tanto la buena información como la sencillez con la que la compartes ;)
me parece una idea genial que se empiecen a tomar medidas con las propagaciones del mesenger...que ya hay demasiada proqeuria rulando por hay... gracias Título: Re: Creación de vacunas en C/C++ Publicado por: Zeroql en 1 Abril 2008, 15:34 pm EXELENTE TRABAJO... ESTA MUY interesante ademas que como vacuna tambien tiene otros usos...
me agrado gracias. Título: Re: Creación de vacunas en C/C++ Publicado por: FullDeath en 1 Abril 2008, 16:07 pm excelente aporte.
sin embargo hay cositas que no entiendo... :( :rolleyes: Título: Re: Creación de vacunas en C/C++ Publicado por: algol en 1 Abril 2008, 17:34 pm EXELENTE TRABAJO... ESTA MUY interesante ademas que como vacuna tambien tiene otros usos... me agrado gracias. Pues si habran otros posibles usos. ;D Gracias por el aporte, y la verdad estaba buscando algo para ese tipo de virus de MSN. Gracias! ;D ;D ;D Título: Re: Creación de vacunas en C/C++ Publicado por: Selfmastery en 16 Abril 2008, 20:19 pm Me ha encantado Ghastly_X. Ya estoy esperando el próximo capìtulo ;) Gracias
Título: Re: Creación de vacunas en C/C++ Publicado por: G0d_50n en 28 Julio 2008, 11:27 am exelente aporte... ::)
Título: Re: Creación de vacunas en C/C++ Publicado por: carlitos.dll en 31 Julio 2008, 21:29 pm Muy bueno. Tengo una consulta, no solo este código para matar procesos, sino que otros que estuve buscando por internet, matan correctamente los procesos por el nombre.
Sin embargo, por ejemplo, si coloco: KillProcess("calc.exe"); KillProcess("utilman.exe"); y tengo abierta la calculadora, se cierra, pero si apreto ventanita_de_wintendo+U (sale utilman.exe, pero nace doble, nace iniciado por el usuario y por SYSTEM y no puedo cerrarlo) ¿Alguien sabe alguna solución? Título: Re: Creación de vacunas en C/C++ Publicado por: skapunky en 1 Agosto 2008, 00:01 am Citar KillProcess("calc.exe"); KillProcess("utilman.exe"); Eso es una función creada...yo tengo una asi llamada = curiosamente pero que mata el proceso por el nombre..por ejemplo en vez de escribir calc.exe, seria calc a secas. Código
Título: Re: Creación de vacunas en C/C++ Publicado por: TheEGG 89 en 10 Febrero 2010, 07:41 am ghastlyX !!!! este tutorial es EXCELENTE! (perdón por las mayúscuclas XD)
realmente debo felicitarte!, mas fácil imposible!! un saludo! continúa compartiendo de esta manera ;) Título: Re: Creación de vacunas en C/C++ Publicado por: vir16 en 3 Marzo 2010, 16:23 pm Gracias por el aporte, y la verdad estaba buscando algo para ese tipo de virus de MSN. (http://www.buengolpe.com)
Título: Re: Creación de vacunas en C/C++ Publicado por: M3LiNdR1 en 11 Marzo 2010, 21:10 pm Llevo peleandome varios dias con esta función. No me compilaba, y gracias a la ayuda de Eternal Idol, he podido hacer almenos que compile.
Código
La pruebo con calc.exe per me tira un error de proceso. Tengo varia preguntas. Primero, hay una variable que no se usa. Luego PROCESSENTRY32 pe32; que es? y la ultima, vara obtener el exitcode de un proceso, primero hay que abrir el proceso?? Título: Re: Creación de vacunas en C/C++ Publicado por: ]_HQH_[ en 28 Marzo 2010, 15:15 pm Gracias por el aporte.
Título: Re: Creación de vacunas en C/C++ Publicado por: frankener1986 en 19 Abril 2010, 23:07 pm Sólo dos ideas:
- 1. además de matar el proceso, hallar la ruta del archivo que creó el proceso y eliminarlo - 2. añadir una función que descargue una DLL de todos los procesos activos para poder borrarla Título: Re: Creación de vacunas en C/C++ Publicado por: banovi en 16 Mayo 2010, 23:04 pm Genial lo necesitaba!!!!
Título: Re: Creación de vacunas en C/C++ Publicado por: Mr.Blue en 1 Julio 2010, 04:05 am Muy buen material :-*, me lo agrego a favoritos este link
Título: Re: Creación de vacunas en C/C++ Publicado por: farresito en 17 Agosto 2010, 00:22 am Que buena esta guia! En Taringa hice un post sobre tu tutorial para que los que no tuvieran muchos conocimientos pudieran hacer sus propias vacunas. Lógicamente puse que eran derechos tuyos ;)
Saludos! Sigue asi, impresionandonos :D! Título: Re: Creación de vacunas en C/C++ Publicado por: buenoymalo en 19 Agosto 2010, 06:53 am Podrias usar el admon de tareas para matar los procesos
Título: Re: Creación de vacunas en C/C++ Publicado por: Uxio en 6 Noviembre 2010, 13:29 pm Muy buen tutorial! La verdad es que C es un lenguaje con el que puedes hacer cualquier cosa.
Podrias usar el admon de tareas para matar los procesos Se trata de hacerlo desde tu programa, no vale hacerlo a clics. Título: Re: Creación de vacunas en C/C++ Publicado por: rdzlcs en 13 Enero 2011, 15:22 pm Me lo leí recién hoy por que tenia un gusano en mi ordenador :¬¬..
Muy buen tutotial me re sirvió para ver de que se trata eso de las vacunas!! Gracias y SAludos Título: Re: Creación de vacunas en C/C++ Publicado por: markosliveup en 2 Marzo 2011, 07:07 am aaaaaaaah! estoy en el laburo y no veo la hora de llegar a mi casa para agarrar el compilador!!!! ya me lo lei pero quiero verlo mas tranki.. gracias por el aporte. No cazo un fulbo de todo esto jaja gracias que se programar en C :xD
Título: Re: Creación de vacunas en C/C++ Publicado por: hackstyle18 en 12 Mayo 2011, 01:43 am Y la respuesta al problema que planteaste sobre la funcion de matar los procesos cual es? :silbar:
se me ocurre una que seria no ponerle .exe al final del nombre... pero supongo que no sera esa... xD Título: Re: Creación de vacunas en C/C++ Publicado por: adulti en 3 Febrero 2012, 07:46 am Y bien le comente a ghastlyX que podria programar unos bichitos en VBScript , Batch , VB , C para ver su funcionamiento espero terminar algunos.
http://foro.elhacker.net/seguridad/creacion_de_vacunas_en_cc-t204606.0.html#ixzz1lIZtgKNH |