Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Debates (https://www.clubdelphi.com/foros/forumdisplay.php?f=29)
-   -   Evitar cerrar mi programa desde el administrador de tareas (https://www.clubdelphi.com/foros/showthread.php?t=39279)

Mrcl 16-01-2007 00:12:19

Evitar cerrar mi programa desde el administrador de tareas
 
Como evito que cierren mi programa desde el administrador de tareas de Windows

sinalocarlos 16-01-2007 00:52:59

he tenido un deja vu:

aqui


me voy antes que vengan los agentes

seoane 16-01-2007 01:13:03

Cualquier "truco" que utilices para impedir que cierren tu aplicación desde el administrador de tareas no impedirá que te lo cierren usando otro programa. No hay forma "legitima" de impedir que un usuario con derechos de administrador cierre un proceso (ojo, he dicho legitima). Y además no tendría sentido, el administrador tiene que poder hacer lo que le venga en gana, para eso es el administrador.

Por el contrario si lo que quieres es impedir que un usuario con una "cuenta limitada" cierre un proceso, la cosa cambia. Puedes hacer correr tu aplicación como un servicio, por ejemplo.

roman 16-01-2007 01:40:13

Hay procesos de Windows que ni como administrador se pueden quitar. ¿Cómo se hace eso?

// Saludos

seoane 16-01-2007 01:41:46

Cita:

Empezado por roman
Hay procesos de Windows que ni como administrador se pueden quitar. ¿Cómo se hace eso?

:confused: ¿Cuales?

roman 16-01-2007 02:07:48

winlogon, lsass, csrss...

Por cierto, el unlocker puede quitar el winlogon, aunque el resultado no es muy bonito :D

// Saludos

seoane 16-01-2007 02:19:14

Pensaba responderte que cualquier otro programa, puede cerrarlos, pero ya veo que lo has descubierto por ti solo. Aunque como también has descubierto el resultado suele ser catastrófico, pero eso es porque son críticos para el funcionamiento del sistema operativo, no es que windows se cierre por venganza :p .

La razón de que desde el administrador de tareas no se puedan cerrar es bastante mas simple de lo que parece, el administrador de tareas comprueba el nombre de la aplicación antes de intentar cerrarla y si el nombre coincide se niega a cerrarla. Si le pones a cualquier programa el nombre "lsass.exe" el administrador de tareas se negara a cerrarlo, haz la prueba.

dec 16-01-2007 02:24:33

Hola,

Esto que comentas ahora Seoane (y que ya ha salido a colación alguna vez en los Foros) parece una verdadera chapuza, ¿no? "Eppur se move"...

roman 16-01-2007 02:25:32

Te creo, lo que pasa es que ahora no encuentro un ejemplo: probé pero alguno me eché que se apago mi pc :D. Sin embargo, en los ejemplo que puse aparece el mensaje de: "Este proceso es crítico..." pero en ocasions he visto alguno que luego de unos segundos me dice que no tengo permiso y yo siempre uso cuenta de administrador (lo sé, está mal, muy mal, pero esa es otra cuestión :p). Si encuentor uno, te digo.

Cita:

Empezado por seoane
el resultado suele ser catastrófico

Digamos que si alguien extraña las pantallas azules... :D

// Saludos

seoane 16-01-2007 02:38:27

Cita:

Empezado por roman
Te creo, lo que pasa es que ahora no encuentro un ejemplo: probé pero alguno me eché que se apago mi pc :D

No sigas buscando, ya hice un par de pruebas sobre un equipo virtual, y con el "Proccess Explorer" de sysinternals, puedo cerrar el winlogon.exe, lsass.exe, alg.exe y csrss.exe, todos ellos con resultados "catastróficos" :D Pero el caso es que se pueden cerrar ....

Cita:

Esto que comentas ahora Seoane (y que ya ha salido a colación alguna vez en los Foros) parece una verdadera chapuza, ¿no? "Eppur se move"...
Chapuza y de las gordas, pero supongo que cuentan que un usuario avanzado dispondrá de herramientas de terceros, y que así los usuarios "normales" no se dedicaran a cerrar procesos a lo loco :p Nada descabellado, si no que se lo digan a un colega mio, que borro media carpeta de windows, y por única explicación solo decía "... pues mientras los borraba no me aviso, ni me dio ningún error ..." :D

maikeloh 02-03-2007 00:19:29

Una pregunta
 
Vi los hilos de seoane pero me pregunto si no habra una via mas elegante mediante código con la cual yo pueda indicarle al administrador de tareas que mi aplicacion es un proceso critico del sistema. Tal vez hacer algun hook a la API que controla el administrador de tareas (realmente no tengo muy claro como funciona eso, si me pueden indicar link con literatura lo agradeceria). El caso es que requiero urgentemente poder poner una aplicacion como proceso critico del sistema.
Salu2

ArdiIIa 02-03-2007 00:43:19

Curiosidades
 
MATAR PROCESOS.. casi todos...
Cita:

Este artículo artículo de Mark Russinovich (de SysInternals), que parece haber sorprendido -según se dice- al mismísimo vicepresidente de Sistemas Operativos de Microsoft nos enseña a ir quitando procesos de Windows hasta dejar sólo dos, eso sí, capando muchas funcionalidades.
Resulta interesante para los que desean optimizar su sistema al máximo:
ARTICULO

roman 02-03-2007 07:26:56

Logré dejar así al sistema:

http://img163.imageshack.us/my.php?image=procexpeh6.png

Ese proceso del "Drive Letter Access" que parece tener que ver con el acceso a la unidad grabadora de cds, fue imposible matarlo.

// Saludos

seoane 02-03-2007 12:05:07

Me pregunto Roman, como de funcional es el windows después de cerrar todos esos procesos. ¿Se puede trabajar con el? o solo sirve como anécdota

roman 02-03-2007 17:13:57

Esteeee.... Pues, si no te importa tener que oprimir el botón de encendido tres segundos para poder apagar la computadora, y prescindir de superfluosidades como el portapapeles, ... en fin, al menos se puede navegar. Vaya, pues, una anécdota :D

Pero, ¿te has fijado en el proceso que comento? ¿Cómo hace para permanecer vivo?

// Saludos

seoane 02-03-2007 17:26:14

Cita:

Empezado por roman
Pero, ¿te has fijado en el proceso que comento? ¿Cómo hace para permanecer vivo?

Pues no me había fijado, me quede en lo anecdótico de tu mensaje. Pero ahora que sacas de nuevo el tema, que mensaje te da cuando intentas cerrarlo, o no te da ninguna explicación, según creo en windows xp no hay procesos intocables (aparte de los citados), no así el windows vista que implementa unos procesos "intocables" pensados especialmente para el DRM.

Ahora que hablamos de DRM y procesos intocables, algunos rootkits interceptan la Api TerminateProcess, impidiendo así que los otros programas lo cierren. Sera esa la explicación en este caso, se estará defendiendo al mas puro estilo rootkit :D

roman 02-03-2007 17:32:57

Je, je, pues sí, podría ser un rootkit, pero es proceso ya venía con la pc. No da ningún error, simplemente se queda ahí.

// Saludos

ArdiIIa 02-03-2007 23:31:43

Cita:

Empezado por roman
Hay procesos de Windows que ni como administrador se pueden quitar. ¿Cómo se hace eso?
// Saludos

Pues he visto un ejemplo de código, que primero: otorga a su propio proceso privilegios para debug.. (SeDebugPrivilege) y seguidamente lanza el TaskManager, heredando esos mismos privilegios, y hecho esto, mata todo lo que se le ponga por delante.
Está escrito en 'C', pero la técnica es genérica. P.e. seoane lo utiliza aquí. (EnablePrivilege).
Una vez obtenidos los privilegios, realiza un ShellExecute al TaskManager que hereda esos privilegios y a matar todo lo que se ponga por delante...
Las explicaciones están aquí (hay que mover la pantalla del navegador un poco hacia la derecha para verlo bien....);)
Siguiendo con el asunto de evitar que se puede matar un proceso, aquí se describen unas técnicas usuales, pero el plato fuerte está aquí donde se describe una patente para realizar procesos seguros.
Quien le pone el cascabel al gato ?

ArdiIIa 03-03-2007 00:06:20

Pese a lo dicho antes... al mi el procedimiento o no me funciona...

seoane 03-03-2007 01:43:37

1 Archivos Adjunto(s)
Siguiendo lo comentado por ardilla, vamos a hacer un killer:
Código Delphi [-]
program Killer;

{$APPTYPE CONSOLE}

uses  Windows, Sysutils, Messages, Psapi;

function EnablePrivilege(PrivilegeName: PChar; Enable: Boolean): Boolean;
var
  Token: THandle;
  TokenPrivileges: TOKEN_PRIVILEGES;
  Luid: TLargeInteger;
begin
  Result:= FALSE;
  if OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES or
    TOKEN_QUERY or TOKEN_READ, Token) then
    if LookupPrivilegeValue(nil,PrivilegeName,Luid) then
    begin
      TokenPrivileges.PrivilegeCount:= 1;
      TokenPrivileges.Privileges[0].Luid:= Luid;
      if Enable then
        TokenPrivileges.Privileges[0].Attributes:= SE_PRIVILEGE_ENABLED
      else
        TokenPrivileges.Privileges[0].Attributes:= 0;
      Result:=
        AdjustTokenPrivileges(Token,FALSE,TokenPrivileges,0,nil,PDWORD(nil)^);
      CloseHandle(Token);
    end;
