Fórum quot;Matarquot; Processo #268533
15/02/2005
0
Fiz varias buscas no forum mas não consegui encontrar algum post que resolvesse o meu problema.
O seguinte precisso ´matar´ um processo considerado como SYSTEM.
Os codigos que encontrei no forum não conseguem fechar esses aplicativos sera que alguem sabe algum ou poderia indicar algo para poder matar esses processos?
Spooner
Curtir tópico
+ 0Posts
15/02/2005
Nildo
procedure GetDebugPrivs; const // Query que o SO deve executar para obter privilégio de Debug SE_DEBUG_NAME = ´SeDebugPrivilege´; var hToken: THandle; // Handle do Token tkp : TTokenPrivileges; // Privilégio retval: dword; // Retorno begin // Inicializa a transação para ajuste de privilégio e execução da query if OpenProcessToken( GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY, hToken ) then begin // Inicia a query de ajuste de privilégio LookupPrivilegeValue( nil, SE_DEBUG_NAME, tkp.Privileges[0].Luid ); // Quantas queries vai executar tkp.PrivilegeCount := 1; // Indica que a query é de ajuste de privilégio tkp.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED; // Finalmente executa a query AdjustTokenPrivileges( hToken, false, tkp, 0, nil, retval ); end; end;
Gostei + 0
16/02/2005
Spooner
Obrigado por ter respondito nildo,
Esta Procedure que vc postou Funcionou para apenas alguns processos do SYSTEM mas já para outros não deu certo, teria outra alternativa para esse problema? ou sera que tem outra procedure de fechar processos que não estou usando?
Atenciosamente,
Spooner
Gostei + 0
16/02/2005
Nildo
Olá!
Por favor, cite quais os processos que não são possíveis de matar. Eu acho que dependendo do processo não seja possível mesmo. De qualquer maneira, me fala uma coisa... Será que funciona se você usar a API [b:d8ac3a4647]TerminateProcess()[/b:d8ac3a4647]? Ficaria mais ou menos assim:
var hProc: Cardinal; begin hProc := OpenProcess( Process_all_access, True, ID_DO_PROCESSO ); TerminateProcess( hProc, 0 ): end;
Caso isso não funcione, podemos injetar um código que execute a API [b:d8ac3a4647]ExitProcess[/b:d8ac3a4647], e criar uma Thread no contexto do outro processo para executar esse código. É como se o outro processo estivesse executando dentro do próprio código dele, uma chamada a API ExitProcess. Caso seja necessário, responda este tópico solicitando o código que eu o faço para você.
Abraços
Gostei + 0
16/02/2005
Spooner
Consegui Finalizar quase todos menos esse executavel: navapsvc.exe (´não sei a origem´).
Estou ulizando justamente essa API.
Gostaria sim, que você fizesse o codigo, ou indicasse onde posso aprender..
Obrigado.
Gostei + 0
17/02/2005
Sanses
este processo refere-se ao Norton Antivirus ou algum produto da família.
Tenho um procedimento que fecha os processos, mas preciso testar em processos de sistema, os outros funciona bem...vou testar e depois posto a resposta.
Sanses
Gostei + 0
17/02/2005
Sanses
fiz um exemplo com a função que o nildo passou e alguma coisa que eu tinha aqui. Dá uma olhada no código como ficou:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ComCtrls, TLHelp32 ;
type
TForm1 = class(TForm)
Button2: TButton;
ListView1: TListView;
procedure Button2Click(Sender: TObject);
procedure ListView1DblClick(Sender: TObject);
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
aSnapshotHandle: THandle;
aProcessEntry32: TProcessEntry32;
implementation
{$R *.dfm}
procedure privilegio;
const
priv = ´SeDebugPrivilege´;
var
hToken: THandle;
tkp : TTokenPrivileges;
retval: dword;
begin
if OpenProcessToken( GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY, hToken ) then
begin
LookupPrivilegeValue( nil, priv, tkp.Privileges[0].Luid );
tkp.PrivilegeCount := 1;
tkp.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED;
AdjustTokenPrivileges( hToken, false, tkp, 0, nil, retval );
end;
end;
procedure TForm1.Button2Click(Sender: TObject);
var
i: Integer;
bContinue: BOOL;
NewItem: TListItem;
begin
privilegio;
ListView1.Items.Clear;
aSnapshotHandle := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
aProcessEntry32.dwSize := SizeOf(aProcessEntry32);
bContinue := Process32First(aSnapshotHandle, aProcessEntry32);
while Integer(bContinue) <> 0 do
begin
NewItem := ListView1.Items.Add;
NewItem.Caption := ExtractFileName(aProcessEntry32.szExeFile);
NewItem.subItems.Add(IntToHex(aProcessEntry32.th32ProcessID, 4));
NewItem.subItems.Add(aProcessEntry32.szExeFile);
bContinue := Process32Next(aSnapshotHandle, aProcessEntry32);
end;
CloseHandle(aSnapshotHandle);
end;
procedure TForm1.ListView1DblClick(Sender: TObject);
var
Ret: BOOL;
PrID: Integer; // processidentifier
Ph: THandle; // processhandle
begin
with ListView1 do
begin
begin
PrID := StrToInt(´$´ + ItemFocused.SubItems[0]);
Ph := OpenProcess(1, BOOL(0), PrID);
Ret := TerminateProcess(Ph, 0);
if Integer(Ret) = 0 then
MessageDlg(´Não foi possível terminar "´ + ItemFocused.Caption + ´"´,
mtInformation, [mbOK], 0)
else
ItemFocused.Delete;
end;
end;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
Button2.Click;
end;
end.
Aqui funcionou blz, e de tanto testar tive até que reiniciar o sistema (fechei coisa demais....rss)
Espero que ajude!
Sanses
Gostei + 0
17/02/2005
Nildo
É que na verdade o Norton não vai deixar um processo dele ser finalizado de maneira facil... Senão o vírus simplesmente fechava o processo dele e pronto!
Gostei + 0
18/02/2005
Spooner
Sobre seu codigo ficou um otimo complemento, conseguiu fechar todos os meus processos, menos o ´navapsvc.exe´ mas o que eu precisava fechar foi fechado, mas apenas por curiosidade sera que tem como fechar esse processo? caso não tem alguma posibilidade de fazer um App ficar dessa forma (infechavel)...rsrs
Obrigado.
Gostei + 0
18/02/2005
Sanses
Olha não é que ele seja infechável. E tb não sei direito como é(desculpe, como nunca estudei programação não sei usar nomes técnicos - sou auto-didata), apenas sei que se vc der uma olhada nos serviços(claro, se estiver usando windows nt ou xp) que estão rodando, lá no painel de controle por exemplo, tem uns 6 serviços do norton ativos. Acredito que eles se encarreguem de fazer isso, se o processo for exterminado, automaticamente é reiniciado, ou coisa assim.
Fiz algo parecido em um programa para lan-house. O programa simplesmente era fechado, ai descobri que um programador ´vb´ ia até a loja, comprava uma hora, entrava na net, baixava um prog. que ele fez, e este prog, fechava o meu software. E como usava uma função de força bruta acredito, o windows nem era reiniciado como era pra acontecer.
Minha saída foi fazer um serviço do windows que testa se o programa está abertoe se não tiver, desliga o pc.
CURIOSIDADE: esse programador, é bem conhecido na minha cidade. Hoje não é mais assim, mas nos primeiros dias que coloquei este serviço pra rodar, antes do computador desligar gritava umas 5 vezes: ´Cliente tentando burlar o sistema´. Até que ele desistiu, huahuahua. Mas o serviço ainda roda, claro, sem este som...
Sanses
Gostei + 0
19/02/2005
Spooner
Engrçado que esse processo é fechado, e depois na mesma hora ela volta a ativa... até mesmo processos do windows foram fechados mas esse não é, não faço a minima ideia de como isso funcione.
Gostei + 0
20/02/2005
Sanses
Se fosse assim, simplesmente fecha e não volta mais, os programadores de virus estariam no paraíso não acha???
Sanses
Gostei + 0
20/02/2005
Spooner
Você disse a cima que fez um servico do windows, então provavelmente ele teve que ficar registrado na parte de Serviços, se sim poderia mostrar como fazer tal coisa?
Gostei + 0
21/02/2005
Sanses
Bem isso é possivel e fácil de fazer no win 2000 ou xp. Clieque em iniciar, executar e coloque o path do serviço que vc criou (que será um exe) mais /install, ficando assim
´C:\teste\servicos.exe´ /install
E para desinstalar
´C:\teste\servicos.exe´ /uninstall
Note que só programas criados como SERVIÇO irão funcionar. E este comando apenas instala o serviço, sendo ainda necessário vc configurar o tipo de inicialização(automática, manual...etc).
Sanses
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)