系统安全-进程操作

大体流程如下:
1.给系统当前进程信息,包括模块及线程等信息拍摄快照,保存当前状态留着后面慢慢研究。
2.使用系统process32 API遍历进程,输出进程名称及PID等信息。(进程信息以双向链表存储,可以使用next指针方法遍历。
3.根据输入ID来结束进程。

实现代码:

#include<iostream>
#include<Windows.h>
#include <stdio.h>
#include<TlHelp32.h>

using namespace std;
int main() {

	PROCESSENTRY32 pe32;
	HANDLE snap;
	snap = CreateToolhelp32Snapshot(TH32CS_SNAPALL, 0);//拍摄快照
	pe32.dwSize = sizeof(pe32);
	Process32First(snap, &pe32);
	while (Process32Next(snap, &pe32)) {
		wcout <<"进程名称为:" <<pe32.szExeFile<< endl;cout << "进程ID为"<<pe32.th32ProcessID<<endl<<endl;
//直接使用cout会输出16进制数,wcout输出宽字节
//宽字节即unicode编码的字符集,使用两个字节来表示一个字符
	}
	int pid;
	cout << "想要关闭的进程ID为:";
	cin >> pid;
	HANDLE p = OpenProcess(PROCESS_ALL_ACCESS, 0, pid);  //根据进程id打开进程,返回句柄
	TerminateProcess(p, 0);                    //根据句柄关闭进程
	return 0;
}

操作成果

ToolHelp API

关于Toolhelp API,MSDN是这样解释的:
The functions provided by the tool help library make it easier for you to obtain information about currently executing applications. These functions are designed to streamline the creation of tools.
提供的工具帮助库的功能方便您可以获取有关当前正在执行的应用程序的信息。这些功能旨在简化创建工具。
其实,ToolHelp API就是用于枚举进程,枚举模块,获取进程和模块信息的工具API。

快照函数CreateToolhelp32Snapshot,将当前进程使用的线程,模块等信息保存到内存中,相当于给系统进程信息拍摄了一张照片,留着后面慢慢看。
函数定义

HANDLE WINAPI CreateToolhelp32Snapshot(
DWORD dwFlags, //用来指定“快照”中需要返回的对象,可以是TH32CS_SNAPPROCESS等
DWORD th32ProcessID //一个进程ID号,用来指定要获取哪一个进程的快照,当获取系统进程列表或获取 当前进程快照时可以设为0
);

dwFlags:
指定快照中包含的系统内容,这个参数能够使用下列数值(常量)中的一个或多个,可用数字代替。

TH32CS_INHERIT(0x80000000) - 声明快照句柄是可继承的,
TH32CS_SNAPALL - 在快照中包含系统中所有的进程和线程。
TH32CS_SNAPHEAPLIST(0x00000001) - 在快照中包含在th32ProcessID中指定的进程的所有的堆。
TH32CS_SNAPMODULE(0x00000008) - 在快照中包含在th32ProcessID中指定的进程的所有的模块。
TH32CS_SNAPPROCESS(0x00000002) - 在快照中包含系统中所有的进程。
TH32CS_SNAPTHREAD(0x00000004) - 在快照中包含系统中所有的线程。
H32CS_SNAPALL = (TH32CS_SNAPHEAPLIST | TH32CS_SNAPPROCESS | TH32CS_SNAPTHREAD | TH32CS_SNAPMODULE)

进程获取

##process32First
process32First是一个进程获取函数,当我们利用函数CreateToolhelp32Snapshot()获得当前运行进程的快照后,我们可以利用process32First函数来获得第一个进程的句柄。(前面说过进程以双向链表数据结构存储,所以找到第一个就可以遍历剩下的进程。)
函数定义如下:

BOOL WINAPI Process32First(
    HANDLE hSnapshot,//_in
    LPPROCESSENTRY32 lppe//_out
);

其中 LPPROCESSENTRY32是可以视为是存储进程具体信息的结构体,其结构如下:

typedef struct tagPROCESSENTRY32 {
    DWORD dwSize; // 结构大小;
    DWORD cntUsage; // 此进程的引用计数;
    DWORD th32ProcessID; // 进程ID;
    DWORD th32DefaultHeapID; // 进程默认堆ID;
    DWORD th32ModuleID; // 进程模块ID;
    DWORD cntThreads; // 此进程开启的线程计数;
    DWORD th32ParentProcessID;// 父进程ID;
    LONG pcPriClassBase; // 线程优先权;
    DWORD dwFlags; // 保留;
    WCHAR szExeFile[MAX_PATH]; // 进程全名;
} PROCESSENTRY32;

##Process32Next
Process32Next是一个进程获取函数,当我们利用函数CreateToolhelp32Snapshot()获得当前运行进程的快照后,我们可以利用Process32Next函数来获得下一个进程的句柄。
函数定义如下:

BOOLWINAPIProcess32Next(
__inHANDLEhSnapshot,
__outLPPROCESSENTRY32lppe
);

此时定义的PROCESSENTRY32结构体中包含了我们想要获取的信息。
#进程操作
##OpenProcess
OpenProcess 函数根据pid打开一个已存在的进程对象,并返回进程的句柄。

1.函数原型
HANDLE OpenProcess(
DWORD dwDesiredAccess, //渴望得到的访问权限(标志)
BOOL bInheritHandle, // 是否继承句柄
DWORD dwProcessId// 进程标示符
);

dwDesiredAccess:获取的权限,可分为以下几种
PROCESS_ALL_ACCESS:获取所有权限
PROCESS_CREATE_PROCESS:创建进程
PROCESS_CREATE_THREAD:创建线程
PROCESS_DUP_HANDLE:使用DuplicateHandle()函数复制一个新句柄
PROCESS_QUERY_INFORMATION:获取进程的令牌、退出码和优先级等信息
PROCESS_QUERY_LIMITED_INFORMATION:获取进程特定的某个信息
PROCESS_SET_INFORMATION:设置进程的某种信息
PROCESS_SET_QUOTA:使用SetProcessWorkingSetSize函数设置内存限制
PROCESS_SUSPEND_RESUME:暂停或者恢复一个进程
PROCESS_TERMINATE:使用Terminate函数终止进程
PROCESS_VM_OPERATION:在进程的地址空间执行操作
PROCESS_VM_READ:使用ReadProcessMemory函数在进程中读取内存
PROCESS_VM_WRITE:使用WriteProcessMemory函数在进程中写入内存
SYNCHRONIZE:使用wait函数等待进程终止
bInheritHandle:TRUE或者FALSE
dwProcessId:pid

2.返回值
如成功,返回值为指定进程的句柄。
如失败,返回值为空,可调用GetLastError获得错误代码。

TerminateProcess

是C++编程语言中的一种函数,终止指定进程及其所有的线程。
函数定义:

BOOL TerminateProcess(
HANDLE hProcess,//进程句柄
UINT uExitCode //进程终止码
);

总结&其他

所谓进程操作无非是几个API的调用,只是系统安全的一个小小环节,但不可不知。

更多数据类型
DWORD
DWORD代表unsigned long,是MFC的数据类型,无符号整数。
Int随机器位数不同发生变化,16位机器长度为16位,32位上为32位。
HANDLE
句柄,在windows程序中,有各种各样的资源(窗口、图标、光标等),系统在创建这些资源时会为他们分配内存,并返回标示这些资源的标示号。

进程以双向链表方式存储。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值