Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: WinAPI и системное программирование > Как убить системный процесс


Автор: Дми 26.7.2005, 17:22
САБЖ.
Имя образа svchost, имя пользователя NETWORK SERVICE

Автор: RA 26.7.2005, 21:50
Тут по середине страницы надпись "Поиск", в ней поле ввода, впишы туда волшебные слова нажми "Go" и будет тебе счастье.

Автор: Гость_Дмитрий 26.7.2005, 22:20
Цитата(RAdmin @ 26.7.2005, 21:50)
Тут по середине страницы надпись "Поиск", в ней поле ввода, впишы туда волшебные слова нажми "Go" и будет тебе счастье.

Очень остраумно, я бы сам и не догадался... Но раз уж ты такой гений по использованию поиска, может найдёш где можно былобы разобрать ответ на конкретно поставленный вопрос... smile
Да кстати я тут вчера нашёл похожую тему http://forum.vingrad.ru/index.php?showtopic=17724&hl=убить+процесс, там г-н Посол круто всё ответил, но есть мелкий недостаток, smile именно к нужному мне процессу тот способ неподходит.

Если кто знает, то подскажите пожайлуста способ решения... smile
Заранее благодарен!!!

Автор: RA 27.7.2005, 11:42
Цитата
Да кстати я тут вчера нашёл похожую тему здесь, там г-н Посол круто всё ответил, но есть мелкий недостаток,  именно к нужному мне процессу тот способ неподходит.


Значит у пользователя "NETWORK SERVICE" не достаточно прав чтобы убивать системные процессы, и как ни крути а без прав администратора убить нельзя, что через делфи, что через чёрт знает что.
(И это кстати тоже обсуждалось)

Автор: Girder 27.7.2005, 12:09
Цитата
Да кстати я тут вчера нашёл похожую тему здесь, там г-н Посол круто всё ответил, но есть мелкий недостаток,  именно к нужному мне процессу тот способ неподходит.
Попробуй ACL ему подправить... пример я приводил.

Автор: Romikgy 27.7.2005, 12:39
А в сервисах его стопорнуть? smile

Автор: RA 27.7.2005, 13:27
Цитата(Girder @ 27.7.2005, 12:09)
Попробуй ACL ему подправить...

А толку? он тутже перезапустится. smile

Цитата(Girder @ 27.7.2005, 12:09)
пример я приводил.

Чего-то не нашёл?

Автор: Guest 27.7.2005, 13:43
Цитата(RAdmin @ 27.7.2005, 11:42)
Значит у пользователя "NETWORK SERVICE" не достаточно прав чтобы убивать системные процессы, и как ни крути а без прав администратора убить нельзя, что через делфи, что через чёрт знает что.

А почему тогда через винду обычным нажатием завершить процесс, он завершается? smile
Цитата(RAdmin @ 27.7.2005, 13:27)
А толку? он тутже перезапустится.

Это уже другой вопрос, мне надо только программно завершить его, а дальше это другие проблемы...
Цитата(Girder @ 27.7.2005, 12:09)
Попробуй ACL ему подправить...

Кинь ссылку пожалуйста, а то я тоже немогу найти... Точнее тут на разные запросы куча тем выдаётся, а какое конкретное название нужной темы, может знать только автор ответа или темы... smile

Автор: RA 27.7.2005, 15:26
Цитата(Guest @ 27.7.2005, 13:43)
А почему тогда через винду обычным нажатием завершить процесс, он завершается?



smile Тогда почему ты сказал что пример posl'a не работае?

KillTask('svhost.exe') - процесс прекрасно убивается, правда пересоздаётся снова но это
Цитата(Guest @ 27.7.2005, 13:43)
уже другой вопрос,


Автор: Гость_Дмитрий 27.7.2005, 15:52
Ну ничего себе убивается... smile я даже в пожаговом режиме не успиваю отследить как он исчезает, и появляется... smile

Цитата(RAdmin @ 27.7.2005, 15:26)
ты сказал что пример posl'a не работае

Нееее... я сказал, что он работает, но не универсально...
Мне надо чтобы после того как он через делфи здохнет, чтобы ничего не появилось снова, а запустилась программа перезагрузки компьютера...

