在Ring3对进程进行保护的方法总是很乏力,HOOK一些Ring3层的函数,对进程名或进程ID进行判断等。今天看了一个比较老的方法,远程线程保护,整理代码,学习到不少,在此记录跟大家分享。
线程保护的思路让其它程序监视自身,如果自身程序退出,那么监视程序就重新启动该程序。使用远程线程将监视代码插入到其他进程,例如winlogon.exe等系统进程。将自己进程的句柄传给保护进程,保护进程通过用WaitForSingleObject() 函数来检测句柄来判断要保护的进程是否结束。
因为保护自身的代码要注入到winlogon.exe进程,而执行在远程线程代码的API都需要重新定位,为解决这个问题需要定义如下的结构
typedef struct _REMOTEPARAM
{
DWORD rpWaitForSingleObject;
DWORD rpOpenProcess;
DWORD rpWinExec;
DWORD rpProcessPID; //被保护进程PID
HANDLE rpProcessHandle; //被保护进程句柄
char Path[MAX_PATH]; //被保护进程路径
} RemoteParam;
为了方便我整个代码都贴出来,VS2008下能够编译,并且达到进程保护,注入系统进程时,安全软件会进行提示,因为是老技术,此处仅为学习。
#include <Windows.h>
#include <Psapi.h>
#include <stdio.h>
#pragma comment(lib,"Psapi.li