全局监控进程创建and禁止结束某进程

32位系统直接传统Hook就Ok了,但是64位系统就不行了,需要改动一下汇编代码

64位系统Hook需求
1.目标进程64位
2.注入程序64位
3.dll64位
以上条件必须都满足方可Hook64程序

--------------------------------------------------------------------------------------------------------
全局监控进程创建思路
Hook组员管理器explorer.exe
因为用户点击软件启动时实际上是由资源管理器负责创建进程的
资源管理器调用的创建进程API:CreateProcessW
所以我们只需要Hook CreateProcessW即可
然后回调函数中添加过滤放行或禁止就好了
效果图
测试环境:Win7 64bit

当我们点击某个应用程序时
 
当我们点击【是】,程序正常打开
但是当我们点击【否】,那么就嘿嘿了
 


--------------------------------------------------------------------------------------------------------
进程保护思路
Hook任务管理就可以了
任务管理器结束进程调用的API:Openprocess, TerminateProcess
不过我们只需要Hook OpenProcess就OK了
因为OpenProcess有我们想要的参数dwProcessId,有了进程Id就在回调中过滤了
还有 TerminateProcess第一个参数是个HANDLE
只要HANDLE错误,他就无法结束进程
而HANDLE是通过OpenProcess得到的

效果图
我准备好的保护目标
 
当我们试图结束它
 
任务管理器就会提示
 

--------------------------------------------------------------------------------------------------------
核心代码就是64位Hook
下面放出来APIHook64Class
APIHook64Class.h
  1. #ifndef APIHOOK64CLASS_H_
  2. #define APIHOOK64CLASS_H_
  3. #include <Windows.h>

  4. class APIHook64
  5. {
  6. private:
  7.         unsigned char code[12];
  8.         unsigned char oldcode[12];
  9.         FARPROC addr;

  10. public:
  11.         APIHook64();
  12.         BOOL Hook(char *dllName,char *apiName,long long callfunc,BOOL bHook=TRUE);
  13. };

  14. #endif
复制代码
APIHook64Class.cpp
  1. #include "APIHook64Class.h"

  2. APIHook64::APIHook64()
  3. {
  4.         /*
  5.                 mov eax,0x12345678
  6.                 push eax
  7.                 ret
  8.         */
  9.         unsigned char c[12] = { 0x48, 0xB8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x50, 0xC3 };
  10.         RtlMoveMemory(APIHook64::code, c, 12);
  11.         memset(APIHook64::oldcode, 0, 12);
  12.         addr = NULL;
  13. }

  14. BOOL APIHook64::Hook(char *dllName, char *apiName, long long callfunc, BOOL bHook)
  15. {
  16.         BOOL bOk = FALSE;
  17.         DWORD dwOldProtect = 0;
  18.         long long api = callfunc;
  19.         HANDLE hPro = GetCurrentProcess();

  20.         if (!APIHook64::oldcode[0])
  21.         {
  22.                 addr = GetProcAddress(LoadLibrary(dllName), apiName);
  23.                 RtlMoveMemory(APIHook64::code+2, &api, 8);
  24.                 if (VirtualProtectEx(hPro, addr, 12, PAGE_EXECUTE_READWRITE, &dwOldProtect))
  25.                 {
  26.                         RtlMoveMemory(APIHook64::oldcode, addr, 12);
  27.                 }
  28.         }
  29.         if (bHook)
  30.         {
  31.                 bOk = WriteProcessMemory(hPro, addr, APIHook64::code, 12, NULL);
  32.         }
  33.         else {
  34.                 bOk = WriteProcessMemory(hPro, addr, APIHook64::oldcode, 12, NULL);
  35.         }
  36.         VirtualProtectEx(hPro, addr, 12, dwOldProtect, &dwOldProtect);
  37.         CloseHandle(hPro);
  38.         return bOk;
  39. }
复制代码

猜你喜欢

转载自blog.csdn.net/yedehei_lt/article/details/80668907
今日推荐