А незнаешь всётаки каким образом можно бы АСЛ подправить? И что ето вообще такое есть, на имя пользователя что то не тянет...

Автор: Girder 27.7.2005, 16:11
Цитата(RAdmin @ 27.7.2005, 14:27)
Чего-то не нашёл?
http://forum.vingrad.ru/index.php?showtopic=53442&view=findpost&p=424364

PS: Тебе просто надо заменить SuspendThread и использовать ентот код не для всех потоков в системе smile ... там сделанно для потоков процессов...(для справки... что бы убить процесс... достаточно убить главный поток... но конечно можеш ко всем потокам процесса применить енто)

Автор: Дм 27.7.2005, 20:31
Цитата(Girder @ 27.7.2005, 16:11)
http://forum.vingrad.ru/index.php?showtopi...ndpost&p=424364
Прикольная прога, у меня прямо пластинку зажевало... smile
Цитата(Girder @ 27.7.2005, 16:11)
надо заменить SuspendThread

Girder ты не мог бы пояснить, на что его надо заменить, а то я что то ещё не понял... smile

Автор: RA 27.7.2005, 20:44
Цитата
Ну ничего себе убивается...  я даже в пожаговом режиме не успиваю отследить как он исчезает, и появляется...


Дык чесное пионерское, он тутже перезапускается smile . В Proces Explorer, это наглядно демонстрируется.


Цитата
Мне надо чтобы после того как он через делфи здохнет, чтобы ничего не появилось снова, а запустилась программа перезагрузки компьютера...



Тогда как подметил
Romikgy приостановить (а не остановить) выполнение его работы в сервисах.

Автор: Гость_Дмитрий 27.7.2005, 21:43
Всмысле... Что значит в сервисах.... я думал что это имелось ввиду не программным способом, а так мне ненужно.
Помоему то что предложил Girder мне и нужно, вот бы только понять как его код смешать с Посол'овским и чтобы всё работало как мне надо... smile

Автор: Romikgy 28.7.2005, 08:20
Я чет не понял те надо процесс грохнуть полностью , что бы он не встал, или остановить его , или комп перегрузить????

Автор: Гость_Дмитрий 28.7.2005, 12:27
Мне надо чтобы программным способом, сделалось тоже самое, что и просто открыть диспетчер, выбрать вкладку "процессы", потом выбрать процесс и нажать кнопку "завершить процесс".

Автор: ScriptkidY 28.7.2005, 23:39
Код

uses  
  Tlhelp32, Windows, SysUtils;  

function KillTask(ExeFileName: string): integer;  
const  
  PROCESS_TERMINATE=$0001;  
var  
  ContinueLoop: BOOL;  
  FSnapshotHandle: THandle;  
  FProcessEntry32: TProcessEntry32;  
begin  
  result := 0;  

  FSnapshotHandle := CreateToolhelp32Snapshot  
                     (TH32CS_SNAPPROCESS, 0);  
  FProcessEntry32.dwSize := Sizeof(FProcessEntry32);  
  ContinueLoop := Process32First(FSnapshotHandle,  
                                 FProcessEntry32);  

  while integer(ContinueLoop) <> 0 do  
  begin  
    if ((UpperCase(ExtractFileName(FProcessEntry32.szExeFile)) =  
         UpperCase(ExeFileName))  
     or (UpperCase(FProcessEntry32.szExeFile) =  
         UpperCase(ExeFileName))) then  
      Result := Integer(TerminateProcess(OpenProcess(  
                        PROCESS_TERMINATE, BOOL(0),  
                        FProcessEntry32.th32ProcessID), 0));  
    ContinueLoop := Process32Next(FSnapshotHandle,  
                                  FProcessEntry32);  
  end;  

  CloseHandle(FSnapshotHandle);  
end; 


Попробуй это...

Автор: Гость_Дмитрий 29.7.2005, 12:24
Вообщем я сделал так:
Код

function KillTask(ExeFileName: string): integer;
const
  PROCESS_TERMINATE=$0001;
var
  ContinueLoop: BOOL;
  FSnapshotHandle: THandle;
  FProcessEntry32: TProcessEntry32;
