马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
PS:不要在意函数名啊变量名这些细节,←_←英语高考只有37的人体谅下#include<stdio.h>
#include<windows.h>
#include<tlhelp32.h>
#include<string.h>
void csh_all();//初始化所有
void csh_tq(int * i);//提权相关过程
void print_star();//输出最开始显示的内
void print_jclb();//输出当前进程列表
void zx_zzjc_jcm();//执行终止进程_进程名过程
void zx_zzjc_jcid();//执行终止进程_进程ID过程
void cls();//情况缓冲区
int tq_debug();//提权到debug
int qjcID(char*jcm);//取进程ID(英文很烂见谅)
int KillProcess_jcid(int jcid);//终止进程_进程ID
int KillProcess_jcm(char*jcm);//终止进程_进程名
HANDLE dkjc(char*jcm);//打开进程
char ch;
int main()
{
csh_all();
return 0;
}
void csh_all()
{
int t = 0;
csh_tq(&t);
if (t)
{
while (1)
{
print_star();
ch = getchar();
switch (ch)
{
case '0':
if ((ch = getchar()) != '\n')//解决01退出BUG
{
goto cs;
}
return 0;
case '1':
if ((ch = getchar()) != '\n')
{
goto cs;
}
print_jclb();
break;
case'2':
if ((ch = getchar()) != '\n')
{
goto cs;
}
printf("请选择方式(1:进程名 其他:进程ID):");
ch = getchar();
if (ch != '1')
{
zx_zzjc_jcid();
}
else
{
if ((ch = getchar()) != '\n')
{
cls();
zx_zzjc_jcid();
}
else
{
zx_zzjc_jcm();
}
}
break;
default:
cs: printf("你的输入有误!\n");
cls();
break;
}
}
}
}
void csh_tq(int * i)
{
if (tq_debug())
{
*i = 1;
}
else
{
printf("提权失败!是否继续?(1:继续,其他:退出):");
ch = getchar();
if (49 != ch)
{
return 0;
}
else
{
cls();
*i = 1;
}
}
}
void print_star()
{
printf("------------------------------------------------------\n");
printf("1:打印进程列表 2:终止进程 \n");
printf("0:退出 \n");
printf("------------------------------------------------------\n");
}
void print_jclb()
{
HANDLE jckz;
int jcjb;
PROCESSENTRY32 jcxx;
jckz = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);//先取得进程快照
if (0 == jckz)//判断是否成功
{
return;
}
jcxx.dwSize = sizeof(PROCESSENTRY32);//设置 PROCESSENTRY32 变量的大小
jcjb = Process32First(jckz, &jcxx);//获取第一个进程句柄
printf("进程名 进程ID 父进程ID 优先级\n");
while (jcjb != 0)//只要获取到的句柄不为零即成功获取就进入循环
{
printf("%-32s", jcxx.szExeFile);
printf("%-8d", jcxx.th32ProcessID);
printf("%-10d", jcxx.th32ParentProcessID);
printf("%d\n", jcxx.pcPriClassBase);
jcjb = Process32Next(jckz, &jcxx);//如果不是我们要的进程就获取下一个进程句柄
}
CloseHandle(jckz);
return;
}
void zx_zzjc_jcid()
{
int jcid;
printf("请输入你要终止的进程ID:");
scanf("%d", &jcid);
cls();
if (jcid < 0 || jcid>10000)
{
printf("你输入有误!\n");
return;
}
if (KillProcess_jcid(jcid))
{
printf("以成功终止进程!\n");
}
else
{
printf("终止进程失败!\n");
}
}
int KillProcess_jcid(int jcid)
{
HANDLE jb;
jb = OpenProcess(PROCESS_ALL_ACCESS, FALSE, jcid);//打开进程
if (TerminateProcess(jb, 0))//终止进程
{
return 1;
}
else
{
return 0;
}
}
void zx_zzjc_jcm()
{
WCHAR jcm[100];
printf("请输入你要终止的进程名:");
scanf("%s", jcm);
cls();
if (KillProcess_jcm(jcm))
{
printf("以成功终止进程!\n");
}
else
{
printf("终止进程失败!\n");
}
}
int KillProcess_jcm(char*jcm)
{
int jcjb, jcID;
HANDLE jb;
jcID = qjcID(jcm);//先获取进程ID
jb = OpenProcess(PROCESS_ALL_ACCESS, FALSE, jcID);//打开进程
if (TerminateProcess(jb, 0))//终止进程
{
return 1;
}
else
{
return 0;
}
}
int qjcID(char*jcm)
{
HANDLE jckz;
int jcjb;
PROCESSENTRY32 jcxx;
jckz = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);//先取得进程快照
if (0 == jckz)//判断是否成功
{
return 0;
}
jcxx.dwSize = sizeof(PROCESSENTRY32);//设置 PROCESSENTRY32 变量的大小
jcjb = Process32First(jckz, &jcxx);//获取第一个进程句柄
while (jcjb != 0)//只要获取到的句柄不为零即成功获取就进入循环
{
if (strcmp(jcm, jcxx.szExeFile) == 0)//判断进程名是否和我们要结束的一样
{
CloseHandle(jckz);
return jcxx.th32ProcessID;//如果是就返回进程PID
}
jcjb = Process32Next(jckz, &jcxx);//如果不是我们要的进程就获取下一个进程句柄
}
CloseHandle(jckz);
return 0;//如果没有我们要的就返回0
}
int tq_debug()
{
int retn;
TOKEN_PRIVILEGES qxlx;
HANDLE lpjb,jcjb;
jcjb = GetCurrentProcess();
OpenProcessToken(jcjb, TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY,&lpjb);
LookupPrivilegeValueA(NULL,"SeDebugPrivilege",&qxlx.Privileges->Luid);
qxlx.PrivilegeCount = 1;
qxlx.Privileges->Attributes = SE_PRIVILEGE_ENABLED;
retn = AdjustTokenPrivileges(lpjb, 0, &qxlx, NULL, NULL, NULL);
CloseHandle(jcjb);
return retn;
}
void cls()
{
while ((ch = getchar()) != '\n');
}
|