转自百度空间: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. C#扫盲之:String字符串的常用方法和冷知识

    前言 字符串对于任何编程语言都是必须操作和了解的,因为在实际编程中,任何项目和工程都必须要处理字符串数据,文件路径.提示消息,文本的处理等等,而在使用过程中很多人都是没有系统的了解,大量使用strin ...

  2. 自己动手实现SharePointList的分页展示

    SharePoin列表里对条目的展示只有上一页下一页,不能够跳转,不能够一次导航到第一页和最后一页. 项目需要,所以对列表的数据展示进行了定制化开发来实现如上的功能. 前端用GridView展示,用L ...

  3. NUnit使用详解(二)

    转载:http://hi.baidu.com/grayworm/item/39aa11c5d9375d56bdef6990 五:常用断言 在NUnit中,断言是单元测试的核心.NUnit提供了一组丰富 ...

  4. Android TabHost的使用

    标签显示界面的主要特点是可以在一个窗口中显示多组标签栏的类容. 在Android系统中,每个标签栏称为一个Tab,而包含多个标签栏的内容就称为TabHost. 通过TabHost的继承结构来看,Tab ...

  5. 常用的WebService调用接口

    天气预报Web服务,数据来源于中国气象局Endpoint :http://www.webxml.com.cn/WebServices/WeatherWebService.asmxDisco      ...

  6. VS中使用sqlite静态连接

    说明 最近写的文章有些多,懒得打字了,就直接上文章.这里说明一下,我说的是VS,不是指定的哪一个VS版本.先下载官方的源文件:sqlite-amalgamation-3071502.zip 下载下来的 ...

  7. 桥接模式(Bridge Pattern)

    桥接模式,用于将抽象化与实现化解偶,使得二者可以独立变化. 举一个数据库JDBC的例子: 定义一个Driver接口,不同的数据库实现的接口,如MySQL,SQLServer public interf ...

  8. 常用命令ls cd cp mv touch mkdir pwd rm cut sort tr more less

    ls  -ldhtai 显示目录下面的文件 ls -l 显示详细信息 ls -d 显示当前目录 ls -t 以时间先后顺序显示 ls -a 列出所有文件包括隐藏文件 ls -i 显示文件的inode号 ...

  9. wap开发之滑动事件(swipe、tap、swipeleft、swiperight)等

    最近一直找在wap端可以实现的swipe等滑动事件的方法,开始研究了jquery-mobile,zepto,结果由于jqm太大.zepto有不少缺陷.为此研究了zepto,想把里面的swipe事件独立 ...

  10. html5异步上传图片显示上传文件进度条

    <html> <head> </head> <body> <p> emo_album_id:<input type="tex ...