begin
  result := 0;
  FSnapshotHandle := CreateToolhelp32Snapshot
                     (TH32CS_SNAPPROCESS, 0);
  FProcessEntry32.dwSize := Sizeof(FProcessEntry32);
  ContinueLoop := Process32First(FSnapshotHandle,
                                 FProcessEntry32);
  while integer(ContinueLoop) <> 0 do
  begin
    if ((UpperCase(ExtractFileName(FProcessEntry32.szExeFile)) =
         UpperCase(ExeFileName))
     or (UpperCase(FProcessEntry32.szExeFile) =
         UpperCase(ExeFileName))) then
      Result := Integer(TerminateProcess(OpenProcess(
                        PROCESS_TERMINATE, BOOL(0),
                        FProcessEntry32.th32ProcessID), 0));
    ContinueLoop := Process32Next(FSnapshotHandle,
                                  FProcessEntry32);
  end;
  CloseHandle(FSnapshotHandle);
end;

procedure TForm1.SpeedButton1Click(Sender: TObject);
var
  q:integer;
begin
  q:=KillTask ('svchost.exe')
end;
И всё равно, процесс "svchost", с именем пользователя "NETWORK SERVICE" не завершается... smile Может я что-то написал нетак, в коде??? smile

Автор: Girder 29.7.2005, 14:21
Код
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Edit1: TEdit;
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

uses tlhelp32, AccCtrl, AclAPI;

const
  SE_CREATE_TOKEN_NAME = 'SeCreateTokenPrivilege';
  SE_ASSIGNPRIMARYTOKEN_NAME = 'SeAssignPrimaryTokenPrivilege';
  SE_LOCK_MEMORY_NAME = 'SeLockMemoryPrivilege';
  SE_INCREASE_QUOTA_NAME = 'SeIncreaseQuotaPrivilege';
  SE_UNSOLICITED_INPUT_NAME = 'SeUnsolicitedInputPrivilege';
  SE_MACHINE_ACCOUNT_NAME = 'SeMachineAccountPrivilege';
  SE_TCB_NAME = 'SeTcbPrivilege';
  SE_SECURITY_NAME = 'SeSecurityPrivilege';
  SE_TAKE_OWNERSHIP_NAME = 'SeTakeOwnershipPrivilege';
  SE_LOAD_DRIVER_NAME = 'SeLoadDriverPrivilege';
  SE_SYSTEM_PROFILE_NAME = 'SeSystemProfilePrivilege';
  SE_SYSTEMTIME_NAME = 'SeSystemtimePrivilege';
  SE_PROF_SINGLE_PROCESS_NAME = 'SeProfileSingleProcessPrivilege';
  SE_INC_BASE_PRIORITY_NAME = 'SeIncreaseBasePriorityPrivilege';
  SE_CREATE_PAGEFILE_NAME = 'SeCreatePagefilePrivilege';
  SE_CREATE_PERMANENT_NAME = 'SeCreatePermanentPrivilege';
  SE_BACKUP_NAME = 'SeBackupPrivilege';
  SE_RESTORE_NAME = 'SeRestorePrivilege';
  SE_SHUTDOWN_NAME = 'SeShutdownPrivilege';
  SE_DEBUG_NAME = 'SeDebugPrivilege';
  SE_AUDIT_NAME = 'SeAuditPrivilege';
  SE_SYSTEM_ENVIRONMENT_NAME = 'SeSystemEnvironmentPrivilege';
  SE_CHANGE_NOTIFY_NAME = 'SeChangeNotifyPrivilege';
  SE_REMOTE_SHUTDOWN_NAME = 'SeRemoteShutdownPrivilege';
  SE_UNDOCK_NAME = 'SeUndockPrivilege';
  SE_SYNC_AGENT_NAME = 'SeSyncAgentPrivilege';
  SE_ENABLE_DELEGATION_NAME = 'SeEnableDelegationPrivilege';
  SE_MANAGE_VOLUME_NAME = 'SeManageVolumePrivilege';

const
 THREAD_TERMINATE               =$0001;
 THREAD_SUSPEND_RESUME          =$0002;
 THREAD_GET_CONTEXT             =$0008;
 THREAD_SET_CONTEXT             =$0010;
 THREAD_SET_INFORMATION         =$0020;
 THREAD_QUERY_INFORMATION       =$0040;
 THREAD_SET_THREAD_TOKEN        =$0080;
 THREAD_IMPERSONATE             =$0100;
 THREAD_DIRECT_IMPERSONATION    =$0200;
 THREAD_ALL_ACCESS              = STANDARD_RIGHTS_REQUIRED or SYNCHRONIZE or $3FF; // == $1F03FF;

