Ver Mensaje Individual
  #20  
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
Reputación: 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