Ir al contenido


Foto

Activar y/o desactivar aplicaciones instaladas


  • Por favor identifícate para responder
11 respuestas en este tema

#1 yusnerqui

yusnerqui

    Newbie

  • Miembros
  • Pip
  • 7 mensajes

Escrito 23 julio 2010 - 09:38

Hola, primero que todo felicitarlos por el proyecto, he estado alejado de Internet en estos últimos tiempos y he tenido que dedicar horas de lectura para ponerme más o menos al día con las cosas que han sucedido por acá

Bueno ahora a mi problema, resulta que tengo que hacer un proyecto para la persona que atiende los usuarios de un Joven Club de Computación,,,, creo que, para que me entiendan,  es algo parecido a un ciber café, solo que no se paga por los servicios, pero bueno eses es otro tema.

Al entrar el usuario se le debe habilitar remotamente la PC que va a usar y habilitarle los softwares que podrá utilizar, quedando deshabilitado el resto de los softwares.

Ejemplo llega un usuario a escribir un informe, en la máquina de quien lo atiende estará el “software” administrador con todas las PCs disponibles, selecciona una y le aparecen todas las aplicaciones que tiene instalada, (ha aquí no tengo problemas), le “activa el Word” y el usuario al llegar a la PC solo podrá ejecutar el Word, no pudiendo acceder al resto de las aplicaciones.

De entrada se que tengo que tener una aplicación corriendo en las PC clientes que se comunique con la aplicación servidor, preferentemente un servicio OK, eso no es difícil, según he leído, tengo dos vías, una que pudiera ser buscar constantemente las ventanas en ejecución y si alguna no es del proceso (winword en el ejemplo) pues que la cierre, eso aunque no lo se hacer ahora mismo, creo que con la documentación que he bajado y algunos trucos de la pagina del moderador de este foro no será difícil. Pero se me hace que es un poco chapuzo. :sad:

La otra creo que es la solución más elegante, y que está de moda; sería crear un dll que inyectara código vaya usted a saber donde, y que detectara cuando se va a ejecutar una aplicación cualquiera, comparando si pertenece a un programa de los que está autorizado o no y actuando en consecuencia.

Es posible hacer esto?? :huh:

Perdonen lo largo del post, es que llevo días con este proyecto y necesitaba desahogarme  :cheesy:
  • 0

#2 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14.446 mensajes
  • LocationMéxico

Escrito 23 julio 2010 - 09:46

Hola yusnerqui

Bienvenido a DelphiAccess.

Ahora mismo no tengo idea de como poder hacer lo que deseas, sin embargo, seguro uno de nuestros amigos te ayudará.

Salud OS

PD, Es un gusto verte por acá (y)
  • 0

#3 yusnerqui

yusnerqui

    Newbie

  • Miembros
  • Pip
  • 7 mensajes

Escrito 23 julio 2010 - 10:08

Muchas gracias, quiero aclarar que la parte del servidor ya lo tengo trabajando, solo me falta la parte del cliente, es decir un servicio que intercepte las aplicaciones que se van a ejecutar y que permita o no su ejecución.

Gracias nuevamente

Saludos
  • 0

#4 Wilson

Wilson

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2.137 mensajes

Escrito 23 julio 2010 - 11:18

De pronto te sirve algo como esto:



delphi
  1. var
  2.   WindowName: Integer;
  3.   ProcessId: Integer;
  4.   ThreadId: Integer;
  5.   buf: PChar;
  6.   HandleWindow: Integer;
  7.   Write: Cardinal;
  8.  
  9. {....}
  10.  
  11. const
  12.   WindowTitle = 'Nombre del programa en cuestión';
  13.   Address = $A662D6;
  14.   PokeValue = $4A;
  15.   NumberOfBytes = 2;
  16.  
  17. {....}
  18.  
  19.  
  20. procedure TForm1.Button1Click(Sender: TObject);
  21. begin
  22.   WindowName := FindWindow(nil, WindowTitle);
  23.  
  24.   if WindowName = 0 then
  25.   begin
  26.     MessageDlg('Programa dessactivado.', mtWarning, [mbOK], 0);
  27.   end;
  28.  
  29.   ThreadId := GetWindowThreadProcessId(WindowName, @ProcessId);
  30.   HandleWindow := OpenProcess(PROCESS_ALL_ACCESS, False, ProcessId);
  31.  
  32.   GetMem(buf, 1);
  33.   buf^ := Chr(PokeValue);
  34.   WriteProcessMemory(HandleWindow, ptr(Address), buf, NumberOfBytes, Write);
  35.   FreeMem(buf);
  36.   CloseHandle(HandleWindow);
  37. end;


  • 0

#5 seoane

seoane

    Advanced Member

  • Administrador
  • 1.259 mensajes
  • LocationEspaña

