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