Ir al contenido


Foto

Prevenir que aplicación se ejecute


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

#1 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.419 mensajes
  • LocationRepública Dominicana

Escrito 17 julio 2011 - 01:51

¿Hay alguna forma de prevenir que una aplicación se ejecute luego de haber matado su proceso?, no me refiero a que no se ejecute dos veces, sino evitar que ejecute una sola vez un ejecutable específico.

Saludos.

  • 0

#2 Sergio

Sergio

    Advanced Member

  • Moderadores
  • PipPipPip
  • 1.092 mensajes
  • LocationMurcia, España

Escrito 17 julio 2011 - 04:00

Hay una librerias para hacer "hooks" de bajo nivel al sistema que te permitira atrapar el mensaje de inciar ese programa y matarlo (al mensaje) de forma que la aplicacion nunca despierte.

Se llaman MadCodeHook y busca en google por MadCollection, yo uso MadExcept en mis aplicaciones y vale la pena aunque sean de pago.

Creo que hay versiones de prueba y manuales en linea, investiga un poco pero con esos componenetes deberias poder hacerlo facilmente. Espero!
  • 0

#3 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.419 mensajes
  • LocationRepública Dominicana

Escrito 18 julio 2011 - 10:19

Gracias Sergio, investigando...

Saludos.
  • 0

#4 look

look

    Advanced Member

  • Miembros
  • PipPipPip
  • 418 mensajes
  • LocationLa Ceiba-Atlantida-Honduras

Escrito 18 julio 2011 - 11:19

Hay una llave en el registro que se llama RestrictRun si no me equivoco , en donde se crea una lista de los ejecutables que no se pueden ejecutar...
  • 0

#5 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.419 mensajes
  • LocationRepública Dominicana

Escrito 18 julio 2011 - 11:27

Hay una llave en el registro que se llama RestrictRun si no me equivoco , en donde se crea una lista de los ejecutables que no se pueden ejecutar...


Gracias Look, voy investigando sobre eso también (y)

Saludos.
  • 0

#6 escafandra

escafandra

    Advanced Member

  • Administrador
  • 4.107 mensajes
  • LocationMadrid - España

Escrito 01 agosto 2011 - 05:38

Aunque un poco tarde voy a tratar de proponer una idea.

Siguiendo la filosofía de este hilo, podemos realizar un Hook a la API indocumentada CreateProcessInternalW para bloquear toda aplicación que no nos guste.

He escrito una dll en C que lealiza un Hook a dicha API. El Hook Llama a una función Filtro definida como:



delphi
  1. function Filter(lpAppName, lpCmdLine: PCHAR): boolean; stdcall;



Dicha función debe responder con true si permitimos que la aplicación de ejecute y false en caso contrario.

En este caso la aplicación la he denominado ProcessLock.

El problema que puede aparecer es que el sistema de Hook Global usado sólo lo es para el usuario que lo realiza, no para el resto. Es por ello que se debe ejecutar ProcessLock con las credenciales del usuario que ejecutará la aplicación a bloquear, o en todos los que sean activos.


El código del Hook es el siguiente:
 


