程序原理
很简单:弄俩进程,互相检测对方有没有被杀,被杀就再调一个,实现防杀效果。
原来我用了两个程序,但比较麻烦,就合并了,但是没有实现就自己运行的效果,只能自我复制一份。
可以把文件名改一下,但是要全部都改掉,包括最后的文件名检测。
源码
//防杀进程-示例
#include <windows.h>
#include <tlhelp32.h>
#include <string.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#define CANCEL_PROCESS "notepad.exe" //退出条件
HANDLE GetProcessHandle(DWORD pid)
{
return OpenProcess(PROCESS_TERMINATE,FALSE, pid);
}
HANDLE GetProcessHandle(LPCSTR name)
{ //*****警告!必须加扩展名!!!!*****//
HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
if (INVALID_HANDLE_VALUE == hSnapshot)
{
return NULL;
}
PROCESSENTRY32 pe = { sizeof(pe) };
BOOL fOk;
for (fOk = Process32First(hSnapshot, &pe); fOk; fOk = Process32Next(hSnapshot, &pe))
{
if (!strcasecmp(pe.szExeFile, name))
{
CloseHandle(hSnapshot);
return GetProcessHandle(pe.th32ProcessID);
}
}
return NULL;
}//来自 https://blog.csdn.net/fzuim/article/details/60954959
BOOL HaveProcess(LPCSTR lpName)
{//*****警告!必须加扩展名!!!!*****//
return (GetProcessHandle(lpName) != NULL ? true : false);
}
DWORD Daemon(UINT n) //n填自己
{
HANDLE hp=NULL;
bool exist=false;
STARTUPINFO si;
PROCESS_INFORMATION pi;
ZeroMemory(&si, sizeof(si));
si.cb = sizeof(si);
ZeroMemory(&pi, sizeof(pi));
while(1) //使……不死
{
if(HaveProcess(CANCEL_PROCESS))
{ //没有这个会很尴尬的。
exit(0);
return 0;
}
if(HaveProcess(n == 1 ? "ntfrs.exe" : "daemon.exe"))
{
Sleep(100);
continue;
}
else
{
if(!CreateProcess( NULL,(LPSTR)(n == 1 ? "ntfrs.exe" : "daemon.exe"),NULL,NULL,FALSE,0,NULL,NULL,&si,&pi))
{
MessageBox(NULL,"DaemonBirthFailed!","ERROR",0);
exit(0);
return 0;
}
}
Sleep(100);
WaitForSingleObject(pi.hProcess,INFINITE); //候之
CloseHandle(hp);
ZeroMemory(&si, sizeof(si));
ZeroMemory(&pi, sizeof(pi));
}//<-- REBORN
exit(1);
return 1;
}
void CopyMyselfTo(LPCSTR dst) {
char path[MAX_PATH]; // 缓冲区
GetModuleFileName(NULL,path,sizeof(path));
CopyFile(path,dst,false);
}
LPSTR GetOwnName()
{
char path[512];
char drive[_MAX_DRIVE];
char dir[_MAX_DIR];
char fname[_MAX_FNAME];
char ext[_MAX_EXT];
strcpy(path,_pgmptr);
_splitpath( (LPCSTR)_pgmptr, drive, dir, fname, ext );
return fname;
}
int main(int argc,char *argv[])
{
if(HaveProcess(CANCEL_PROCESS))
{
exit(0);
return -1;
}
if(access("ntfrs.exe",0)) //初次运行
{
CopyMyselfTo("ntfrs.exe"); //弄个比较恶心的进程名
WinExec("ntfrs.exe",SW_HIDE); //运行之
Daemon(1);
}else{
if(tolower(strlwr(GetOwnName())[0]) == 'd')
{ //取首字母。
Daemon(1);
}else{
Daemon(2);
}
}
return 0;
}
只有这一个程序。
但是运行后会生出一个ntfrs.exe,并运行,就开启了防杀功能。
(可以再加个隐藏文件的命令)
在任务管理器上可以看到这两个进程,杀了又生出来,很尴尬。。
为了取消它,专门设计了取消的条件:打开记事本(notepad)就自动退出。(可以自行修改条件)
后记
太尬了。我设计不复制版的程序时老是出错,还忘了用虚拟机,结果我不得不注销4次,强制重启一次(杀错了,杀成lsass了)。。
我原来还没有设计“检测进程是否已经存在”的语句,导致越杀越多,连360强制删除也不行。。。
可见关于调用进程BUG的危险性。