吾爱破解 - LCG - LSG |安卓破解|病毒分析|www.52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 3278|回复: 4
收起左侧

[C&C++ 转载] 简易进程管理C语言版

  [复制链接]
SeriousSnow 发表于 2015-9-11 12:08
PS:不要在意函数名啊变量名这些细节,←_←英语高考只有37的人体谅下
[C] 纯文本查看 复制代码
#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');
}

免费评分

参与人数 1热心值 +1 收起 理由
山顶的一棵草 + 1 不会C,只是觉得会C的人很牛B~

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

吃兔子de胡萝卜 发表于 2015-9-11 12:46
看起来好复杂 有没有软件版的
xyzxf 发表于 2015-9-11 13:59
擦不就获取进程令牌提个权搞这么高大尚干嘛。。。。。。。。。。。。
ぁмǐηɡ玥夜 发表于 2015-10-3 18:01
云上于天 发表于 2015-10-9 15:23
函数看晕
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则 警告:本版块禁止灌水或回复与主题无关内容,违者重罚!

快速回复 收藏帖子 返回列表 搜索

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-6-13 08:01

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表