Escrito 23 julio 2010 - 03:00

Como dijo Jack el destripador "vamos por partes"  :D

Lo primero es que tienes razón en que matar los procesos una vez empezados es una chapuza. Aunque es muy simple de implementar (muchísimo mas fácil en delphi que en C  ;) ) y es muy efectivo, porque no tendrán forma de librarse (a no ser que sea una aplicación programada de forma maliciosa, pero eso ya es otra historia). Yo te aconsejaría que no la desecharas, sino que la dejaras como un sistema de apoyo., si se salta la primera protección lo rematas con esto  :D

Pero vamos al asunto, yo lo que haría para empezar es cambiar la forma en que el sistema abre los archivos con extensión .exe. Es tan simple como cambiar la asociación de esta extensión para que apunte a nuestro ejecutable, así cada vez que alguien intente abrir un ejecutable el que se ejecutara sera el nuestro pasándonos como parámetro el otro, dejándonos decidir si lo queremos ejecutar o no. Esto no impedirá que alguien ejecute un programa desde la linea de comandos, por ejemplo, pero para esos casos la "rematamos" con lo que hablamos en el párrafo anterior.

En cuanto al control remoto yo instalaria un servidor de base de datos, mysql por ejemplo, en el ordenador principal, y en cada uno de los ordenadores clientes el programa solo tendría que enviar simples consultas "select" contra el servidor para saber que programas están permitidos, así nos ahorramos todo el tema de red.

Como ves el tema da para mucho, y si lo quieres hacer a lo grande tienes razón en pensar que el camino es inyectarse en todos y cada uno de los procesos que se ejecutan en el ordenador e interceptar cada una de las llamadas a las API de crear procesos. Puede que el amigo escafandra te pueda echar una mano con eso, por mi parte lo veo demasiado complicado.


  • 0

#6 yusnerqui

yusnerqui

    Newbie

  • Miembros
  • Pip
  • 7 mensajes

Escrito 23 julio 2010 - 03:29

Muchas gracias por el tiempo dedicado
Wilson:
pruebo tu código y te cuento, creo que al menos para el "remate" que me propone domingo me va a servir, confieso que en este tema de la API y los proceso de Windows soy muyyyy inexperto

Domingo: Llevo varios días leyendo tus post y revisando los trucos de tu Web, quiero agradecerte por publicar tan valiosa información, y de hecho queda descartada la idea de "hacerlo a lo grande" pues si tú lo ves complicado....

voy a tratar de implementar la otra variante, la de cambiar el modo en que Windows ejecuta los programas ejecutables,,,, claro me llevará otro poco de investigación porque ahora mismo recuerdo que por el registro Windows asocia las extensiones a los programas ejecutables y cambiando eso yo pudiera hacer que por ejemplo al ejecutar un .doc se abriera mi aplicación y esta decidera si abre el Word o no, ahora, eso que me planteas, los .exe,  ahora mismo no tengo ni idea.

en cuanto a lo de las bases de datos, si, estoy muy de acuerdo contigo, con un par de tablitas y unos selects resuelvo el problema de las listas negras siempre y cuando no me desconecten el cable de red, pero eses es ya otro tema, en ese caso pasaría a un "modo agresivo" eso lo aprendí de un medio policía amigo mío ;) bueno no doy más lata
Gracias nuevamente

Saludos

  • 0

#7 yusnerqui

yusnerqui

    Newbie

  • Miembros
  • Pip
  • 7 mensajes

Escrito 30 julio 2010 - 09:10

Bueno pues les comento que despues de mucho he logrado poco, ha tal punto que he logrado replantear el proyecto, manteniendo lo que ya tengo hecho en el administrador, y que el cliente haga algo parecido al ejemplo del amigo seoane publicado en esta web http://delphi.jmrds.com/?q=node/47