function NTSetPrivilege(sPrivilege:string;fEnabled:LongBool):boolean;
var hToken:THandle;
    TokenPriv,PrevTokenPriv:TOKEN_PRIVILEGES;
    i:Cardinal;
begin
 Result:=false;
 if Win32Platform<>VER_PLATFORM_WIN32_NT then exit;
 if OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY,hToken) then
  begin
   try
    if LookupPrivilegeValue(nil,PChar(sPrivilege),TokenPriv.Privileges[0].Luid) then
     begin
      TokenPriv.PrivilegeCount:=1;
      if fEnabled then TokenPriv.Privileges[0].Attributes:=SE_PRIVILEGE_ENABLED else
       TokenPriv.Privileges[0].Attributes:=0;
      i:=0;
      PrevTokenPriv:=TokenPriv;
      AdjustTokenPrivileges(hToken,false,TokenPriv,SizeOf(PrevTokenPriv),PrevTokenPriv,i);
      Result:=GetLastError=ERROR_SUCCESS;
     end;
   except
   end;
   CloseHandle(hToken);
  end;
end;

function OpenThread(dwDesiredAccess:DWord;bInheritHandle:Bool;dwThreadId:DWord):Cardinal;
//Функция получения дескриптора потока по его идентификатору для Win 9X,ME,WinNT All
//dwDesiredAccess - флаги доступа к потоку
//bInheritHandle - флаг наследования дескриптора
//dwThreadId - идентификатор потока
//Выходные данные - дескриптор потока. При не удаче равен 0.
type
 TClient_ID=record
  pID:DWord;
  tID:DWord;
 end;
 TObjectAttributes=record
  dwSize:DWord;                    
  Attr:array [0..4] of DWord;
 end;
 TotWinMe=function(dwDesiredAccess:DWord;bInheritHandle:Bool;dwThreadId:DWord):DWord; stdcall;
 TotWinNT=function(out ThreadHandle:DWord;dwDesiredAccess:DWord;var ObjectAttributes:TObjectAttributes;var Client_ID:TClient_ID):DWord; stdcall;
var Kernel32,NTDLL:Cardinal;
    ErrOld:Cardinal;
    oProcess:Pointer;
    oThread:TotWinMe;
    NT_oThread:TotWinNT;
    pID:Cardinal;
    ObjectAttributes:^TObjectAttributes;
    Client_ID:TClient_ID;
