转自百度空间:http://hi.baidu.com/175943462/item/657905e13b73b70b8d3ea8bb

一提到进程保护特别是在Windows下,没有最安全,只有更安全。下面的代码是在用户层,截获任务管理器的本进程名(Test.exe)被选中时的消息,以防止用任务管理器结束掉进程(当然你用其他进程工具当然可以结束掉咯!)。主要是要学习这里面的方法、熟悉几个结构体、几个API而矣:

1、LVITEM

Specifies or receives the attributes of a list-view item. This structure has been updated to support a new mask value (LVIF_INDENT) that enables item indenting. This structure supersedes the LV_ITEM structure.

(我这水平的英文也能凑合着看吧,相信你更没问题!)

view plaincopy to clipboardprint?
typedef struct _LVITEM {    
    UINT mask;    
    int iItem;    
    int iSubItem;    
    UINT state;    
    UINT stateMask;    
    LPTSTR pszText;    
    int cchTextMax;    
    int iImage;    
    LPARAM lParam;   
#if (_WIN32_IE >= 0x0300)   
    int iIndent;   
#endif   
#if (_WIN32_IE >= 0x560)   
    int iGroupId;   
    UINT cColumns; // tile view columns   
    PUINT puColumns;   
#endif   
} LVITEM, *LPLVITEM;   
typedef struct _LVITEM { 
    UINT mask; 
    int iItem; 
    int iSubItem; 
    UINT state; 
    UINT stateMask; 
    LPTSTR pszText; 
    int cchTextMax; 
    int iImage; 
    LPARAM lParam;
#if (_WIN32_IE >= 0x0300)
    int iIndent;
#endif
#if (_WIN32_IE >= 0x560)
    int iGroupId;
    UINT cColumns; // tile view columns
    PUINT puColumns;
#endif
} LVITEM, *LPLVITEM;

2、FindWindow与FindWindowEx

view plaincopy to clipboardprint?
// 查找任务管理器ListView窗口句柄   
HWND    hwnd;   
hwnd=FindWindow("#32770",_T("Windows 任务管理器"));   
hwnd=FindWindowEx(hwnd,0,"#32770",0);   
hwnd=FindWindowEx(hwnd,0,"SysListView32",0);

// Windows任务管理器尚未启动则返回   
if (!hwnd)     
    return; 
// 查找任务管理器ListView窗口句柄
HWND hwnd;
hwnd=FindWindow("#32770",_T("Windows 任务管理器"));
hwnd=FindWindowEx(hwnd,0,"#32770",0);
hwnd=FindWindowEx(hwnd,0,"SysListView32",0);

// Windows任务管理器尚未启动则返回
if (!hwnd) 
   return;

3、上面的结构体与API熟悉后,再看看这个函数吧!

