发新话题
打印

[转载]很巧妙的进程防杀方法

[转载]很巧妙的进程防杀方法

文章作者: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;
}
曾几何时,有人对我说:装B遭雷劈。我说:去你妈的。于是,这个人又对我说:如果再说脏话,上帝会惩罚你的。我说:我操上帝。结论:彪悍的人生不需要上帝。

TOP

rea~~~~~~~~lly?

我觉得好像不行啊,你这还不是程序本身检测是否在运行,只不过是检测自己创建的互斥体,那如果程序本身都被杀了,还能防杀(人都死了,还能自我防御?)?
回去测试一下。

TOP

引用:
下面是引用progray于06-10-2005 11:34发表的:
rea~~~~~~~~lly?

我觉得好像不行啊,你这还不是程序本身检测是否在运行,只不过是检测自己创建的互斥体,那如果程序本身都被杀了,还能防杀(人都死了,还能自我防御?)?
回去测试一下。
感觉代码还是能行的,我也没有测试.不知道实际结果怎样

程序是运行两个实例,一个程序运行后,分别检测互斥一和检测互斥二,发现没有互斥二,就运行一下自己,第二个运行的自己就占用了互斥二.


两个相同的程序循环检测互斥一和互斥二.一旦发现内存中少了某个互斥,就重复运行自身保证自己在程序中.

不过这有两个基本的问题.

第一,我们知道互斥是内核对象中最耗系统资源的内核对象,因为它是跨进程的.

像这样频繁的用while检测.太耗了.

第二.保护应该有侧重点,比如一个程序是主体,另外一个程序是保护程序.(这个时候哪个程序占用哪个互斥就成了一个大问题,而且互斥消失,该运行谁也成了问题).

想这样两个程序是一样的,现在功能还很少,没有其他共享冲突问题,要真的写出一个后门来,那么共享内存资源方面,就要耗费大量的代码和严密的逻辑性了.
流氓会武术,谁都挡不住. http://hi.baidu.com/zvrop

TOP

先从思路上说,一般情况下是针对一些后门,木马等等。
从另一个角度上说,例如记事本,我在用他写文章,当进程被结束时,我所输入的信息就丢失了,即便在运行也没多大意义。
而文章所说的方法从很早就有了。
一般现在防杀技术都是注册为服务,或是三线程保护。
不过如果是做后门什么的,还是建议设法隐藏进程。

TOP

引用:
下面是引用ZV于2005-06-29 10:10发表的:


感觉代码还是能行的,我也没有测试.不知道实际结果怎样

程序是运行两个实例,一个程序运行后,分别检测互斥一和检测互斥二,发现没有互斥二,就运行一下自己,第二个运行的自己就占用了互斥二.
.......
我没有测试过
但我认为是不行的
假如主线程都挂了,子线程还怎么运行?
还是createRemoteThread好使
VX Z0ne

TOP

测试通过,点用内存约为188,CPU几乎不占用,我是在任务管理器中看的.
用了while(1),两者用互斥进行判断监视.
但是是在线程中执行的,也不怎么占资源.
关闭的方法就是用ctrl一下选两个关闭,

TOP

前两天碰到一个病毒,能把自身提升为SYSTEM进程权限,大部分杀毒软件和手动中止都无效,强悍异常,不知道其机理是如何实现的,百思不得其解,望有人赐教。

TOP

人家可以两个进程都杀了.写个bat,用个pskill来杀进程.

TOP

对于初级的. 这种方法还是不错了.

TOP

好像有勾子函数是专门来处理这个的,也不算太难

TOP

引用:
下面是引用zeroto于2005-12-02 12:03发表的:
前两天碰到一个病毒,能把自身提升为SYSTEM进程权限,大部分杀毒软件和手动中止都无效,强悍异常,不知道其机理是如何实现的,百思不得其解,望有人赐教。
service或者驱动型

TOP

发新话题