Yo lo he tratado de traducir a delphi, pero se le hace muy difícil a alguien que nunca ha tocado el C tanto así que las funciones que he logrado traducir empíricamente no compilan pero no trabajan :(

Alguien me puede ayudar con esta traducción.... Se que es vastante trabajo, pero en fin si alguien se anima creo que sería un código muy interesante que le puede servir a muchos.

De Antemanos muchas gracias.

Saludos Yusnerqui


  • 0

#8 pcicom

pcicom

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 267 mensajes
  • LocationMéxico

Escrito 30 julio 2010 - 10:04

En Teoria es algo como esto lo que deberias de hacer, creo que muy simple.
2 Programas Base y una BASE de DATOS.
Base de Datos.      Instalado en el Servidor
Primer Programa.    Instalado en el Serviror
Segundo Programa. Instalado en las PCS

El Primer PROGRAMA pediria..
* Numero de ID de la PC a Usar
* Usuario
* Lista de Programas a Utilizar.
* Estatus de ACTIVADO/DESACTIVADO

Esta informacion la GRABARA en la BASE DE DATOS,

Segundo Programa.
Al Activarse CONSULTARA la BASE DE DATOS segun el ID de la PC y listaria los programas que pueden UTILIZAR.
Aqui podrias tener 2 OPCIONES
    1.  Presentarle un MENU para que unicamente EJECUTE los programas AUTORIZADOS
    2.  Que pueda tener acceso a todos los PROGRAMAS DEL PC

El Segundo PROGRAMA estara EJECUTANDOSE como un GUARDIAN.. y en el momento que el PROGRAMA que EJECUTA no este dentro de los LISTADOS lo NOTIFIQUE y lo CIERRE..

Creo que de esta manera se hace un poco mas SIMPLE esto..

SALUDOS..








  • 0

#9 IcebergDelphi

IcebergDelphi

    Advanced Member

  • Moderadores
  • PipPipPip
  • 176 mensajes
  • LocationVillaflores, Chiapas, Mexico

Escrito 30 julio 2010 - 11:09

Bueno pues les comento que despues de mucho he logrado poco, ha tal punto que he logrado replantear el proyecto, manteniendo lo que ya tengo hecho en el administrador, y que el cliente haga algo parecido al ejemplo del amigo seoane publicado en esta web http://delphi.jmrds.com/?q=node/47

Yo lo he tratado de traducir a delphi, pero se le hace muy difícil a alguien que nunca ha tocado el C tanto así que las funciones que he logrado traducir empíricamente no compilan pero no trabajan :(

Alguien me puede ayudar con esta traducción.... Se que es vastante trabajo, pero en fin si alguien se anima creo que sería un código muy interesante que le puede servir a muchos.

De Antemanos muchas gracias.

Saludos Yusnerqui



Hola amigo, no muy te he entendido lo que quieres hacer, me imagino que quieres saber que ejecutable de los que tiene abierto el Cliente te los muestre en Tu aplicacion servidor algo asi?

Para esto debes de manejar Hilos o Threads en Ingles, para monitoriar lo que pasa en la maquina cliente.

Se me ocurre hacer una mezcla de lo que te han dicho los compañeros usando una BD, para que puedas Filtrar solo lo que se este ejecutando al momento.

Bueno en fin espero un poquito mas de explicacion jjej, pero vete al area de descargas y checa mi codigo ( MANEJO DE HILOS DE EJECUCION)  a lo mejor de ahi puede partir o puedes mezclar ya tus ideas, saludos.

Por Cierto el Codigo que subi maneja una DLL ,para monitorear que ejecutable se abrio y  cual se cerro.


  • 0

#10 yusnerqui

yusnerqui

    Newbie

  • Miembros
  • Pip
  • 7 mensajes

Escrito 30 julio 2010 - 03:23

Ok muchachos, muchísimas gracias por su tiempo y consejos, les cuento que efectivamente, ya el módulo del servidor lo tengo bastante adelantado, se conecta a una base de datos mysql donde define por cada servicio solicitado cuales son las aplicaciones permitidas.
Ahora estoy trabajando en el módulo del cliente que será un servicio, que se instalará desde el propio servidor y notificará a este cuando un usuario abre un programa que no le esté permitido (revisaré tu dll para ver si me ayuda en esto amigo IcebergDelphi) y el encargado decidirá si lo deja usarlo o no, teniendo la posibilidad de mandar a cerrar dicha aplicación o incluso de apagarle la PC en caso necesario.

Ahora lo curios es que casi todo lo que respecta al cliente lo hace  el soft del amigo domingo cuyo código está referenciado en el hilo anterior, por lo menos todo lo que a trabajo con la API respecta, solo que el código está en c. de ahí mi solicitud.

Gracias nuevamente, y disculpen tanta cháchara, yo sigo, como decimos acá en Cuba, Guapeando.

Saludos

  • 0

#11 escafandra

escafandra

    Advanced Member

  • Administrador
  • 4.107 mensajes
  • LocationMadrid - España

Escrito 01 agosto 2010 - 05:37

...y si lo quieres hacer a lo grande tienes razón en pensar que el camino es inyectarse en todos y cada uno de los procesos que se ejecutan en el ordenador e interceptar cada una de las llamadas a las API de crear procesos. Puede que el amigo escafandra te pueda echar una mano con eso, por mi parte lo veo demasiado complicado.

seoane, sin negar que el tema es complejo has sido muy modesto en tu apreciación ya que creo que eres perfectamente capaz de realizar lo que propones.

Por mi parte decir que esta vía puede tener solución en modo usuario o modo kernel y en ambos casos deberemos realizar un Hook a la API. En modo Kernel el Hook será a ZwCreateProcess y en modo usuario a CreateProcessInternalW que es la llamada a la que terminan confluyendo todas las API que tratan de crear un proceso. Estas APIs no están documentadas. Su declaración es como sigue:



cpp
  1. NTSTATUS ZwCreateProcess(PHANDLE ProcessHandle,
  2.                         ACCESS_MASK DesiredAccess,
  3.                         POBJECT_ATTRIBUTES ObjectAttributes,
  4.                         HANDLE ParentProcessHandle,
  5.                         BOOLEAN InheritObjectTable,
  6.                         HANDLE SectionHandle,
  7.                         HANDLE DebugPort,
  8.                         HANDLE ExceptionPort)




cpp
  1. BOOL
  2. WINAPI
  3. CreateProcessInternalW(HANDLE hToken,
  4.                       LPCWSTR lpApplicationName,
  5.                       LPWSTR lpCommandLine,
  6.                       LPSECURITY_ATTRIBUTES lpProcessAttributes,
  7.                       LPSECURITY_ATTRIBUTES lpThreadAttributes,
  8.                       BOOL bInheritHandles,
  9.                       DWORD dwCreationFlags,
  10.                       LPVOID lpEnvironment,
  11.                       LPCWSTR lpCurrentDirectory,
  12.                       LPSTARTUPINFOW lpStartupInfo,
  13.                       LPPROCESS_INFORMATION lpProcessInformation,
  14.                       PHANDLE hNewToken)



El modo kernel es mas compacto y global, y no requiere de inyecciones consumiendo menos recursos, aunque es muy dependiente del S.O. que esté instalado y puede ser detectado como un código malicioso por algunos A.V.

El modo usuario requiere la inyección de una dll en todos los procesos, si pretendemos ser escrupulosos.
Existe un método para obligar Windows XP a que cargue en todos los procesos (que usen user32.dll) nuestra dll. Para ello debemos escribir en el Registro, en la clave:


delphi
  1. HKEY_LOCAL_MACHINE/software/microsoft/windows nt/currentversion/windows

un valor llamado AppInit_DLLs del tipo REG_SZ el nombre de la dll a cargar.

En la dll deberemos implementar el Hook a la API CreateProcessInternalW.

La forma de realizar el Hook puede desarrollarse a partir de este magnífico artítulo de seoane en el que expone la realización de un Hook a la API mediante la alteración de la IAT. La única pega que se le puede poner a este excelente método es que si el programa la carga la API dinámicamente no funciona el Hook en las llamadas a ese puntero. La forma mas segura de realizar el Hook a la API es sobrescribir sus primeros bytes para provocar un salto a nuestro código, pero dado que con las distintas actualizaciones de Windows en diferentes PC dan como resultado APIs con código asm diferente, nuestro sistema de hook se debe complicar un poco, para que sea capaz de desensamblar esos primeros bytes.

Me gustaría añadir una referencia a este hilo en el que cHackAll realiza un Hook a la API CreateProcessInternalW aprovechando el cambio del valor del salto en la primera instrucción call, creo recordar.

Dado que yusnerqui da por cancelada esta vía no tiene mucho sentido continuarla. En definitiva sólo quería hacer estas aclaraciones tras la alusión de seoane y esclarecer porqué Domingo lo califica de un tema complejo.


Saludos.

PD/ Añado la declaración de ZwCreateProcess para el modo Kernel

  • 0

#12 yusnerqui

yusnerqui

    Newbie

  • Miembros
  • Pip
  • 7 mensajes

Escrito 01 agosto 2010 - 07:11

:$$$: Sin palabras,  8o| (li)

Bueno después de esta canalización de sentimientos gráfica, que si les soy sincero me ha salido del alma, solo me resta agradecer al amigo escafandra por esa magistral intervención. Agregar que estoy realmente impresionado, tanto por el nivel de los foreros del club, que desde mi punto de vista, está muy, muy alto, como por el tiempo que dedican a las respuesta que se manifiesta en la calidad de las mismas.

Quiero agradecerles por todas estas clases que me han dado, porque considero que han sido eso, verdaderas clases de programación para la API, y felicitarlos pro esta magnífica comunidad que está surgiendo.

Yo sigo enfrascado en el proyecto, y los mantendré al tanto de los pasos de avance, por supuesto que este hilo junto con los artículos que cita lo guardaré dentro de mis "tesoros digitales" :smiley:, pues lo que no sirva para este proyecto, servirá para estudios futuros, pues me ha motivado mucho estos temas de trabajo con la API, era algo que desconocía, pero me doy cuenta que es muy interesante.

Reitero mi agradecimiento.

Saludos

  • 0




IP.Board spam blocked by CleanTalk.