Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Temas relacionados > Debates
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 02-03-2007
Avatar de ArdiIIa
[ArdiIIa] ArdiIIa is offline
Miembro Premium
 
Registrado: nov 2003
Ubicación: Valencia city
Posts: 1.481
Poder: 22
ArdiIIa Va por buen camino
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 ?
__________________
Un poco de tu generosidad puede salvar la vida a un niño. ASÍ DE SENCILLO
Responder Con Cita
  #2  
Antiguo 03-03-2007
Avatar de ArdiIIa
[ArdiIIa] ArdiIIa is offline
Miembro Premium
 
Registrado: nov 2003
Ubicación: Valencia city
Posts: 1.481
Poder: 22
ArdiIIa Va por buen camino
Pese a lo dicho antes... al mi el procedimiento o no me funciona...
__________________
Un poco de tu generosidad puede salvar la vida a un niño. ASÍ DE SENCILLO
Responder Con Cita
  #3  
Antiguo 03-03-2007
Avatar de seoane
[seoane] seoane is offline
Miembro Premium
 
Registrado: feb 2004
Ubicación: A Coruña, España
Posts: 3.717
Poder: 24
seoane Va por buen camino
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
Archivos Adjuntos
Tipo de Archivo: zip Killer.zip (3,5 KB, 65 visitas)
Responder Con Cita
  #4  
Antiguo 03-03-2007
Avatar de ArdiIIa
[ArdiIIa] ArdiIIa is offline
Miembro Premium
 
Registrado: nov 2003
Ubicación: Valencia city
Posts: 1.481
Poder: 22
ArdiIIa Va por buen camino
He visto por ahí que lo habitual en estos casos es abrir el proceso con: OpenProcess PROCESS_TERMINATE
Aquí hay un ejemplo pero sin utilización de privilegios, y aquí hay otro que si los utiliza, pero como puedes ver ambos abren el proceso con PROCESS_TERMINATE
Por cierto seoane, has leído el tema de las patentes de procesos seguros... precisamente para evitar esto y otras muchas cosas ?
__________________
Un poco de tu generosidad puede salvar la vida a un niño. ASÍ DE SENCILLO
Responder Con Cita
  #5  
Antiguo 03-03-2007
Avatar de seoane
[seoane] seoane is offline
Miembro Premium
 
Registrado: feb 2004
Ubicación: A Coruña, España
Posts: 3.717
Poder: 24
seoane Va por buen camino
Hombre Ardilla, una vez que nos elevamos los privilegios para que andar ajustando los permisos si tenemos garantizado PROCESS_ALL_ACCESS. Pero bueno, si se quiere ajustar, es verdad que no hacen falta todos los permisos, aunque habría que incluir los necesarios para poder obtener el nombre del ejecutable.

En cuanto a la patente, la he leído un poco por encima, pero no parece describir un método para hacerlo en windows, sino que describe como se debería de implementar un sistema operativo para tener procesos seguros.

La verdad es que si se pudieran implementar procesos seguros, los procesos como winlogon.exe serian los primeros en serlo, y como ya quedo demostrado, con los permisos necesarios se puede inyectar código dentro de ellos.

PD: Lo que me gustaría saber es si el proceso inmortal de roman se muere con alguno de los dos métodos.
Responder Con Cita
  #6  
Antiguo 03-03-2007
Avatar de ArdiIIa
[ArdiIIa] ArdiIIa is offline
Miembro Premium
 
Registrado: nov 2003
Ubicación: Valencia city
Posts: 1.481
Poder: 22
ArdiIIa Va por buen camino
Cita:
Empezado por seoane
PD: Lo que me gustaría saber es si el proceso inmortal de roman se muere con alguno de los dos métodos.
Ni idea: Tengo la sensación de que aunque aparece como un proceso normal seguramente sea cargado con CreateService.
Por ejemplo hay en mis procesos un exe de ZoneAlarm, concretamente el zlclient.exe que no se deja tocar. También estuve examinando el código de algunos firewall de SourceForge y utilizan esa técnica (CreateService) para permanecer como procesos protegidos o incluso como drivers.
__________________
Un poco de tu generosidad puede salvar la vida a un niño. ASÍ DE SENCILLO
Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Administrador de tareas Iskariote0087 API de Windows 7 31-12-2006 20:26:36
Evitar cerrar un formulario desde un componente genius Varios 1 23-11-2006 15:55:42
Administrador de tareas - recuento de indentificadores mole API de Windows 2 25-08-2006 09:41:52
Activar Administrador de Tareas CARSOFT_AR Varios 4 23-11-2005 20:12:58
Cerrar mi programa desde otro Sr_Sombrero API de Windows 2 02-12-2004 22:12:09


La franja horaria es GMT +2. Ahora son las 23:43:07.


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
Copyright 1996-2007 Club Delphi