Prevenir que aplicación se ejecute
#1
Escrito 17 julio 2011 - 01:51
Saludos.
#2
Escrito 17 julio 2011 - 04:00
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!
#3
Escrito 18 julio 2011 - 10:19
Saludos.
#4
Escrito 18 julio 2011 - 11:19
#5
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
Saludos.
#6
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:
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:
typedef BOOL (__stdcall *PCreateProcessInternalW)( HANDLE hToken, LPCWSTR pApplicationName, LPWSTR lpCommandLine, LPSECURITY_ATTRIBUTES lpProcessAttributes, LPSECURITY_ATTRIBUTES lpThreadAttributes, BOOL bInheritHandles, DWORD dwCreationFlags, LPVOID lpEnvironment, LPCWSTR lpCurrentDirectory, LPSTARTUPINFOW lpStartupInfo, LPPROCESS_INFORMATION lpProcessInformation, PHANDLE hNewToken ); typedef BOOL (WINAPI *PFILTER)(LPCSTR lpFileName, LPCSTR lpCommandLine); HHOOK hHook; HINSTANCE HInst; HMODULE hFilter; PCreateProcessInternalW OCreateProcessInternalW = 0; PFILTER Filter = 0; //------------------------------------------------------------------------------ // Convierte cadenas Unicode y clásicas entre si char* WideCharToChar(const wchar_t* Entrada, char* Salida, unsigned int Size=-1) { if(Entrada){ int size = Size; if(Size==-1) size = wcslen(Entrada)+1; WideCharToMultiByte(CP_ACP, 0, Entrada, -1, Salida, size, NULL, NULL); return Salida; } else return 0; } // Provocamos el Hook Global. La dll se inyectará en todo el sistema de ventanas LRESULT CALLBACK HookPorc(int nCode,WPARAM wParam,LPARAM lParam) { return CallNextHookEx(hHook, nCode, wParam, lParam); } extern "C" __declspec(dllexport) __stdcall void Hook() { hHook = SetWindowsHookEx(WH_CALLWNDPROC /*WH_CBT*/, (HOOKPROC)HookPorc, HInst, 0); } extern "C" __declspec(dllexport) __stdcall void UnHook() { UnhookWindowsHookEx(hHook); } BOOL WINAPI HCreateProcessInternalW( HANDLE hToken, LPCWSTR lpApplicationName, LPWSTR lpCommandLine, LPSECURITY_ATTRIBUTES lpProcessAttributes, LPSECURITY_ATTRIBUTES lpThreadAttributes, BOOL bInheritHandles, DWORD dwCreationFlags, LPVOID lpEnvironment, LPCWSTR lpCurrentDirectory, LPSTARTUPINFOW lpStartupInfo, LPPROCESS_INFORMATION lpProcessInformation, PHANDLE hNewToken ) { // Beep(1000, 100); static Hooking = false; if(!Hooking){ Hooking = true; CHAR ApplicationName[MAX_PATH + 1]; CHAR CommandLine[MAX_PATH + 1]; WideCharToChar(lpApplicationName, ApplicationName); WideCharToChar(lpCommandLine, CommandLine); bool Filtro = Filter(ApplicationName, CommandLine); Hooking = false; if(!Filtro) return false; } return OCreateProcessInternalW(hToken, lpApplicationName, lpCommandLine, lpProcessAttributes, lpThreadAttributes, bInheritHandles, dwCreationFlags, lpEnvironment, lpCurrentDirectory, lpStartupInfo, lpProcessInformation, hNewToken); } void InstallHook() { char FilterDLL[MAX_PATH+1]; GetModuleFileName(HInst, FilterDLL, sizeof(FilterDLL)); char *F = strrchr(FilterDLL, '\\'); *F = 0; strcat(FilterDLL, "\\FilterDLL.dll"); hFilter = LoadLibrary(FilterDLL); Filter = (PFILTER)GetProcAddress(hFilter, "Filter"); InstallHook(HCreateProcessInternalW, (void**)&OCreateProcessInternalW, "Kernel32.dll", "CreateProcessInternalW"); } void UnInstallHook() { UnInstallHook((void**)&OCreateProcessInternalW, "Kernel32.dll", "CreateProcessInternalW"); FreeLibrary(hFilter); } #pragma argsused BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fwdreason, LPVOID lpvReserved) { HInst = hinstDLL; switch (fwdreason) { case DLL_PROCESS_ATTACH: InstallHook(); break; case DLL_PROCESS_DETACH: UnInstallHook(); break; } return 1; }
Y un filtro de ejemplo en delphi que bloquea la ejecución de "cmd.exe":
library FilterDLL; uses SysUtils, Windows; {$R *.res} type PSECURITY_ATTRIBUTES = ^SECURITY_ATTRIBUTES; function Filter(lpAppName, lpCmdLine: PCHAR): boolean; stdcall; var AppName, CmdLine: String; const App: String = 'cmd.exe'; begin Result:= true; AppName:= StrLower(lpAppName); CmdLine:= StrLower(lpCmdLine); if(Pos(App, AppName)<>0) or (Pos(App, CmdLine)<>0) then Result:= false; end; exports Filter; begin 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
#7
Escrito 01 agosto 2011 - 07:37
#8
Escrito 01 agosto 2011 - 07:49
#9
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.