一个如何终止系统进程的问题

 
 

主题:一个如何终止系统进程的问题!高手请进!谢谢



procedure TForm1.SystemProcessID;
var
pe:PROCESSENTRY32;
me:MODULEENTRY32;
hp,hm:Thandle;
b,b1:boolean;
Pro_path:string;
begin
Form1.ListBox1.Items.Clear;
hp:=CreateToolHelp32SnapShot(TH32CS_SNAPPROCESS,0);
pe.dwSize:=SizeOf(pe);
b:=Process32First(hp,pe);
while b do
begin //TH32CS_SNAPMODULE
hm:=CreateToolHelp32SnapShot(TH32CS_SNAPALL,pe.th32ProcessID);
me.dwSize:=sizeof(ModuleEntry32);
if Module32First(hm,me) then
begin
b1:=Module32First(hm,me);
Pro_path:=LowerCase(me.szExePath);
// ProcID[i] := me.th32ProcessID;
Form1.ListBox1.Items.Add(Pro_Path);
//TerminateProcess(
while b1 do
begin
// Form1.ListBox1.Items.Add();
b1:=Module32Next(hm,me);
end;
end;
b:=Process32Next(hp,pe);
end;
end;
在WIN2000中此函数可以获取一些用户执行的进程!无法获取系统进程!
执行结果如下:
d:/killproc/killproc.exe 2748
c:/winnt/explorer.exe 1576
c:/winnt/system32/mmc.exe 836
c:/program files/microsoft sql server/80/tools/binn/isqlw.exe 1852
c:/winnt/system32/taskmgr.exe 1292
d:/program files/borland/delphi6/bin/delphi32.exe 1788
c:/winnt/winhlp32.exe 532
c:/program files/internet explorer/iexplore.exe 1772
c:/program files/internet explorer/iexplore.exe 1096
c:/program files/internet explorer/iexplore.exe 2144
c:/winnt/system32/rdpclip.exe 2408
c:/winnt/explorer.exe 2444
c:/winnt/system32/internat.exe 2520
无法获取系统进程如 system.exe svchost.exe 等等
请问如何获取这些进程
我是使用这些来结束进程的
D:=OpenProcess(PROCESS_TERMINATE,True,ProcID[i]);
GetExitCodeProcess(D,IpE);
TerminateProcess(D,IpE);
我在任务管理器上的SVCHOST.EXE PROCESSID 输入处理结果 IPE的返回值=0 无法处理
请问这个该怎么办!
还望各位高手顶力襄助!谢谢


回复人:hatedeadlock(雪男孩(41289435))  二级(初级)  信誉:99      2004-11-15 21:06:06  得分:0
 
 

终止进程的内幕

--------------------------------------------------------------------------------
阅读:20874 时间:2004-11-3 5:40:22 来源:黑客基地 编辑:古典辣M° 
 
pjf(jfpan20000@sina.com)

有来信询问进程结束的有关问题,下面就这个问题简单讨论一下(下面的讨论基于2000,其他NT系统也类似)。
首先看看一个应用程序想要强制结束另一个进程所要做的事:首先获得目标的进程ID,接着利用OpenProcess获取进程句柄(确保足够权限),最后将句柄传给TerminateProcess了结那个进程。
1、OpenProcess通过本机系统服务接口进入核心态,随后调用ntoskrnl的NtOpenProcess。在服务函数里,系统使用SeSinglePrivilegeCheck检查调用者是否有DEBUG权限(SeDebugPrivilege),若有,则修改AccessState使得在后面的操作中获取允许任意进程访问操作的句柄。最后通过ObOpenObjectByName或PsLookupProcess*** + ObOpenObjectByPointer来打开进程(创建并返回进程句柄)。
2、TerminateProcess通过本机系统服务接口进入核心态,随后调用ntoskrnl的NtTerminateProcess。系统首先调用ObReferenceObjectByHandle获取进程执行体块,执行体块的DebugPort指出进程是否处于调试状态,若处于调试状态且传入的ExitStatus为DBG_TERMINATE_PROCESS则返回失败禁止结束进程。随后服务函数转入正题:
系统利用ThreadListHead枚举进程的每一个线程,使用PspTerminateThreadByPointer来结束它们。注意并不是对每个线程系统都会忠实地执行你的命令:若枚举到的线程是系统线程则不会继续执行而是返回STATUS_INVALID_PARAMETER。判断的方法是线程的Teb为零或者Teb的值在内核地址空间。有人问2000下为何csrss.exe进程杀不死,很简单,打开IceSword,在进程栏利用右键菜单的“线程信息”看一下,看到那几个Teb为零的线程没有?(注意是针对windows2000,XP下不同。另外一点就是csrss中其它非系统线程的线程是很容易被杀死的,试图结束csrss时也可以看到在Teb为零的线程前面的线程已被杀掉,只是操作停在了Teb为零的线程这里) 再看看system进程,呵呵。IceSword也并未提供杀除这种进程的功能,因为觉得没有需求。在最后一个线程结束时,进程的生命也结束了,随着PspExitProcess/ObKillProcess灰飞烟灭。
另一方面,线程是怎样结束的呢。PspTerminateThreadByPointer并不是直接“杀掉”指定线程,实质上线程是“自杀”的,呵呵。系统简单的使用KeInitializeApc/KeInsertQueueApc插入了一个核心态的APC调用,若是用户线程,会再插入用户态的APC调用,最终线程在自己的执行环境中使用PspExitThread(...=>KeTerminateThread=>KiSwapThread)悲壮的自行了断。
有人问起为什么IceSword有时杀不死除那三个有系统线程的进程(两个是csrss、system,而idle是个非常奇特的存在,与众不同,这里不多废话了)外的其它进程。从上面的讨论可以找到答案。这种情况往往是目标进程的某用户态线程进入核心态后,系统出了某些问题挂死在核心态,无法返回执行Apc例程的缘故。IceSword未强制除去它们是考虑此刻系统可能已经有某些问题,强制删除操作更有可能使系统崩溃,不过有了不少用户要求有这项功能,所以以后有空可能会加上(已经有一大堆杂七杂八的要求了,很难有时间升级一下版本,~_~)。
一般来说,要干掉一个进程,有了Debug权限就可以了,若别人有了保护,那就要发挥你的能力了。


可是我看得不是很明白!有没有朋友能不能帮忙将他转换成代码!谢谢
TOP
回复人:hatedeadlock(雪男孩(41289435))  二级(初级)  信誉:99      2004-11-15 21:29:14  得分:0
 
 

在 線等待...............
TOP
回复人:hatedeadlock(雪男孩(41289435))  二级(初级)  信誉:99      2004-11-16 0:21:33  得分:0
 
 

function.c中有两个函数,一个是提升权限的,一个是提供进程ID,杀进程的。代码如
下:
/***********************************************************************
Module:function.c
Date:2001/4/28
Author:ey4s<ey4s@21cn.com>
Http://www.ey4s.org
***********************************************************************/
#include <windows.h>
////////////////////////////////////////////////////////////////////////////
BOOL SetPrivilege(HANDLE hToken,LPCTSTR lpszPrivilege,BOOL bEnablePrivilege)
{
TOKEN_PRIVILEGES tp;
LUID luid;

if(!LookupPrivilegeValue(NULL,lpszPrivilege,&luid))
{
printf("/nLookupPrivilegeValue error:%d", GetLastError() );
return FALSE;
}
tp.PrivilegeCount = 1;
tp.Privileges[0].Luid = luid;
if (bEnablePrivilege)
tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
else
tp.Privileges[0].Attributes = 0;
// Enable the privilege or disable all privileges.
AdjustTokenPrivileges(
hToken,
FALSE,
&tp,
sizeof(TOKEN_PRIVILEGES),
(PTOKEN_PRIVILEGES) NULL,
(PDWORD) NULL);
// Call GetLastError to determine whether the function succeeded.
if (GetLastError() != ERROR_SUCCESS)
{
printf("AdjustTokenPrivileges failed: %u/n", GetLastError() );
return FALSE;
}
return TRUE;
}
////////////////////////////////////////////////////////////////////////////
BOOL KillPS(DWORD id)
{
HANDLE hProcess=NULL,hProcessToken=NULL;
BOOL IsKilled=FALSE,bRet=FALSE;
__try
{

if(!OpenProcessToken(GetCurrentProcess(),TOKEN_ALL_ACCESS,&hProcessToken))
{
printf("/nOpen Current Process Token failed:%d",GetLastError());
__leave;
}
//printf("/nOpen Current Process Token ok!");
if(!SetPrivilege(hProcessToken,SE_DEBUG_NAME,TRUE))
{
__leave;
}
printf("/nSetPrivilege ok!");

if((hProcess=OpenProcess(PROCESS_ALL_ACCESS,FALSE,id))==NULL)
{
printf("/nOpen Process %d failed:%d",id,GetLastError());
__leave;
}
//printf("/nOpen Process %d ok!",id);
if(!TerminateProcess(hProcess,1))
{
printf("/nTerminateProcess failed:%d",GetLastError());
__leave;
}
IsKilled=TRUE;
}
__finally
{
if(hProcessToken!=NULL) CloseHandle(hProcessToken);
if(hProcess!=NULL) CloseHandle(hProcess);
}
return(IsKilled);
}

这是VC的代码:
请问怎样才能转换成为DELPHI的代码
TOP
回复人:xiangwangz(<*敝屣荣华 浮云生死 此身何惧*>)  一星(中级)  信誉:105      2004-11-16 8:40:21  得分:20
 
 

//列举进程

uses tlhelp32;
/////////////////
var hand:thandle;
lppe:PROCESSENTRY32;
found:boolean;
t:integer;
begin
combobox_hint:=false;
t:=1;
memo1.Clear ;
listbox2.Clear ;
memo1.Visible:=false;
memo1.lines.Add('**********************');
memo1.lines.Add('进程相关详细信息如下: ');
memo1.lines.Add('**********************'+#13#10);
Hand:=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
if hand>0 then
lppe.dwSize:= sizeof(PROCESSENTRY32);
found:=Process32First(Hand,lppe);
while found do
begin
treeview1.Items.addchild(treeview1.Selected,lppe.szExeFile);
treeview1.items[t+1].ImageIndex:=2;
combobox2.items.Add(inttostr(lppe.th32ProcessID ));


memo1.lines.Add('进程序号: '+inttostr(t));
memo1.lines.Add(' 进程名:'+strpas(lppe.szExeFile));
listbox2.Items.Add(strpas(lppe.szExeFile));
memo1.lines.Add(' 进程标识符(ID):'+inttostr(lppe.th32ProcessID));
memo1.lines.Add(' 进程引用计数:'+inttostr(lppe.cntUsage));
memo1.lines.Add(' 父进程标识符(ID):'+inttostr(lppe.th32ParentProcessID));
memo1.lines.Add(' 该进程结构字节数:'+inttostr(lppe.dwSize));
memo1.lines.Add(' 进程模块标识符:'+inttostr(lppe.th32ModuleID ));
memo1.lines.Add(' 进程默认堆标识符:'+inttostr(lppe.th32DefaultHeapID ));
memo1.lines.Add(' 进程创建的线程的基础优先级:'+inttostr(lppe.pcPriClassBase));
memo1.lines.Add(' 该进程派生线程数:'+inttostr(lppe.cntThreads));
memo1.lines.Add('*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*');
t:=t+1;
found:=Process32next(Hand,lppe);
end;
closehandle(hand);
memo1.Visible:=true;
end;
TOP
回复人:xiangwangz(<*敝屣荣华 浮云生死 此身何惧*>)  一星(中级)  信誉:105      2004-11-16 8:41:58  得分:0
 
 

//杀死进程
function KillTask(ExeFileName: string): Integer;
//ExeFileName为进程名
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;
TOP
回复人:xiangwangz(<*敝屣荣华 浮云生死 此身何惧*>)  一星(中级)  信誉:105      2004-11-16 8:44:47  得分:0
 
 

procedure TForm1.Button2Click(Sender: TObject); //进程列举
var hand:thandle;
lppe:PROCESSENTRY32;
found:boolean;
t:integer;
begin
t:=1;
memo1.Clear ;
memo1.Visible:=false;
memo1.lines.Add('**********************');
memo1.lines.Add('进程相关详细信息如下: ');
memo1.lines.Add('**********************'+#13#10);
Hand:=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
if hand>0 then
lppe.dwSize:= sizeof(PROCESSENTRY32);
found:=Process32First(Hand,lppe);
while found do
begin
memo1.lines.Add('进程序号: '+inttostr(t));
memo1.lines.Add(' 进程名:'+strpas(lppe.szExeFile));
memo1.lines.Add(' 进程标识符(ID):'+inttostr(lppe.th32ProcessID));
memo1.lines.Add(' 进程引用计数:'+inttostr(lppe.cntUsage));
memo1.lines.Add(' 父进程标识符(ID):'+inttostr(lppe.th32ParentProcessID));
memo1.lines.Add(' 该进程结构字节数:'+inttostr(lppe.dwSize));
memo1.lines.Add(' 进程模块标识符:'+inttostr(lppe.th32ModuleID ));
memo1.lines.Add(' 进程默认堆标识符:'+inttostr(lppe.th32DefaultHeapID ));
memo1.lines.Add(' 进程创建的线程的基础优先级:'+inttostr(lppe.pcPriClassBase));
memo1.lines.Add(' 该进程派生线程数:'+inttostr(lppe.cntThreads));
memo1.lines.Add('*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*');
t:=t+1;
found:=Process32next(Hand,lppe);
end;
closehandle(hand);
memo1.Visible:=true;
end;
TOP
回复人:beyondtkl(大龙驹<暗黑系魔法师&&赏金猎人>)  一星(中级)  信誉:100      2004-11-16 9:07:32  得分:0
 
 

是的 获得DEBUG权限 基本上系统的进程也可以灭掉。。。
有空我给你改一下
TOP
回复人:ypyRock(Rock)  二级(初级)  信誉:98      2004-11-16 9:17:34  得分:0
 
 

要先加上提升本进程权限的代码
TOP
回复人:beyondtkl(大龙驹<暗黑系魔法师&&赏金猎人>)  一星(中级)  信誉:100      2004-11-16 9:25:33  得分:30
 
 

function SetPrivilege(hToken:THANDLE;lpszPrivilege: LPCTSTR;bEnablePrivilege:LongBool):LongBool;
var
tp: TOKEN_PRIVILEGES;
luid: LUID;

begin
Result := False;
if not LookupPrivilegeValue(nil, lpszPrivilege, &luid) then // or luid 因为可能delphi封装为 var.的形式
begin
Exit;
end;
tp.PrivilegeCount := 1;
tp.Privileges[0].Luid := luid;
if bEnablePrivilege then
tp.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED
else
tp.Privileges[0].Attributes := 0;
AdjustTokenPrivileges(
hToken,
FALSE,
&tp, // or tp 因为可能delphi封装为 var.的形式
sizeof(TOKEN_PRIVILEGES),
(PTOKEN_PRIVILEGES) nil,
(PDWORD) nil);

if (GetLastError() <> ERROR_SUCCESS)
begin
Exit;
end;
Result := TRUE;
end;

function KillPS(id: DWORD):LongBool;
var
hProcess,hProcessToken: THandle;
IsKilled, bRet: Boolean;
begin
hProcess := 0;
hProcessToken := 0;
IsKilled := False;
{try
if not OpenProcessToken(GetCurrentProcess(), TOKEN_ALL_ACCESS, &hProcessToken) then // or hProcessToken
begin // __leave 是跳到__finally处 不知道delphi有没有这样的.. 没有就用goto 或者换一种写法

end;
finally

end;}
try
if OpenProcessToken(GetCurrentProcess(), TOKEN_ALL_ACCESS, &hProcessToken) then // or hProcessToken
begin
hProcess := OpenProcess(PROCESS_ALL_ACCESS,FALSE,id);
if hProcess <> 0 then
begin
if TerminateProcess(hProcess, 1) then
begin
IsKilled = True;
end;
end;
end;
finally
if hProcessToken <> 0 then
CloseHandle(hProcessToken);
if hProcess <> 0 then
CloseHandle(hProcess);
end;
Result := IsKilled;
end;

试试。。
TOP
回复人:cyblueboy83(爱情白痴—电脑迷)  二级(初级)  信誉:100      2004-11-16 9:26:15  得分:0
 
 

关注中
TOP
回复人:extcsdn(Studing VB now)  五级(中级)  信誉:102      2004-11-16 9:38:06  得分:0
 
 

up
TOP
回复人:gyf(无根草)  二级(初级)  信誉:99      2004-11-16 10:10:22  得分:0
 
 

收藏
TOP
回复人:hatedeadlock(雪男孩(41289435))  二级(初级)  信誉:99      2004-11-16 12:16:05  得分:0
 
 

谢谢大家 综合以上的答案我已经写出来了
但是 又有一个新问题了 怎样获取每条进程所占用的内存资源呢??


TOP
回复人:hatedeadlock(雪男孩(41289435))  二级(初级)  信誉:99      2004-11-16 12:29:07  得分:0
 
 

综合 xiangwangz 和 beyondtkl的代码 基本上除了IDE外系统的所有进程都可以杀掉

TOP
回复人:hatedeadlock(雪男孩(41289435))  二级(初级)  信誉:99      2004-11-16 12:31:33  得分:0
 
 

一个新问题 怎样获取每条进程所占用的内存资源呢??

TOP
回复人:beyondtkl(大龙驹<暗黑系魔法师&&赏金猎人>)  一星(中级)  信誉:100      2004-11-16 12:59:50  得分:0
 
 

一个新问题 怎样获取每条进程所占用的内存资源呢??

没办法获取。。因为内存很多分配的都是虚拟内存。。。。
TOP
回复人:hatedeadlock(雪男孩(41289435))  二级(初级)  信誉:99      2004-11-16 15:43:08  得分:0
 
 

我已经全部搞定
很谢谢大家的帮忙!
TOP
回复人:hatedeadlock(雪男孩(41289435))  二级(初级)  信誉:99      2004-11-16 15:44:34  得分:0
 
 

--------
TOP
回复人:hatedeadlock(雪男孩(41289435))  二级(初级)  信誉:99      2004-11-16 15:55:00  得分:0
 
 
获取内存的函数
function GetMemSize(pid:THandle):Cardinal;
var
cb:Integer;
pmc:PPROCESS_MEMORY_COUNTERS;
begin
cb:=SizeOf(_PROCESS_MEMORY_COUNTERS);
GetMem(pmc,cb);
pmc^.cb:=cb;
PID:=OpenProcess(PROCESS_ALL_ACCESS, true, PID);
if GetProcessMemoryinfo(PID,pmc,cb) then
Result:=pmc^.WorkingSetSize
else Result:=0;
FreeMem(Pmc);
CloseHandle(PID);
end;
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值