在Windows中如何通过某个进程对Kill另外的进程。
1.获取系统中正在运行的进程、线程的信息
HANDLE WINAPI CreateToolhelp32Snapshot(
DWORD dwFlags, //用来指定“快照”中需要返回的对象,可以是TH32CS_SNAPPROCESS等
DWORD th32ProcessID //一个进程ID号,用来指定要获取哪一个进程的快照,当获取系统进程列表或获取 当前进程快照时可以设为0
);
dwFlags 指定快照中包含的系统内容,这个参数能够使用下列数值(常量)中的一个或多个。
TH32CS_INHERIT - 声明快照句柄是可继承的。
TH32CS_SNAPALL - 在快照中包含系统中所有的进程和线程。
TH32CS_SNAPHEAPLIST - 在快照中包含在th32ProcessID中指定的进程的所有的堆。
TH32CS_SNAPMODULE - 在快照中包含在th32ProcessID中指定的进程的所有的模块。
TH32CS_SNAPPROCESS - 在快照中包含系统中所有的进程。
TH32CS_SNAPTHREAD - 在快照中包含系统中所有的线程。
th32ProcessID 指定将要快照的进程ID。如果该参数为0表示快照当前进程。该参数只有在设置了TH32CS_SNAPHEAPLIST或者TH32CS_SNAPMODULE后才有效,在其他情况下该参数被忽略,所有的进程都会被快照。
获取现在说有进程的信息并返回 hsnpshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
2.遍历进程快照,轮巡显示每个进程的信息
PROCESSENTRY32 te;
pe32.dwSize = sizeof(pe32); //在使用这个结构前,先设置它的大小
BOOL f0k = Process32First(hSnApshot,&te); //获取第一个进程信息
f0k = Process32Next(hSnApshot,&te); //获取后续进程信息
3.提升当前进程的权限(参考https://baike.baidu.com/item/OpenProcessToken/9825617?fr=aladdin)
BOOL OpenProcessToken( //打开某个进程的访问令牌,并返回令牌指针给tokenhandle
__in HANDLE ProcessHandle, //要修改访问权限的进程句柄
__in DWORD DesiredAccess, //指定你要进行的操作类型
__out PHANDLE TokenHandle //返回的访问令牌指针
);
BOOL LookupPrivilegeValue( //查看系统的指定特权并返回特权名称信息给lpluid
LPCTSTR lpSystemName, //第一个参数表示所要查看的系统,本地系统直接用NULL
LPCTSTR lpName, //第二个参数指向一个以零结尾的字符串,指定要查看的特权的名称,
PLUID lpLuid //第三个参数用来接收所返回的制定特权名称的信息。
);
AdjustTokenPrivileges这个函数启用或禁止 指定访问令牌的特权。
BOOL AdjustTokenPrivileges( //启用或禁用特权一个有TOKEN_ADJUST_PRIVILEGES访问的访问令牌.
HANDLE TokenHandle, //包含特权的句柄
BOOL DisableAllPrivileges,//禁用所有权限标志
PTOKEN_PRIVILEGES NewState,//新特权信息的指针(结构体)
DWORD BufferLength, //缓冲数据大小,以字节为单位的PreviousState的缓存区(sizeof)
PTOKEN_PRIVILEGES PreviousState,//接收被改变特权当前状态的Buffer
PDWORD ReturnLength //接收PreviousState缓存区要求的大小
);
4.结束进程 http://blog.csdn.net/pxm2525/article/details/39828815
TerminateProcess函数终止指定进程及其所有线程。
BOOL TerminateProcess(
HANDLE hProcess,//进程句柄
UINT uExitCode //进程终止码
);
注意:PROCESS_ALL_ACCESS 权限并不包括 PROCESS_TERMINATE 所以在终止进程前,openprocess要以PROCESS_TERMINATE权限对进程进行打开
实例:
#include "stdio.h"
#include "windows.h"
#include "winbase.h"
#include "tlhelp32.h"
#pragma comment(lib,"kernel32.lib")
#pragma comment(lib,"advapi32.lib")
void EnableDebugPriv( void )
{
HANDLE hToken;
TOKEN_PRIVILEGES tkp;
OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken);
LookupPrivilegeValue(NULL, SE_SHUTDOWN_NAME,&tkp.Privileges[0].Luid);
tkp.PrivilegeCount = 1; //数组的个数
tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED; //使能一个权限值
AdjustTokenPrivileges(hToken, FALSE, &tkp, 0,
(PTOKEN_PRIVILEGES)NULL, 0);
CloseHandle( hToken );
}
DWORD pskill(DWORD id) //根据进程ID杀进程
{
HANDLE hProcess=NULL;
//打开目标进程
hProcess=OpenProcess(PROCESS_TERMINATE,FALSE,id);
if (hProcess==NULL){
printf("\nOpen Process fAiled:%d\n",GetLastError());
return -1;
}
//结束目标进程
DWORD ret=TerminateProcess(hProcess,0);
if(ret==0){
printf("%d",GetLastError());
} return -1;
}
DWORD main(void)
{
DWORD id = 0;
//进程列举
HANDLE hSnApshot= CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
if(hSnApshot!=INVALID_HANDLE_VALUE){
PROCESSENTRY32 te={sizeof(te)};
BOOL f0k = Process32First(hSnApshot,&te);
for(;f0k;f0k=Process32Next(hSnApshot,&te))
{
printf("Pid: %d %s\n",te.th32ProcessID ,te.szExeFile );
if (stricmp(te.szExeFile, "shownum.exe") == 0)
{
id = te.th32ProcessID;
break;
}
}
}
CloseHandle(hSnApshot);
//杀进程
printf("the process's id which you want to kill: %d",id);
//scanf("%d",&id);
EnableDebugPriv(); //提升权限
pskill(id);
system("pause");
return 0;
}