view plaincopy to clipboardprint?
/************************************************************************/     
/* 函数说明:禁止在任务管理器中结束本进程                                         
/* 参    数:无                                     
/* 返 回 值:void      
/* By:Koma   2009.07.27 23:50                                  
/************************************************************************/ 
void FuckWindowsManager()   
{   
    HWND    hwnd;   
    int     iItem=0;   
    LVITEM lvitem, *plvitem;   
    char    ItemBuf[512],*pItem;   
    DWORD   PID;   
    HANDLE hProcess;   
       
    // 查找任务管理器ListView窗口句柄   
    hwnd=FindWindow("#32770",_T("Windows 任务管理器"));   
    hwnd=FindWindowEx(hwnd,0,"#32770",0);   
    hwnd=FindWindowEx(hwnd,0,"SysListView32",0);

// Windows任务管理器尚未启动则返回   
    if (!hwnd)     
        return;   
    else 
    {   
        // 没有指定目标进程则返回   
        iItem=SendMessage(hwnd,LVM_GETNEXTITEM,-1,LVNI_SELECTED);   
        if (iItem==-1)     
            return;   
        else 
        {   
            GetWindowThreadProcessId(hwnd, &PID);

// 获取进程句柄操作失败则返回   
            hProcess=OpenProcess(PROCESS_ALL_ACCESS,false,PID);   
            if (!hProcess)   
                return;            
            else 
            {   
                plvitem=(LVITEM*)VirtualAllocEx(hProcess, NULL, sizeof(LVITEM), MEM_COMMIT, PAGE_READWRITE);   
                pItem=(char*)VirtualAllocEx(hProcess, NULL, 512, MEM_COMMIT, PAGE_READWRITE);

// 无法分配内存则返回   
                if ((!plvitem)||(!pItem))   
                    return;                
                else 
                {   
                    lvitem.cchTextMax=512;   
                    //lvitem.iSubItem=1;//PID   
                    lvitem.iSubItem=0; //ProcessName   
                    lvitem.pszText=pItem;   
                    WriteProcessMemory(hProcess, plvitem, &lvitem, sizeof(LVITEM), NULL);   
                    SendMessage(hwnd, LVM_GETITEMTEXT, (WPARAM)iItem, (LPARAM)plvitem);   
                    ReadProcessMemory(hProcess, pItem, ItemBuf, 512, NULL);   
                       
                    // 比较字符串,将Test.exe改成你的进程映像名即可   
                    CString str = (CString)ItemBuf;   
                    if(str.CompareNoCase(_T("Test.exe")) == 0)   
                    {   
                        HWND hWnd=FindWindow(NULL,_T("Windows 任务管理器"));   
                        SendMessage(hWnd,WM_DESTROY,0,0);   
                        Sleep(10);   
                        MessageBox(NULL,_T("禁止关闭系统关键进程!"),_T("提示"),MB_ICONERROR | MB_OK);   
                    }   
                }   
            }   
        }   
    }   
       
    //释放内存   
    CloseHandle(hwnd);   
    CloseHandle(hProcess);   
    VirtualFreeEx(hProcess, plvitem, 0, MEM_RELEASE);   
    VirtualFreeEx(hProcess, pItem, 0, MEM_RELEASE);   

/************************************************************************/ 
/* 函数说明:禁止在任务管理器中结束本进程                                       
/* 参    数:无                                   
/* 返 回 值:void    
/* By:Koma   2009.07.27 23:50                                
/************************************************************************/
void FuckWindowsManager()
{
HWND hwnd;
int   iItem=0;
LVITEM lvitem, *plvitem;
char ItemBuf[512],*pItem;
DWORD PID;
HANDLE hProcess;

// 查找任务管理器ListView窗口句柄
hwnd=FindWindow("#32770",_T("Windows 任务管理器"));
hwnd=FindWindowEx(hwnd,0,"#32770",0);
hwnd=FindWindowEx(hwnd,0,"SysListView32",0);

// Windows任务管理器尚未启动则返回
if (!hwnd) 
   return;
else
{
   // 没有指定目标进程则返回
   iItem=SendMessage(hwnd,LVM_GETNEXTITEM,-1,LVNI_SELECTED);
   if (iItem==-1) 
    return;
   else
   {
    GetWindowThreadProcessId(hwnd, &PID);

// 获取进程句柄操作失败则返回
    hProcess=OpenProcess(PROCESS_ALL_ACCESS,false,PID);
    if (!hProcess)
     return;   
    else
    {
     plvitem=(LVITEM*)VirtualAllocEx(hProcess, NULL, sizeof(LVITEM), MEM_COMMIT, PAGE_READWRITE);
     pItem=(char*)VirtualAllocEx(hProcess, NULL, 512, MEM_COMMIT, PAGE_READWRITE);

// 无法分配内存则返回
     if ((!plvitem)||(!pItem))
      return;    
     else
     {
      lvitem.cchTextMax=512;
      //lvitem.iSubItem=1;//PID
      lvitem.iSubItem=0; //ProcessName
      lvitem.pszText=pItem;
      WriteProcessMemory(hProcess, plvitem, &lvitem, sizeof(LVITEM), NULL);
      SendMessage(hwnd, LVM_GETITEMTEXT, (WPARAM)iItem, (LPARAM)plvitem);
      ReadProcessMemory(hProcess, pItem, ItemBuf, 512, NULL);
     
      // 比较字符串,将Test.exe改成你的进程映像名即可
      CString str = (CString)ItemBuf;
      if(str.CompareNoCase(_T("Test.exe")) == 0)
      {
       HWND hWnd=FindWindow(NULL,_T("Windows 任务管理器"));
       SendMessage(hWnd,WM_DESTROY,0,0);
       Sleep(10);
       MessageBox(NULL,_T("禁止关闭系统关键进程!"),_T("提示"),MB_ICONERROR | MB_OK);
      }
     }
    }
   }
}

//释放内存
CloseHandle(hwnd);
CloseHandle(hProcess);
VirtualFreeEx(hProcess, plvitem, 0, MEM_RELEASE);
VirtualFreeEx(hProcess, pItem, 0, MEM_RELEASE);
}

4、VC源代码工程

下载地址1:http://www.rayfile.com/files/31bedea3-7b13-11de-9d03-0014221b798a/

下载地址2:http://download.csdn.net/source/1524075

http://blog.csdn.net/dingxz105090/article/details/27367937

VC禁止在任务管理器中结束本进程的更多相关文章

  1. 【Hook技术】实现从"任务管理器"中保护进程不被关闭 + 附带源码 + 进程保护知识扩展

    [Hook技术]实现从"任务管理器"中保护进程不被关闭 + 附带源码 + 进程保护知识扩展 公司有个监控程序涉及到进程的保护问题,需要避免用户通过任务管理器结束掉监控进程,这里使用 ...

  2. VC中遍历目标进程中的模块

    VC中遍历目标进程中的模块 MFC代码win32 也可以用 在下面代码进行修改转换就可以了CString strModule; 可以换成 char* 但是MODULEENTRY32结构中的szModu ...

  3. (原+转)ubuntu14中结束多个caffe进程中的某个

    转载请注明出处: http://www.cnblogs.com/darkknightzh/p/5948237.html 参考网址: http://www.2cto.com/os/201407/3215 ...

  4. Windows Server 2008 R2服务器内存使用率过高,但与任务管理器中进程占用内存和不一致

    系统环境: Windows Server 2008 R2 + Sql Server 2008 R2   问题描述: Windows Server 2008 R2系统内存占用率过大,而在任务管理器中各进 ...

  5. selenium高级应用 - 结束Windows中浏览器的进程

    结束Windows中浏览器的进程 #-*- coding:utf-8 #结束Windows中浏览器的进程 from selenium import webdriver import unittest ...

  6. LR中线程和进程的区别

    LoadRunner中的进程与线程    1.进程与线程的区别: 进程和线程的区别是什么?进程和线程都是由操作系统所体会的程序运行的基本单元,系统利用该基本单元实现系统对应用的并发性.进程和线程的区别 ...

  7. [转] android 中 任务、进程和线程的区别

    PS: handler的目的是在组件进程中开辟一个线程作为消息的poller,收到消息后可以更新Activity中的控件(特殊的view) 任务.进程和线程     关于Android中的组件和应用, ...

  8. 使用ExitProcess()结束本进程、TerminateProcess 结束进程

    进程只是提供了一段地址空间和内核对象,其运行时通过在其地址空间内的主线程来体现的.当主线程的进入点函数返回时,进程也就随之结束.这种进程的终止方式是进程的正常退出,进程中的所有线程资源都能够得到正确的 ...

  9. git for windows 无法结束node进程(windows下杀进程)

    问题 windows 系统下,如果用CMD命令行启动node服务,Ctrl + C 即可结束命令 git bash 用起来比命令行方便,但是Ctrl + C 并不会结束node服务,再次启动会报如下错 ...

随机推荐

  1. PHP 获取当前日期的上个月的日期

    获取当前日期的上个月的日期 <?php /** *参考有: *http://www.oschina.net/code/snippet_96541_4015 *http://stackoverfl ...

  2. Hibernate缓存杂谈

    1.什么是缓存? 缓存是介于物理数据源与应用程序之间,是对数据库中的数据复制一份临时放在内存中的容器,其作用是为了减少应用程序对物理数据源访问的次数,从而提高了应用程序的运行性能.Hibernate在 ...

  3. JQuery Jplayer play无效的问题

    最近折腾个H5. 用到Jplayer, 用着不错,至少兼容性强一些. 但是安卓这辆公共汽车型号实在太多.不小心上了一辆奇葩的就容易震到生活不能自理. 我在一台手机上的五六个浏览器上测试,都可以. 把该 ...

  4. iOS afnetworking最新版报错 没有AFHTTPRequestOperationManager类了

    今天开了一个小项目   用的是pod   然后  安装好 Afnetworking之后   发现 AFHTTPRequestOperationManager  这个类没有了  ,百度之后  发现 原来 ...

  5. UIImageView的图片拉伸

    iOS 8:UIView Stretching设置 使用小图片当变长输入框或类似QQ聊天文字背景效果时,需要拉伸图片.UIImage提供了三个可完成此任务的方法: resizableImageWith ...

  6. Ambiguous handler methods mapped for HTTP path

    一.问题:映射重复导致的错误 java代码如下: @RequestMapping(value = "/info/{remove}/{id}", method = RequestMe ...

  7. 记一次ftp服务器错误 centOS 6.4 vsftpd 500 illegal port command

    这个错误是因为是主动模式的,应该改为被动模式 以下是操作过程: iptables中加 -A INPUT -p tcp -m state --state NEW -m tcp --dport 10221 ...

  8. windows下ipython的tab补全,只需安装pyreadline即可.

    运行ipython提示缺失模块 在windows下安装readline失败. 根据提示访问 https://urllib3.readthedocs.org/en/latest/security.htm ...

  9. STL:remove和erase区别

    C++ STL中的remove和erase函数曾经让我迷惑,同样都是删除,两者有什么区别呢? vector中的remove的作用是将等于value的元素放到vector的尾部,但并不减少vector的 ...

  10. leetcode problem 32 -- Longest Valid Parentheses

    Longest Valid Parentheses Given a string containing just the characters '(' and ')', find the length ...