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

2024-08-22 01:44

本文主要是介绍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 NULL;}}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才能卸载,不然会导致任务管理器异常
4、HookOpenProcess,如果忽略需要返回NULL,不是INVALID_HANDLE_VALUE,不然win7会导致任务管理器崩溃
5、若dll路径没问题,注入成功,但是dll未加载,请采用mt编译

这篇关于windows hook之进程防杀(任务管理器)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1094889

相关文章

Linux下进程的CPU配置与线程绑定过程

《Linux下进程的CPU配置与线程绑定过程》本文介绍Linux系统中基于进程和线程的CPU配置方法,通过taskset命令和pthread库调整亲和力,将进程/线程绑定到特定CPU核心以优化资源分配... 目录1 基于进程的CPU配置1.1 对CPU亲和力的配置1.2 绑定进程到指定CPU核上运行2 基于

Javaee多线程之进程和线程之间的区别和联系(最新整理)

《Javaee多线程之进程和线程之间的区别和联系(最新整理)》进程是资源分配单位,线程是调度执行单位,共享资源更高效,创建线程五种方式:继承Thread、Runnable接口、匿名类、lambda,r... 目录进程和线程进程线程进程和线程的区别创建线程的五种写法继承Thread,重写run实现Runnab

SQL Server配置管理器无法打开的四种解决方法

《SQLServer配置管理器无法打开的四种解决方法》本文总结了SQLServer配置管理器无法打开的四种解决方法,文中通过图文示例介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的... 目录方法一:桌面图标进入方法二:运行窗口进入检查版本号对照表php方法三:查找文件路径方法四:检查 S

怎样通过分析GC日志来定位Java进程的内存问题

《怎样通过分析GC日志来定位Java进程的内存问题》:本文主要介绍怎样通过分析GC日志来定位Java进程的内存问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、GC 日志基础配置1. 启用详细 GC 日志2. 不同收集器的日志格式二、关键指标与分析维度1.

Java进程异常故障定位及排查过程

《Java进程异常故障定位及排查过程》:本文主要介绍Java进程异常故障定位及排查过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、故障发现与初步判断1. 监控系统告警2. 日志初步分析二、核心排查工具与步骤1. 进程状态检查2. CPU 飙升问题3. 内存

Golang如何对cron进行二次封装实现指定时间执行定时任务

《Golang如何对cron进行二次封装实现指定时间执行定时任务》:本文主要介绍Golang如何对cron进行二次封装实现指定时间执行定时任务问题,具有很好的参考价值,希望对大家有所帮助,如有错误... 目录背景cron库下载代码示例【1】结构体定义【2】定时任务开启【3】使用示例【4】控制台输出总结背景

在Golang中实现定时任务的几种高效方法

《在Golang中实现定时任务的几种高效方法》本文将详细介绍在Golang中实现定时任务的几种高效方法,包括time包中的Ticker和Timer、第三方库cron的使用,以及基于channel和go... 目录背景介绍目的和范围预期读者文档结构概述术语表核心概念与联系故事引入核心概念解释核心概念之间的关系

springboot如何通过http动态操作xxl-job任务

《springboot如何通过http动态操作xxl-job任务》:本文主要介绍springboot如何通过http动态操作xxl-job任务的问题,具有很好的参考价值,希望对大家有所帮助,如有错... 目录springboot通过http动态操作xxl-job任务一、maven依赖二、配置文件三、xxl-

基于Python开发Windows屏幕控制工具

《基于Python开发Windows屏幕控制工具》在数字化办公时代,屏幕管理已成为提升工作效率和保护眼睛健康的重要环节,本文将分享一个基于Python和PySide6开发的Windows屏幕控制工具,... 目录概述功能亮点界面展示实现步骤详解1. 环境准备2. 亮度控制模块3. 息屏功能实现4. 息屏时间

在Windows上使用qemu安装ubuntu24.04服务器的详细指南

《在Windows上使用qemu安装ubuntu24.04服务器的详细指南》本文介绍了在Windows上使用QEMU安装Ubuntu24.04的全流程:安装QEMU、准备ISO镜像、创建虚拟磁盘、配置... 目录1. 安装QEMU环境2. 准备Ubuntu 24.04镜像3. 启动QEMU安装Ubuntu4