Ver Mensaje Individual
  #3  
Antiguo 23-02-2007
Avatar de seoane
[seoane] seoane is offline
Miembro Premium
 
Registrado: feb 2004
Ubicación: A Coruña, España
Posts: 3.717
Reputación: 24
seoane Va por buen camino
Antes de nada, debemos de aclarar sobre que sistema estamos trabajando y el tipo de cuenta de usuario. Si estamos hablando de un Windows 98 no hay nada que hacer, es imposible proteger nada en ese sistema, no al menos sin modificar sustancialmente el propio sistema (inyecciones de código, drivers, etc ...). Solo hay que pensar que aunque creemos un superprograma de protección, un atacante solo tendría que matar el proceso y nadie se lo puede impedir.

Otra cosa es si estamos trabajando sobre un Windows 2000/XP, y con una cuenta de usuario limitada. Entonces lo primero es que nuestra aplicación se ejecute como un servicio, como un usuario limitado no puede parar ni matar un servicio por ese lado estaremos protegidos.

Una vez que estamos a salvo de algún listo, lo segundo es crear una lista de aplicaciones permitidas (lista blanca ), esto puede resultar tedioso, y nunca se sabe que aplicación puede llegar a ser necesaria en el futuro. Yo resolví el problema creando una lista de directorios permitidos, es decir, cualquier aplicación que se ejecute desde un directorio que no este en la lista sera asesinada. Como los usuarios de cuentas limitadas no puedes escribir fuera de la carpeta de su perfil (si no se especifica lo contrario), nos aseguraremos de que esa carpeta no esta en la lista de directorios permitidos. Yo utilizaba la siguiente lista:
Código:
c:\Archivos de programa\
c:\Archiv~1\
c:\Windows\
\SystemRoot\
\??\
Los dos últimos son directorios especiales que utiliza windows para algunas aplicaciones del sistema. Ahora que ya sabemos que matar y que dejar vivir solo hay que crear un bucle que examine cada pocos milisegundos la lista de procesos y si alguno no esta en un directorio de la lista lo matamos sin compasión.

También hay la versión suave, que es mandar un mensaje UDP a un servidor para que el encargado se entere de la actividad sospechosa, sin matar el proceso. Yo en mi aplicación, tenia 2 modos: normal y agresivo. En el normal, solo avisaba al encargado, en el agresivo mataba el proceso sin hacer preguntas. Se podía cambiar de un modo a otro de forma remota. El problema es si estando en modo normal, un listo desconecta el cable de red. Pues no pasa nada, mi programa lo detectaba y pasaba a modo agresivo

Por ultimo existe otra solución mucho mas efectiva, pero también muchas mas compleja de programar. Se trata de crear un Hook en la API Createproccess de tal manera que cada vez que alguien quiere ejecutar un programa, primero se ejecuta nuestro código y podemos decidir si le dejamos o no hacerlo. Para hacer esto tenemos que usar inyección de código, pero en eso seguro que ardilla te puede ayudar mas que yo.
Responder Con Cita