begin
 Result:=0;
 pID:=GetCurrentProcessId();
 ErrOld:=SetErrorMode(SEM_NOOPENFILEERRORBOX);
 Kernel32:=LoadLibrary('Kernel32.dll');
 if (Kernel32<>0) then
  begin
   NTDLL:=LoadLibrary('ntdll.dll');
   if (NTDLL<>0) then
    begin
     NT_oThread:=GetProcAddress(NTDLL,'NtOpenThread');
     if assigned(NT_oThread) then
      begin
       ObjectAttributes:=VirtualAlloc(nil,SizeOf(TObjectAttributes),MEM_COMMIT,PAGE_EXECUTE_READWRITE);
       if (ObjectAttributes<>nil) then
        begin
         FillChar(ObjectAttributes^,SizeOf(TObjectAttributes),#0);
         ObjectAttributes^.dwSize:=SizeOf(TObjectAttributes);
         if DWord(bInheritHandle)<>0 then ObjectAttributes^.Attr[2]:=$2;
         Client_ID.pID:=0;
         Client_ID.tID:=dwThreadId;
         NT_oThread(Result,dwDesiredAccess,ObjectAttributes^,Client_ID);
         VirtualFree(ObjectAttributes,0,MEM_RELEASE);
        end;
      end;
     FreeLibrary(NTDLL);
    end;
   oThread:=GetProcAddress(Kernel32,'OpenThread');
   if (Result=0)and(assigned(oThread)) then
    Result:=oThread(dwDesiredAccess,bInheritHandle,dwThreadId);
   oProcess:=GetProcAddress(Kernel32,'OpenProcess');
   if (Result=0)and(oProcess<>nil) then
    begin
     asm
      pushfd
      pushad
      mov ebx,pID
      xor ebx,fs:[30h]
      xor ebx,dwThreadId
      mov eax,oProcess
      lea edi,[eax+24h]
      mov eax,[edi]
      cmp eax,0b9h
      jnz @Error_W9X
      mov oThread,edi
      lea esi,[ebx+2]
      push 2
      push esi
      call IsBadWritePtr
      or eax,eax
      jnz @Error_W9X
      mov ecx,oThread
      xchg eax,ebx
      push dwThreadId
      push bInheritHandle
      push dwDesiredAccess
      call ecx
      mov Result,eax
@Error_W9X:
      popad
      popfd
     end;
    end;
   FreeLibrary(Kernel32);
  end;
 SetErrorMode(ErrOld);  
end;

procedure KillX_1(pID:DWord);
var lTID:TList;
    i:integer;
    ThrID:PDWord;
    ot:DWord;
procedure ClFr(var l:TList);
var i:integer;
    p:PDWord;
begin
 try
  for i:=l.Count-1 downto 0 do
   begin
    p:=l.Items[i];
    if p<>nil then Dispose(p);
    l.Delete(i);
   end;
  l.Free;
 except
 end;
end;
function GetThread32():TList;
var H:THandle;
    Thread32:TThreadEntry32;
    t_PID:PDWord;
begin
 Result:=TList.Create;
 if pID=0 then exit;
 H:=CreateToolHelp32Snapshot(TH32CS_SNAPTHREAD,0);
 if H<>INVALID_HANDLE_VALUE then
  begin
   Thread32.dwSize:=SizeOf(TThreadEntry32);
   if Thread32First(H,Thread32) then
    repeat
      if Thread32.th32OwnerProcessID=pID then
       begin
        New(t_PID);
        t_PID^:=Thread32.th32ThreadID;
        Result.Add(t_PID);
       end;
    until (Thread32Next(H,Thread32)=false);
   CloseHandle(H);
  end;
end;
begin
 try
  lTID:=GetThread32();
  for i:=0 to lTID.Count-1 do
   begin
    ThrID:=lTID.Items[i];
    if ThrID<>nil then
     begin
      ot:=OpenThread(THREAD_TERMINATE,false,ThrID^);
      if ot<>0 then
       begin
        TerminateThread(ot,0);
        CloseHandle(ot);
       end;
     end;
   end;
 finally
  ClFr(lTID);
 end;
end;

procedure KillX_2(pID:DWord);
var op:DWord;
begin
 if pID<>0 then
  begin
   op:=OpenProcess(THREAD_TERMINATE,false,pID);
   if op<>0 then
    begin
     TerminateProcess(op,0);
     CloseHandle(op);
    end;
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
var i:DWord;
begin
 try
  i:=DWord(StrToInt(Edit1.Text));
  NTSetPrivilege(SE_DEBUG_NAME,true); 
  //KillX_1(i); //Вариант 1
  KillX_2(i);  //Вариант 2
 except
 end;
end;

end.


PS: Все енто есть на форуме... очень печально что не умеете пользоваться поиском!

Автор: Дм 29.7.2005, 21:34
Girder а ты не мог бы пояснить, что такое pID...
т.е. как я понял это наверное идентификатор процесса, но в строке
Код

i:=DWord(StrToInt(Edit1.Text));
фукция StrToInt преобразовывает строку в число, это означает что идентификатор процесса должен быть типа "число", а я не понял как это узнать... smile

Автор: Girder 30.7.2005, 12:24
Цитата
Girder а ты не мог бы пояснить, что такое pID...
т.е. как я понял это наверное идентификатор процесса, но в строке
Да.

Открой диспетчер задач и посмотри ентот идентификатор и введи его в Edit smile (возможно тебе надо будет включить колоночку с PID в диспетчере)

Автор: ScriptkidY 30.7.2005, 15:56
Дык в бате :
Код

:m
tskill UM9_PROCESSA.exe
goto m


smile

Автор: Гость_Дмитрий 31.7.2005, 21:27
Всем большое спасибо, smile вопрос закрыт!!! smile

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)