end;

procedure Kill(Str: String; Inject: Boolean);
var
  Procesos: array[1..1024] of DWORD;
  Needed, i: DWORD;
  Process, Thread: THandle;
  ModName: Array[0..MAX_PATH] of Char;
  Respuesta: String;
begin
  Str:= Uppercase(Str);
  if EnablePrivilege('SeDebugPrivilege', TRUE) then
  begin
    if EnumProcesses(@Procesos, SizeOf(Procesos), Needed ) then
    begin
      for i:= 1 to (Needed div Sizeof(DWORD)) do
      begin
        Process := OpenProcess(PROCESS_ALL_ACCESS, FALSE,Procesos[i]);
        if Process <> 0 then
        begin
          if GetModuleFileNameEx(Process,0,ModName,SizeOf(ModName)-1) > 0  then
          begin
            StrUpper(ModName);
            if StrPos(ModName,PChar(Str)) <> nil then
            begin
              Write(String(ModName) + ' Lo mato? [No]');
              Readln(Respuesta);
              if SameText(Respuesta,'Si') or SameText(Respuesta,'S') then
              begin
                if Inject then
                begin
                  Thread:= CreateRemoteThread(Process, nil, 0,
                    GetProcAddress(GetModuleHandle('Kernel32'),'ExitProcess'),
                    nil, 0, PDWORD(nil)^);
                  if Thread <> 0 then
                  begin
                    WaitForSingleObject(Thread,INFINITE );
                    CloseHandle(Thread);
                  end;
                end else
                  TerminateProcess(Process,0);
              end;
            end;
          end;
          CloseHandle(Process);
        end;
      end;
    end;
    EnablePrivilege('SeDebugPrivilege', FALSE);
  end;
end;

begin
  Writeln;
  if ParamCount = 1 then
    Kill(ParamStr(1), FALSE)
  else
    if (ParamCount = 2) and (SameText(ParamStr(1),'-i') or
      SameText(ParamStr(1),'/i')) then
      Kill(ParamStr(2), TRUE);
end.
Lo primero es elevarnos nuestro privilegios para que nadie se nos resista. A partir de ahí tenemos dos métodos de matar. Uno es utilizar la función TerminateProcess con el handle del proceso y el otro es matar desde dentro, ejecutando de forma remota la función ExitProcess dentro de nuestra víctima.

Bueno, aquí os lo dejo como curiosidad
Código:

// Modo de empleo

// Matar el notepad
Killer notepad.exe

// Matar el notepad desde dentro (/i tiene que ser el primer parámetro)
Killer /i notepad.exe



La franja horaria es GMT +2. Ahora son las 19:43:06.

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