[转载]很巧妙的进程防杀方法
文章作者:I_LIKE_CPP刚刚学内核对象,想写个可以防杀的进程,但其他方法太高级,
本菜鸟不感高攀,想了几天,想到一个很本的办法,不正确的
方还请高手指点一下.
程序运行两个事例,每个实例互相监视另外的实例是否存在,
如果不存在,就运行一个.
代码:
// test_process.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include "tchar.h"
#include "iostream.h"
#include "windows.h"
LPCTSTR lpszMutex1 = _T("mutex1");
LPCTSTR lpszMutex2 = _T("mutex2");
DWORD WINAPI Thread1(LPARAM lParam);
DWORD WINAPI Thread2(LPARAM lParam);
int main(int argc, char* argv[])
{
HANDLE hMutex1 = CreateMutex(NULL, FALSE, lpszMutex1);
if (hMutex1 != NULL)
if (GetLastError() == ERROR_ALREADY_EXISTS)
{
CloseHandle(hMutex1);
cout << lpszMutex1 << " already exist." << endl;
HANDLE hMutex2 = CreateMutex(NULL, FALSE, lpszMutex2);
if (hMutex2 != NULL)
if (GetLastError() == ERROR_ALREADY_EXISTS)
{
cout << lpszMutex2 << " already exist." << endl;
return 1;
}
}
DWORD dwThreadId;
HANDLE hThread = CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)Thread1,NULL,0,&dwThreadId);
CloseHandle(hThread);
while (1)
Sleep(1);
return 0;
}
DWORD WINAPI Thread1(LPARAM lParam)
{
HANDLE hMutex;
while (1)
{
hMutex = OpenMutex(MUTEX_ALL_ACCESS, TRUE, lpszMutex1);
if (! hMutex)
{
STARTUPINFO si = { sizeof STARTUPINFO };
PROCESS_INFORMATION pi;
TCHAR szBuf[MAX_PATH];
GetModuleFileName(GetModuleHandle(NULL), szBuf, MAX_PATH);
CreateProcess(szBuf, NULL, NULL, NULL, TRUE, CREATE_NEW_CONSOLE, NULL, NULL, &si, &pi);
CloseHandle(pi.hThread);
CloseHandle(pi.hProcess);
}
CloseHandle(hMutex);
hMutex = OpenMutex(MUTEX_ALL_ACCESS, TRUE, lpszMutex2);
if (! hMutex)
{
cout << "mutex 2 created." << endl;
STARTUPINFO si = { sizeof STARTUPINFO };
PROCESS_INFORMATION pi;
TCHAR szBuf[MAX_PATH];
GetModuleFileName(GetModuleHandle(NULL), szBuf, MAX_PATH);
CreateProcess(szBuf, NULL, NULL, NULL, TRUE, CREATE_NEW_CONSOLE, NULL, NULL, &si, &pi);
CloseHandle(pi.hThread);
CloseHandle(pi.hProcess);
}
CloseHandle(hMutex);
cout << "Thread ..." << endl;
Sleep(1);
}
return 1;
} rea~~~~~~~~lly?
我觉得好像不行啊,你这还不是程序本身检测是否在运行,只不过是检测自己创建的互斥体,那如果程序本身都被杀了,还能防杀(人都死了,还能自我防御?)?
回去测试一下。 [quote][b]下面是引用progray于06-10-2005 11:34发表的:[/b]
rea~~~~~~~~lly?
我觉得好像不行啊,你这还不是程序本身检测是否在运行,只不过是检测自己创建的互斥体,那如果程序本身都被杀了,还能防杀(人都死了,还能自我防御?)?
回去测试一下。[/quote]
感觉代码还是能行的,我也没有测试.不知道实际结果怎样
程序是运行两个实例,一个程序运行后,分别检测互斥一和检测互斥二,发现没有互斥二,就运行一下自己,第二个运行的自己就占用了互斥二.
两个相同的程序循环检测互斥一和互斥二.一旦发现内存中少了某个互斥,就重复运行自身保证自己在程序中.
不过这有两个基本的问题.
第一,我们知道互斥是内核对象中最耗系统资源的内核对象,因为它是跨进程的.
像这样频繁的用while检测.太耗了.
第二.保护应该有侧重点,比如一个程序是主体,另外一个程序是保护程序.(这个时候哪个程序占用哪个互斥就成了一个大问题,而且互斥消失,该运行谁也成了问题).
想这样两个程序是一样的,现在功能还很少,没有其他共享冲突问题,要真的写出一个后门来,那么共享内存资源方面,就要耗费大量的代码和严密的逻辑性了. 先从思路上说,一般情况下是针对一些后门,木马等等。
从另一个角度上说,例如记事本,我在用他写文章,当进程被结束时,我所输入的信息就丢失了,即便在运行也没多大意义。
而文章所说的方法从很早就有了。
一般现在防杀技术都是注册为服务,或是三线程保护。
不过如果是做后门什么的,还是建议设法隐藏进程。 [quote][b]下面是引用ZV于2005-06-29 10:10发表的:[/b]
感觉代码还是能行的,我也没有测试.不知道实际结果怎样
程序是运行两个实例,一个程序运行后,分别检测互斥一和检测互斥二,发现没有互斥二,就运行一下自己,第二个运行的自己就占用了互斥二.
.......[/quote]
我没有测试过
但我认为是不行的
假如主线程都挂了,子线程还怎么运行?
还是createRemoteThread好使 测试通过,点用内存约为188,CPU几乎不占用,我是在任务管理器中看的.
用了while(1),两者用互斥进行判断监视.
但是是在线程中执行的,也不怎么占资源.
关闭的方法就是用ctrl一下选两个关闭, 前两天碰到一个病毒,能把自身提升为SYSTEM进程权限,大部分杀毒软件和手动中止都无效,强悍异常,不知道其机理是如何实现的,百思不得其解,望有人赐教。 人家可以两个进程都杀了.写个bat,用个pskill来杀进程. 对于初级的. 这种方法还是不错了. 好像有勾子函数是专门来处理这个的,也不算太难 [quote][b]下面是引用zeroto于2005-12-02 12:03发表的:[/b]
前两天碰到一个病毒,能把自身提升为SYSTEM进程权限,大部分杀毒软件和手动中止都无效,强悍异常,不知道其机理是如何实现的,百思不得其解,望有人赐教。[/quote]
service或者驱动型
页:
[1]