当前位置: 首页 > news >正文

windows hook之进程防杀(任务管理器)

任务管理器防杀指定进程

minihook使用指南

1、原理

注入dll到任务管理,hook OpenProcessAPI实现进程信息获取操作,达到进程防杀

2、dll实现

#include "pch.h"
#include <Windows.h>
#include "../include/minihook/MinHook.h"
#include <TlHelp32.h>
#include <set>#ifdef _WIN64#pragma comment(lib,"../include/minihook/libMinHook.x64.lib")
#else#pragma comment(lib,"../include/minihook/libMinHook.x86.lib")
#endif // _WIN64std::set<DWORD> g_setPid = {1024};
typedef HANDLE(WINAPI* OldOpenProcess)(DWORD, BOOL, DWORD);
OldOpenProcess fpOldOpenProcess = NULL;HANDLE WINAPI MyOpenProcess(DWORD dwDesiredAccess, BOOL bInheritHandle, DWORD dwProcessId)
{if (!g_setPid.empty()) {auto setPid = g_setPid;if (setPid.find(dwProcessId) != setPid.end()) {// set error codeSetLastError(ERROR_ACCESS_DENIED);return INVALID_HANDLE_VALUE;}}return fpOldOpenProcess(dwDesiredAccess, bInheritHandle, dwProcessId);
}void HookOpenProcess() {if (MH_Initialize() == MB_OK){MH_CreateHook(&OpenProcess, &MyOpenProcess, reinterpret_cast<void**>(&fpOldOpenProcess));MH_EnableHook(&OpenProcess);}else {MessageBoxA(NULL, "Hooked opeprocess failed", "Tip", MB_OK);}
}void UnhookOpenProcess() {if (MH_DisableHook(MH_ALL_HOOKS) == MB_OK){MH_Uninitialize();}
}BOOL APIENTRY DllMain(HMODULE hModule,DWORD  ul_reason_for_call,LPVOID lpReserved
)
{switch (ul_reason_for_call){case DLL_PROCESS_ATTACH: {HookOpenProcess();break;}case DLL_THREAD_ATTACH: {break;}case DLL_THREAD_DETACH: {break;}case DLL_PROCESS_DETACH:UnhookOpenProcess();break;}return TRUE;
}

3、任务管理器dll注入/卸载

#include <iostream>
#include <Windows.h>
#include <tlhelp32.h>DWORD nPid = 0;
DWORD GetTaskMgrPid()
{DWORD nPid = 0;std::wstring wstrProcessName(L"TaskMgr.exe");PROCESSENTRY32 pe32;HANDLE hSnapshot = NULL;pe32.dwSize = sizeof(PROCESSENTRY32);hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);if (hSnapshot == INVALID_HANDLE_VALUE) return -1;if (Process32First(hSnapshot, &pe32)) {do {// wcsicmp: ignore case; wcscmp: case sensitiveif (_wcsicmp(pe32.szExeFile, wstrProcessName.c_str()) == 0) {nPid = pe32.th32ProcessID;break;}} while (Process32Next(hSnapshot, &pe32));}if (hSnapshot != INVALID_HANDLE_VALUE)CloseHandle(hSnapshot);return nPid;
}void ejectDll() {wchar_t szDll[] = L"HookOpenProcess.dll";BOOL bMore = FALSE, bFound = FALSE;HANDLE hSnapshot, hProcess, hThread;HMODULE hModule = NULL;MODULEENTRY32 me = { sizeof(me) };LPTHREAD_START_ROUTINE pThreadProc;hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, nPid);if (INVALID_HANDLE_VALUE == hSnapshot) {std::cout << "Create snapshot failed: " << GetLastError() << ", pid: " << nPid << "\n";return;}bMore = Module32First(hSnapshot, &me);for (; bMore; bMore = Module32Next(hSnapshot, &me)){if (!_wcsicmp((LPCTSTR)me.szModule, szDll) ||!_wcsicmp((LPCTSTR)me.szExePath, szDll)){bFound = TRUE;break;}}if (!bFound){std::cout << "Not found\n";CloseHandle(hSnapshot);return ;}if (!(hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, nPid))){//_tprintf(L"OpenProcess(%d) failed!!! [%d]\n", dwPID, GetLastError());return ;}hModule = GetModuleHandle(L"kernel32.dll");// free library with manualpThreadProc = (LPTHREAD_START_ROUTINE)GetProcAddress(hModule, "FreeLibrary");hThread = CreateRemoteThread(hProcess, NULL, 0,pThreadProc, me.modBaseAddr,0, NULL);WaitForSingleObject(hThread, INFINITE);CloseHandle(hThread);CloseHandle(hProcess);CloseHandle(hSnapshot);std::cout << "Eject completed.\n";
}void injectDll()
{char szDll[] = "D:/Demo/include/HookOpenProcess.dll";HANDLE hTaskMgr = OpenProcess(PROCESS_ALL_ACCESS, FALSE, nPid);if (NULL == hTaskMgr) {std::cout << "Open process failed: " << GetLastError() << "\n";return;}SIZE_T pathSize = strlen(szDll) + 1;LPVOID pDllAddr = VirtualAllocEx(hTaskMgr, NULL, pathSize, MEM_COMMIT, PAGE_READWRITE);BOOL bSucc = WriteProcessMemory(hTaskMgr, pDllAddr, szDll, pathSize, NULL);LPTHREAD_START_ROUTINE fun = (LPTHREAD_START_ROUTINE)LoadLibraryA;auto hThread = CreateRemoteThread(hTaskMgr, NULL, 0, fun, pDllAddr, 0, NULL);WaitForSingleObject(hThread, INFINITE);// do cleanCloseHandle(hThread);VirtualFreeEx(hTaskMgr, pDllAddr, 0, MEM_RELEASE);CloseHandle(hTaskMgr);std::cout << "Inject completed.\n";
}int main()
{nPid = GetTaskMgrPid();if (nPid <= 0) {std::cout << "TaskMgr.exe not running, try it later\n";return 0;}
#if 1injectDll();
#elseejectDll();
#endifgetchar();return 0;
}

注意事项

1、dll编译和待注入程序位数保持一致(待注入程序是64位,dll必须是64位)
2、注入程序必须和待注入程序位数保持一致(待注入程序是64位,注入必须是64位)
3、pid信息可通过共享内存(FileMapping)传递,如果dll内部有用到event并等待,一定要先退出等待,dll才能卸载,不然会导致任务管理器异常

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • Python爬虫技术与K-means算法的计算机类招聘信息获取与数据分析
  • 小米便签——ui包详细解读
  • 基于Springboot网上蛋糕售卖店管理系统的设计与实现--论文pf
  • 配置oss cdn加速静态资源访问 阿里云
  • 【多线程开发 6】spring中的注解/API的线程问题
  • 基于Python的火车票售票系统/基于django的火车购票系统
  • 产品经理基础知识
  • C++ IO流
  • java中常用的设计模式
  • 苍穹外卖day10
  • uniapp快速回顾,新学websocket连接和BLE连接
  • TinyEngine是什么?
  • 大疆秋招笔试
  • 【数学建模】MATLAB快速入门
  • 深度学习的数学之魂:传统机器学习的超越者
  • [nginx文档翻译系列] 控制nginx
  • 【跃迁之路】【519天】程序员高效学习方法论探索系列(实验阶段276-2018.07.09)...
  • Java 23种设计模式 之单例模式 7种实现方式
  • leetcode386. Lexicographical Numbers
  • Webpack 4x 之路 ( 四 )
  • 阿里云Kubernetes容器服务上体验Knative
  • 从0到1:PostCSS 插件开发最佳实践
  • 简单实现一个textarea自适应高度
  • 模仿 Go Sort 排序接口实现的自定义排序
  • 如何胜任知名企业的商业数据分析师?
  • ​iOS安全加固方法及实现
  • ​queue --- 一个同步的队列类​
  • ​secrets --- 生成管理密码的安全随机数​
  • ​软考-高级-信息系统项目管理师教程 第四版【第14章-项目沟通管理-思维导图】​
  • #C++ 智能指针 std::unique_ptr 、std::shared_ptr 和 std::weak_ptr
  • #Linux(权限管理)
  • #systemverilog# 之 event region 和 timeslot 仿真调度(十)高层次视角看仿真调度事件的发生
  • $NOIp2018$劝退记
  • (6)【Python/机器学习/深度学习】Machine-Learning模型与算法应用—使用Adaboost建模及工作环境下的数据分析整理
  • (9)STL算法之逆转旋转
  • (Matlab)使用竞争神经网络实现数据聚类
  • (八)Flask之app.route装饰器函数的参数
  • (附源码)springboot建达集团公司平台 毕业设计 141538
  • (附源码)springboot课程在线考试系统 毕业设计 655127
  • (附源码)springboot社区居家养老互助服务管理平台 毕业设计 062027
  • (附源码)springboot掌上博客系统 毕业设计063131
  • (回溯) LeetCode 46. 全排列
  • (十七)Flask之大型项目目录结构示例【二扣蓝图】
  • (一)基于IDEA的JAVA基础1
  • *1 计算机基础和操作系统基础及几大协议
  • .NET Core/Framework 创建委托以大幅度提高反射调用的性能
  • .Net 代码性能 - (1)
  • .net 调用php,php 调用.net com组件 --
  • .NET_WebForm_layui控件使用及与webform联合使用
  • .NET委托:一个关于C#的睡前故事
  • .NET周刊【7月第4期 2024-07-28】
  • .php结尾的域名,【php】php正则截取url中域名后的内容
  • /etc/apt/sources.list 和 /etc/apt/sources.list.d
  • @ConfigurationProperties注解对数据的自动封装
  • [ 云计算 | Azure 实践 ] 在 Azure 门户中创建 VM 虚拟机并进行验证