//==================HOOK钩子=========================
可以用来HOOK掉系统对某些函数的的调用
//==================终止系统进程=====================
4种终止方式:
1、主线程的入口函数返回
2、进程中一个线程调用ExitProcess函数,只能结束当前进程,不能用于结束其他进程。
3、进程中的所有线程都结束了
4、其他进程中的一个线程调用了TerminateProcess函数
//TerminateProcess函数终止指定进程及其所有线程。
BOOL TerminateProcess(
HANDLE hProcess,//进程句柄
UINT uExitCode //进程终止码
);
//OpenProcess 函数用来打开一个已存在的进程对象,并返回进程的句柄。
HANDLE OpenProcess(
DWORD dwDesiredAccess, //向得到的访问权限(标志),可以说PROCESS_ALL_ACCESS,PROCESS_QUERY_INFORMATION等
BOOL bInheritHandle, // 是否继承句柄
DWORD dwProcessId// 进程标示符
);
//==================获取系统进程=====================
获取系统进程:ToolHelp函数和EnumProcess函数
PROCESSENTRY32 pe32;
HANDLE hProcessSnap = ::CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0); //系统进程拍快照,返回值作为形参给Process32First和Process32Next
BOOL bmore=::Process32First(hProcessSnap,&pe32)
bmore =::Process32Next(hProcessSnap,&pe32)
CloseHandle(hProcessSnap);
ToolHelp函数并不是获取系统进程信息的唯一方法,还可以使用EnumProcess函数。
TH32CS_SNAPHEAPLIST //枚举th32ProcessID参数指定的进程中的堆
TH32CS_SNAPMODULE //枚举th32ProcessID参数指定的进程中的模块
TH32CS_SNAPPROCESS //枚举系统范围内的进程,此时th32ProcessID参数被忽略
TH32CS_SNAPTHREAD //枚举系统范围内的线程,此时th32ProcessID参数被忽略
HANDLE WINAPI CreateToolhelp32Snapshot(
DWORD dwFlags, //用来指定"快照"中需要返回的对象,可以是TH32CS_SNAPPROCESS等
DWORD th32ProcessID //一个进程ID号,用来指定要获取哪一个进程的快照,当获取系统进程列表或获取 当前进程快照时可以设为0
);
typedef struct tagPROCESSENTRY32
{
DWORD dwSize; //结构的长度,必须预先设置
DWORD cntUsage; //进程的引用计数
DWORD th32ProcessID; //进程的ID
ULONG_PTR th32DefaultHeapID; //进程默认堆的ID
DWORD th32ModuleID; //进程模块的ID
DWORD cntThreads; //进程创建的线程数
DWORD th32ParentProcessID; //进程的父线程ID
LONG pcPriClassBase; //进程创建的线程的基本优先级
DWORD dwFlags; //内部使用
TCHAR szExeFile[MAX_PATH]; //进程对应的可执行文件名
} PROCESSENTRY32, *PPROCESSENTRY32;
//==================应用程序的启动过程=====================
应用程序的启动过程,就是进程的创建过程,调用CreateProcess函数创建进程
创建新进程时会为新进程指定一个STARTUPINFO类型的变量,,这个结构包含了父进程传递给子进程的一些显示信息。
一个进程可以调用GetStartupInfo函数来取得父进程创建自己时使用的STARTUPINFO结构。例如:
VOID GetStartupInfo(LPSTARTUPINFO lpStarupInfo); //取得当前进程被创建时指定的STARTUPINFO结构
初始化STARTUPINFO结构的大小,例如:
STARTUPINFO si = {sizeof(si)}; //将cb成员初始化为sizeof(si),其他成员初始化为0
::GetStartupInfo(&si);
si.dwFlags = STARTF_USESHOWWINDOW; //指定wShowWindow成员有效