quot;Matarquot; Processo

Delphi

15/02/2005

Boa Noite,

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

Spooner

Curtidas 0

Respostas

Nildo

Nildo

15/02/2005

Talvez você precise estar com privilégios de Debug. Tente executar esta função [b:9e16ba945c]antes[/b:9e16ba945c] de matar o processo:

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
Spooner

Spooner

15/02/2005

Boa Noite,

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
Nildo

Nildo

15/02/2005

Boa Noite, 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


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
Spooner

Spooner

15/02/2005

Boa Noite,

Por favor, cite quais os processos que não são possíveis de matar.


Consegui Finalizar quase todos menos esse executavel: navapsvc.exe (´não sei a origem´).


Será que funciona se você usar a API TerminateProcess()?


Estou ulizando justamente essa API.

Caso seja necessário, responda este tópico solicitando o código que eu o faço para você.


Gostaria sim, que você fizesse o codigo, ou indicasse onde posso aprender..

Obrigado.


GOSTEI 0
Sanses

Sanses

15/02/2005

Olá

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
Sanses

Sanses

15/02/2005

olá

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
Nildo

Nildo

15/02/2005

Caso a rotina do Sanses não funcione, avise!

É 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
Spooner

Spooner

15/02/2005

Boa Noite Sanses,

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
Sanses

Sanses

15/02/2005

Oi

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
Spooner

Spooner

15/02/2005

Olá,

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
Sanses

Sanses

15/02/2005

é como eu falei, no windows xp, se vc olhar em serviços, verá que tem 6 serviços rodando, relacionados ao norton. Um deles deve monitorar o fechamento e assim que este evento ocorre ele cria uma nova instancia.

Se fosse assim, simplesmente fecha e não volta mais, os programadores de virus estariam no paraíso não acha???

Sanses


GOSTEI 0
Spooner

Spooner

15/02/2005

Boa Tarde Sanses,

Minha saída foi fazer um serviço do windows que testa se o programa está abertoe se não tiver, desliga o pc


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
Sanses

Sanses

15/02/2005

Oi

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
POSTAR