为了保护我们的进程不被人随便强制关闭,我们需要一种机制来实现,网上大概有几种方式:1.写一个驱动程序,在驱动程序里面hook系统的api来实现,例如ssdt方式,等等。2.就是在应用层挂钩系统api,这种方式也就远程注入,全局钩子啊等等,只是网上也有很多,不过很多在xp上是正常的到了win7 64就失效了。还有最简单的就是启动两个进程相互监视对方,(这个可能看起来不专业)。 网上方法很多,我写这个主要是学习归类整理。
我实现的方式整一个全局的钩子 主要参考http://www.360doc.com/content/13/0911/10/13336430_313670033.shtml ,钩子部分基本是借用这里的代码,我只是在上面扩展了一下,同时可以保护多个进程,被保护的进程不需要加装hook api的dll文件。 因为在win7 64下面挂钩任务管理器需要64位的dll和64位的安装钩子程序,这样32位的进程就很难被保护了。 编译64位程序需要vs2008有64的环境还需要设置一些64的宏,代码有注释,所以直接上代码。
1.hook api 的主要dll文件
// dllmain.cpp : 定义 DLL 应用程序的入口点。
#include <Windows.h>
#include "Export.h"
#ifdef _WIN64
#undef _M_IX86
#endif
#include "mhook-lib\mhook.h"
//参考代码 url
//http://www.360doc.com/content/13/0911/10/13336430_313670033.shtml
//=========================================================
// struct CLIENT_ID
typedef struct _CLIENT_ID {
DWORD_PTR UniqueProcess;
DWORD_PTR UniqueThread;
} CLIENT_ID, *PCLIENT_ID;
//===========================================================
// NtOpenProcess
typedef ULONG (WINAPI *pfnNtOpenProcess)(
__out PHANDLE ProcessHandle,
__in ACCESS_MASK AccessMask ,
__in PVOID ObjectAttributes,
__in PCLIENT_ID ClientId);
pfnNtOpenProcess _NtOpenProcess = (pfnNtOpenProcess)GetProcAddress( GetModuleHandle(L"ntdll"),"NtOpenProcess");
//共享内存结构体,用于存储保护的PID
typedef struct SHWP_STRUCT_
{
BOOL isWrite;
TCHAR cProcessid[512];
} SHWP_STRUCT, *LPSHWP_STRUCT;
//==============================================================
// 变量
HINSTANCE glhInstance = NULL;
DWORD gProtectProcessID = 0;
HANDLE ghMapFile = NULL;
//共享内存结构体
LPSHWP_STRUCT lpData = NULL;
//dll共享全局变量
#pragma data_seg("ShareSecNJ")
HHOOK glhHook = NULL; //把glhHook放入ShareSec段
#pragma data_seg()
#pragma comment(linker,"/SECTION:ShareSecNJ,RWS")//告诉编译器为ShareSec段添加共享段读写属性
void splitString(wstring& s, wstring delim,vector<wstring >& ret)
{
size_t last = 0;
size_t index=s.find(delim,last); //delim 为字符串的时候find_first_of可能会出错
ret.clear();
wstring strTmp;
while (index!=std::wstring::npos