cpp
  1. typedef BOOL (__stdcall *PCreateProcessInternalW)(
  2.     HANDLE hToken,
  3.         LPCWSTR pApplicationName,
  4.         LPWSTR lpCommandLine,
  5.         LPSECURITY_ATTRIBUTES lpProcessAttributes,
  6.         LPSECURITY_ATTRIBUTES lpThreadAttributes,
  7.         BOOL bInheritHandles,
  8.         DWORD dwCreationFlags,
  9.         LPVOID lpEnvironment,
  10.         LPCWSTR lpCurrentDirectory,
  11.         LPSTARTUPINFOW lpStartupInfo,
  12.         LPPROCESS_INFORMATION lpProcessInformation,
  13.         PHANDLE hNewToken
  14.     );
  15.  
  16. typedef BOOL (WINAPI *PFILTER)(LPCSTR lpFileName, LPCSTR lpCommandLine);
  17.  
  18. HHOOK hHook;
  19. HINSTANCE HInst;
  20. HMODULE hFilter;
  21. PCreateProcessInternalW OCreateProcessInternalW = 0;
  22. PFILTER Filter = 0;
  23.  
  24. //------------------------------------------------------------------------------
  25. // Convierte cadenas Unicode y clásicas entre si
  26. char* WideCharToChar(const wchar_t* Entrada, char* Salida, unsigned int Size=-1)
  27. {
  28.   if(Entrada){
  29.     int size = Size;
  30.     if(Size==-1) size = wcslen(Entrada)+1;
  31.     WideCharToMultiByte(CP_ACP, 0, Entrada, -1, Salida, size, NULL, NULL);
  32.     return Salida;
  33.   }
  34.   else return 0; 
  35. }
  36.  
  37. // Provocamos el Hook Global. La dll se inyectará en todo el sistema de ventanas
  38. LRESULT CALLBACK HookPorc(int nCode,WPARAM wParam,LPARAM lParam)
  39. {
  40.   return CallNextHookEx(hHook, nCode, wParam, lParam);
  41. }
  42.  
  43. extern "C" __declspec(dllexport)
  44. __stdcall void Hook()
  45. {
  46.   hHook = SetWindowsHookEx(WH_CALLWNDPROC /*WH_CBT*/, (HOOKPROC)HookPorc, HInst, 0);
  47. }
  48.  
  49. extern "C" __declspec(dllexport)
  50. __stdcall void UnHook()
  51. {
  52.   UnhookWindowsHookEx(hHook);
  53. }
  54.  
  55. BOOL WINAPI HCreateProcessInternalW(
  56.     HANDLE hToken,
  57.         LPCWSTR lpApplicationName,
  58.         LPWSTR lpCommandLine,
  59.         LPSECURITY_ATTRIBUTES lpProcessAttributes,
  60.         LPSECURITY_ATTRIBUTES lpThreadAttributes,
  61.         BOOL bInheritHandles,
  62.         DWORD dwCreationFlags,
  63.         LPVOID lpEnvironment,
  64.         LPCWSTR lpCurrentDirectory,
  65.         LPSTARTUPINFOW lpStartupInfo,
  66.         LPPROCESS_INFORMATION lpProcessInformation,
  67.         PHANDLE hNewToken
  68.     )
  69. {
  70. //  Beep(1000, 100);
  71.   static Hooking = false;
  72.   if(!Hooking){
  73.     Hooking = true;
  74.     CHAR ApplicationName[MAX_PATH + 1];
  75.     CHAR CommandLine[MAX_PATH + 1];
  76.     WideCharToChar(lpApplicationName, ApplicationName);
  77.     WideCharToChar(lpCommandLine, CommandLine);
  78.     bool Filtro = Filter(ApplicationName, CommandLine);
  79.     Hooking = false;
  80.     if(!Filtro)
  81.         return false;
  82.   }
  83.  
  84.   return OCreateProcessInternalW(hToken, lpApplicationName, lpCommandLine, lpProcessAttributes,
  85.                 lpThreadAttributes, bInheritHandles, dwCreationFlags, lpEnvironment, lpCurrentDirectory,
  86.                 lpStartupInfo, lpProcessInformation, hNewToken);
  87. }
  88.  
  89.  
  90. void InstallHook()
  91. {
  92.   char FilterDLL[MAX_PATH+1];
  93.   GetModuleFileName(HInst, FilterDLL, sizeof(FilterDLL));
  94.   char *F = strrchr(FilterDLL, '\\'); *F = 0;
  95.   strcat(FilterDLL,  "\\FilterDLL.dll");
  96.   hFilter = LoadLibrary(FilterDLL);
  97.   Filter = (PFILTER)GetProcAddress(hFilter, "Filter");
  98.   InstallHook(HCreateProcessInternalW, (void**)&OCreateProcessInternalW, "Kernel32.dll", "CreateProcessInternalW");
  99. }
  100.  
  101. void UnInstallHook()
  102. {
  103.   UnInstallHook((void**)&OCreateProcessInternalW, "Kernel32.dll", "CreateProcessInternalW");
  104.   FreeLibrary(hFilter);
  105. }
  106.  
  107.  
  108.  
  109. #pragma argsused
  110. BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fwdreason, LPVOID lpvReserved)
  111. {
  112.   HInst = hinstDLL;
  113.   switch (fwdreason) {
  114.       case DLL_PROCESS_ATTACH:
  115.           InstallHook();
  116.           break;
  117.       case DLL_PROCESS_DETACH:
  118.           UnInstallHook();
  119.           break;
  120.   }
  121.  
  122.   return 1;
  123. }

Y un filtro de ejemplo en delphi que bloquea la ejecución de "cmd.exe":
 


delphi
  1. library FilterDLL;
  2.  
  3. uses
  4.   SysUtils,
  5.   Windows;
  6.  
  7. {$R *.res}
  8. type
  9. PSECURITY_ATTRIBUTES = ^SECURITY_ATTRIBUTES;
  10.  
  11.  
  12. function Filter(lpAppName, lpCmdLine: PCHAR): boolean; stdcall;
  13. var
  14.   AppName, CmdLine: String;
  15. const
  16.   App: String = 'cmd.exe';
  17. begin
  18.   Result:= true;
  19.   AppName:= StrLower(lpAppName);
  20.   CmdLine:= StrLower(lpCmdLine);
  21.   if(Pos(App, AppName)<>0) or (Pos(App, CmdLine)<>0) then
  22.     Result:= false;
  23. end;
  24.  
  25. exports Filter;
  26.  
  27. begin
  28. end.

Espero que te sea de utilidad en tu caso, en otros muchos si lo será.

Subo las dll y la aplicación de ejemplo con la que realizar pruebas.


Saludos.

Edito para arreglar etiquetas de código.

Archivos adjuntos


  • 0

#7 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.419 mensajes
  • LocationRepública Dominicana

Escrito 01 agosto 2011 - 07:37

Wow, excelente mi estimado :) (y)
  • 0

#8 Wilson

Wilson

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2.137 mensajes

Escrito 01 agosto 2011 - 07:49

Gracias Escafandra, como siempre un derroche de buen código.  (y) (y)
  • 0

#9 escafandra

escafandra

    Advanced Member

  • Administrador
  • 4.107 mensajes
  • LocationMadrid - España

Escrito 19 diciembre 2016 - 08:26

Para los que quieran ejecutar esto en Win10 han de tener en cuenta lo publicado aquí: Hook a la API CreateProcessInternalW en Win10

 

 

Saludos.


  • 0




IP.Board spam blocked by CleanTalk.