Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Alerta en ejecucion de programas (https://www.clubdelphi.com/foros/showthread.php?t=40670)

knife_sj 23-02-2007 10:04:33

Alerta en ejecucion de programas
 
bueno, les comento mi problema
tengo un cybercafe en el cual estamos usando:
-CyberControl 4.0 para la facturacion
-Deep Freeze Enterprise 5.xxx (no recuerdo en este momento la version)

el tema es que hay un "vivo" que esta usando el fuck-deepfreeze para deshabilitar dicho programa y esta instalando keyloggers y administradores de escritorio remoto

mi idea es hacer un programa cliente-servidor que alerte cuando se ejecuta este tipo de software

por ejemplo:
yo en la pc de facturacion instalo el servidor y en las demas maquina el cliente
y quiero que cuando en el cliente se ejecute alguna aplicacion que se encuentre en la "blacklist" alerte al operador del servidor (cosa que este vaya, lo agarre de los pelos y lo patee a la calle).

eh visto muy poco, es mas, diria nada, en lo que respecta programacion con cliente servidor, pero no es ese mi problema.
mi problema es como hago para "saber" cuando se ejecuta algun programa, es decir, cuando yo hago 2ble click sobre algo: como hago para que mi programa se entere de esto y compruebe que dicho software esta permitido ejecutar.
y lo que respeca a la parte comunicacion entre el cliente y el servidor me seria de mucha utilidad saber que librerias me recomiendan para esto, estuve leyendo en delphi.about.com hay un tutorial acerca de indy y como tengo es lo que tengo a mano pensaba en usar esta libreria

les agradezco desde ya las respuestas

ArdiIIa 23-02-2007 16:42:56

Cita:

Empezado por knife_sj
mi problema es como hago para "saber" cuando se ejecuta algún programa, es decir, cuando yo hago 2ble click sobre algo: como hago para que mi programa se entere de esto y compruebe que dicho software esta permitido ejecutar.
les agradezco desde ya las respuestas

Podrías hacer algún programa/servicio para monitorizar los programas o procesos que están ejecutándose en una máquina determinada, para ello podrías utilizar las antiguar funciones ToolHelp incluidas en el API de windows, pero en este sentido creo que existen procedimientos mejores... te pongo un poco de código de ejemplo:
Código Delphi [-]
//Este procedimiento busca todos los procesos en ejecución y los añade a LISTVIEW
procedure TForm1.Button1Click(Sender: TObject);
Var
  pidProcess: array [0..1023] of DWORD;
  hProcess: DWORD;
  dwCount: DWORD;
  hMod: HMODULE;
  ModuleFileName: array[0..MAX_PATH] of Char;
  i: Integer;
  Item : TListItem;
begin
ListView1.Items.Clear;

  if EnumProcesses(@pidProcess, SizeOf(pidProcess), dwCount) then
    for i := 0 to dwCount div SizeOf(DWORD) do
    begin
    Item := ListView1.Items.Add;
    Item.Caption := IntToStr(pidProcess[i]);
    Item.SubItems.Add(GetExeName( pidProcess[i]) );
    end;
End;
***
Código Delphi [-]
//Esta funcion creo que con su nombre basta...
function GetExeName(ProcessID:DWord):string;
var ProcHandle   : THandle;
    szName       : array [0..Max_Path] of char;
    ModHandle    : HModule;
    cb,cbNeeded,
    NumModules   : DWord;
begin
  ProcHandle:=OpenProcess(PROCESS_QUERY_INFORMATION or PROCESS_VM_READ,
                          False, ProcessID);
  if ProcHandle<>0 then begin
    try
      cb:=SizeOf(ModHandle);
      if EnumProcessModules(ProcHandle,
                            @ModHandle,
                            cb, cbNeeded) then begin
        NumModules:=cbNeeded div SizeOf(HModule);
        if (NumModules>0) and (GetModuleFileNameEx(ProcHandle,
                                                   ModHandle,
                                                   @szName,
                                                   SizeOf(szName))>0)
                                then
          Result:=szName;
      end;
    finally
      CloseHandle(ProcHandle);
    end;
  end;
end;

Ahora que ya tenemos la lista de programas en ejecución (sin utilizar las Toolhep), tienes varias opciones, por ejemplo:
  • Tener en la máquina cliente una lista de programas permitidos y compararla con la lista de procesos en ejecución, si existen alguna anomalía, matar el proceso en cuestión...
  • Si elaboras un programa cliente / servidor, podrías mandar esta lista de procesos al programa servidor y que sea este el que revise los procesos de una máquina, con otra lista de procesos permitidos, y si es el caso, que avise al operario de turno para patear al intruso...

La Forma de comunicación entre máquinas y el envío de paquetes podrías hacerlo según la idea que hace algunos días me propuso seoane, el hilo está aquí.

Espero que esta información te resulte útil, esto es solamente una propuesta

seoane 23-02-2007 17:08:40

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.

ArdiIIa 23-02-2007 17:44:19

Si claro, yo como siempre asumiendo cosas y no hago consideraciones sobre el SO en lo que obviamente tienes toda la razón...

Las directrices o permisos en una cuenta limitada, supongo que será una cuestión ya prevista en un ciber...
Cita:

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.
De vuelta a la vectorización o subclassing... El otro día me enteré de que era winlogon.exe al que había que meterle mano, para aquella combinación de teclas, realmente no lo sabía, como ahora, tampoco se me pasó por la cabeza, meterle mano a la API del Createprocess. Por cierto que después estuve viendo el código del GINA y quedé, muy satisfecho con la técnica (por eso en este hilo cito las ToolHelp).
Pero vamos, de orientar al como.... a hacer una tesis doctoral sobre el asunto creo que hay bastante diferencia y mucho más considerando que este lugar: Primero no es un colegio y segundo no existe obligación alguna de dar pruebas del como y el porqué. Dicho esto, a veces me resultan molestos aquellos mensajes en los que tratas de aportar un granito de conocimiento y a partir de ahí comienzan a someterte a un "tercer grado", no se sabe con qué intenciones, por lo que seguramente habría que traspasar algunos hilos mas o menos interesantes al subforo "taberna", para que resulten mas divertidos.

Cita:

Para hacer esto tenemos que usar inyección de código, pero en eso seguro que ardilla te puede ayudar mas que yo.
Eso si que no es cierto.... :D :D :D, pero para este caso, a mi personalmente me resultaría mas tedioso de programar y a la larga mas inestable. Yo estos códigos habitualmente los utilizo para cosas muy concretas o de forma experimental. Sin embargo, si tuviera un ciber, seguramente comenzaría a pensar en forma "hacker" para programar medidas y contramedidas.
Por cierto knife_sj, también estamos hablando de este hilo, así que pido disculpas por la distracción

______

seoane 23-02-2007 17:54:45

:D Venga Ardilla, no te pongas así, solo indicaba que tu habías tratado el tema antes. No esperaba que le fueras a hacer el código ...

ArdiIIa 23-02-2007 18:06:58

Cita:

Empezado por seoane
:D Venga Ardilla, no te pongas así, solo indicaba que tu habías tratado el tema antes. No esperaba que le fueras a hacer el código ...

Si no me pongo, seone, precisamente tú, eres de los que "hacen escuela" y eres precisamente de los que NO se ponen a pedir explicaciones sobre esto o aquello.
Con respecto al código para tocar la API del CreateProccess y visto lo que hay escrito sobre el asunto, no sería difícil implementarlo, pero sigo pensando que para esta cuestión del ciber la solución mas "sencilla" y más estable y asumiendo que estamos hablando de un XP, pasa por crear las listas de "buenos y malos" y cotejarlas.

delphi.com.ar 23-02-2007 18:27:40

Se me ocurre algo, que puede ser fácilmente vulnerado, que es monitorear todo lo que se ejecute desde el shell, modificando la clave del registro HKEY_CLASSES_ROOT\exefile\shell\open\command para incluír en el valor @ una aplicación propietaria que sea la encargada de ejecutar las aplicaciones y hacer las notificaciones al mismo tiempo.

Si queres complicarla un poquito, estudiaría las librerías de ApiHook para crear un hook de las funciones CreateProcess y CreateProcessAsUser: http://www.apihooks.com/AH5.HTM o http://madshi.net/ .

Saludos!

delphi.com.ar 23-02-2007 18:30:42

Juro que cuando me puse a escribir la respuesta, y de ahí que encontré algo de código no habia mas que una respuesta!!! :D

Cita:

Empezado por seoane
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.

A este punto me refiero en mi segundo párrafo!.. Saludos!

ArdiIIa 23-02-2007 18:36:05

Cita:

Empezado por delphi.com.ar
HKEY_CLASSES_ROOT\exefile\shell\open\command para incluír en el valor @ una aplicación propietaria que sea la encargada de ejecutar las aplicaciones y hacer las notificaciones al mismo tiempo.
Saludos!

Otra solución más "manual y simplona" que se me ocurre, es ejecutar todas las aplicaciones necesarias en la shell y una vez en memoria, dejar de ejecutar el explorer.exe de este modo, no habría posibilidad alguna de ejecutar otro programa a no ser mediante el administrador de tareas....

seoane 23-02-2007 21:04:02

Cita:

Empezado por ArdiIIa
Otra solución más "manual y simplona" que se me ocurre, es ejecutar todas las aplicaciones necesarias en la shell y una vez en memoria, dejar de ejecutar el explorer.exe de este modo, no habría posibilidad alguna de ejecutar otro programa a no ser mediante el administrador de tareas....

Lo malo de eso es que se pueden ejecutar programas desde cualquier dialogo de abrir archivos, Son como mini exploradores :p

ArdiIIa 23-02-2007 21:13:08

Cita:

Empezado por seoane
Lo malo de eso es que se pueden ejecutar programas desde cualquier dialogo de abrir archivos, Son como mini exploradores :p

JEJE.. Ya me parecía demasiado simplona...:D

Caral 23-02-2007 21:27:58

Hola
Y disculpen que me meta.
Hace un tiempo seoane me enseño a esconder el escritorio y todo.
No seria mas facil en este caso hacer un explorer en delphi (creo que ya existe) y esconderle al usuario todo lo demas para que no pueda usar nada del ordenador.?
No se si puede darsele acceso a una carpeta por si quisiera bajar alguna cosa.
O es otro tema?
Saludos

delphi.com.ar 23-02-2007 21:31:31

Si lo que quieren hacer es simplemente definir que programas pueden abrir con el shell, eso lo pueden definir desde la política de seguridad, pero es totalmente vulnerable, ya solo es evaluado por el shell, e identifica los archivos por su nombre.

roman 23-02-2007 22:26:47

Cita:

Empezado por delphi.com.ar
Se me ocurre algo, que puede ser fácilmente vulnerado, que es monitorear todo lo que se ejecute desde el shell, modificando la clave del registro HKEY_CLASSES_ROOT\exefile\shell\open\command para incluír en el valor @ una aplicación propietaria que sea la encargada de ejecutar las aplicaciones y hacer las notificaciones al mismo tiempo.

Si queres complicarla un poquito, estudiaría las librerías de ApiHook para crear un hook de las funciones CreateProcess y CreateProcessAsUser: http://www.apihooks.com/AH5.HTM o http://madshi.net/ .

¿Cuál sería la vulnerabilidad del primer método?


En cuanto al segundo método, no me queda claro cómo funcionaría. Es decir, ¿qué impide que yo le ponga un nombre "aceptado" a una aplicación y ejecutarla?

// Saludos

delphi.com.ar 23-02-2007 22:35:53

Cita:

Empezado por roman
¿Cuál sería la vulnerabilidad del primer método?

Lo que ejecute desde la consola, o aplicaciones que creen otros procesos, como servicios, etc.. no son ejecutados mediante el shell


Cita:

En cuanto al segundo método, no me queda claro cómo funcionaría. Es decir, ¿qué impide que yo le ponga un nombre "aceptado" a una aplicación y ejecutarla?
Ya que estamos interceptando el proceso en su momento de creación por código, podríamos tener una lista con algun tipo de hash de los archivos para identificar si son los admitidos. Sino caeríamos en lo mismo que desde las políticas.

Saludos!

roman 23-02-2007 22:41:35

Cita:

Empezado por delphi.com.ar
podríamos tener una lista con algun tipo de hash de los archivos

¡Ah! ¡Qué bárbaro! Sencillo y eficaz. Gracias.

// Saludos

seoane 23-02-2007 22:49:18

Cita:

Empezado por roman
¿qué impide que yo le ponga un nombre "aceptado" a una aplicación y ejecutarla?

Pues que si guardamos la ruta completa del ejecutable, es imposible que dos aplicaciones tengan la misma ruta.

dec 23-02-2007 22:53:54

Hola,

¿Hablamos de un "cíber"? Entonces, ¡palo! Al que se le ocurra instalar un programa se le ofrece la vara de avellano en las espaldas.

¡Veréis como no se le ocurre instalar nada más en su vida! :D :eek: :cool: :p :rolleyes: :D :eek:

roman 24-02-2007 00:00:54

Cita:

Empezado por seoane
Pues que si guardamos la ruta completa del ejecutable, es imposible que dos aplicaciones tengan la misma ruta.

Je, je, sí, claro. Pero me gusta lo del hash porque, ¿qué impide borrar un ejecutable y poner otro con el mismo nombre en su lugar? :)

// Saludos

seoane 24-02-2007 00:29:39

Cita:

Empezado por roman
Je, je, sí, claro. Pero me gusta lo del hash porque, ¿qué impide borrar un ejecutable y poner otro con el mismo nombre en su lugar? :)

:D Hombre se trata de proteger el equipo, si el usuario va a tener permiso para borrar los programas instalados, que le va a impedir que comience a borrar programas y dejarnos el sistema destrozado. Como ya dije mas arriba, antes de meternos con cosas complicadas hay que tomar unas precauciones mínimas.

De todas formas, a mi también me gusta lo del hash :p


La franja horaria es GMT +2. Ahora son las 14:46:48.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi