主题:一个如何终止系统进程的问题!高手请进!谢谢
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
|
回复人: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
|
回复人: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
|
回复人:extcsdn(Studing VB now) 五级(中级) 信誉:102 2004-11-16 9:38:06 得分:0
|
回复人:gyf(无根草) 二级(初级) 信誉:99 2004-11-16 10:10:22 得分:0
|
回复人: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
|
回复人:hatedeadlock(雪男孩(41289435)) 二级(初级) 信誉:99 2004-11-16 15:44:34 得分:0
|
回复人: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; | |