需要用到minhook
先编译DLL

#include <Windows.h>
#include <string>
#include <TlHelp32.h>
#include <Shlwapi.h>#include "MinHook.h"
// 自动选择正确的MinHook库
#pragma comment(lib, "Shlwapi.lib")
#if defined(_M_X64)
#pragma comment(lib, "libMinHook.x64.lib")
#else
#pragma comment(lib, "libMinHook.x86.lib")
#endif// 定义缺失的NTAPI类型
typedef struct _UNICODE_STRING {USHORT Length;USHORT MaximumLength;PWSTR  Buffer;
} UNICODE_STRING, *PUNICODE_STRING;typedef struct _OBJECT_ATTRIBUTES {ULONG Length;HANDLE RootDirectory;PUNICODE_STRING ObjectName;ULONG Attributes;PVOID SecurityDescriptor;PVOID SecurityQualityOfService;
} OBJECT_ATTRIBUTES, *POBJECT_ATTRIBUTES;typedef struct _IO_STATUS_BLOCK {union {NTSTATUS Status;PVOID Pointer;};ULONG_PTR Information;
} IO_STATUS_BLOCK, *PIO_STATUS_BLOCK;// 定义NTSTATUS类型
typedef LONG NTSTATUS;// NTAPI常量
#define STATUS_SUCCESS ((NTSTATUS)0x00000000L)
#define STATUS_ACCESS_DENIED ((NTSTATUS)0xC0000022L)
#define FILE_CREATE 0x00000002
#define FILE_OVERWRITE_IF 0x00000005
#define FILE_OPEN_IF 0x00000003// 原始函数指针
typedef HANDLE(WINAPI* CreateFileW_t)(LPCWSTR, DWORD, DWORD, LPSECURITY_ATTRIBUTES, DWORD, DWORD, HANDLE);typedef NTSTATUS(WINAPI* NtCreateFile_t)(PHANDLE, ACCESS_MASK, POBJECT_ATTRIBUTES, PIO_STATUS_BLOCK, PLARGE_INTEGER,ULONG, ULONG, ULONG, ULONG, PVOID, ULONG);// 全局变量
CreateFileW_t OriginalCreateFileW = nullptr;
NtCreateFile_t OriginalNtCreateFile = nullptr;
volatile LONG g_hookInitialized = 0;// 调试输出宏
#ifdef _DEBUG
#define DEBUG_OUTPUT(msg) OutputDebugStringW(msg)
#else
#define DEBUG_OUTPUT(msg)
#endif// 精确判断资源管理器进程
bool IsExplorerProcess()
{static bool isExplorer = false;static bool checked = false;if (checked)return isExplorer;WCHAR exePath[MAX_PATH] = { 0 };if (GetModuleFileNameW(nullptr, exePath, MAX_PATH) > 0){// 提取文件名WCHAR* fileName = PathFindFileNameW(exePath);// 不区分大小写比较if (_wcsicmp(fileName, L"explorer.exe") == 0){DEBUG_OUTPUT(L"Detected explorer.exe process");isExplorer = true;}}checked = true;return isExplorer;
}// 判断是否创建新文件的操作
bool IsFileCreation(DWORD creationDisposition)
{return (creationDisposition == CREATE_ALWAYS ||creationDisposition == CREATE_NEW ||creationDisposition == OPEN_ALWAYS);
}// CreateFileW 钩子
HANDLE WINAPI HookedCreateFileW(LPCWSTR lpFileName,DWORD dwDesiredAccess,DWORD dwShareMode,LPSECURITY_ATTRIBUTES lpSecurityAttributes,DWORD dwCreationDisposition,DWORD dwFlagsAndAttributes,HANDLE hTemplateFile)
{if (IsExplorerProcess() && IsFileCreation(dwCreationDisposition)){DEBUG_OUTPUT(L"Blocking CreateFileW: ");DEBUG_OUTPUT(lpFileName);SetLastError(ERROR_ACCESS_DENIED);return INVALID_HANDLE_VALUE;}return OriginalCreateFileW(lpFileName,dwDesiredAccess,dwShareMode,lpSecurityAttributes,dwCreationDisposition,dwFlagsAndAttributes,hTemplateFile);
}// NtCreateFile 钩子
NTSTATUS WINAPI HookedNtCreateFile(PHANDLE FileHandle,ACCESS_MASK DesiredAccess,POBJECT_ATTRIBUTES ObjectAttributes,PIO_STATUS_BLOCK IoStatusBlock,PLARGE_INTEGER AllocationSize,ULONG FileAttributes,ULONG ShareAccess,ULONG CreateDisposition,ULONG CreateOptions,PVOID EaBuffer,ULONG EaLength)
{if (IsExplorerProcess() &&(CreateDisposition == FILE_CREATE ||CreateDisposition == FILE_OVERWRITE_IF ||CreateDisposition == FILE_OPEN_IF)){// 获取文件名WCHAR fileName[MAX_PATH] = { 0 };if (ObjectAttributes && ObjectAttributes->ObjectName && ObjectAttributes->ObjectName->Buffer){// 安全复制文件名size_t maxLen = min(ObjectAttributes->ObjectName->Length / sizeof(WCHAR), MAX_PATH - 1);wcsncpy_s(fileName, MAX_PATH, ObjectAttributes->ObjectName->Buffer, maxLen);}DEBUG_OUTPUT(L"Blocking NtCreateFile: ");DEBUG_OUTPUT(fileName);return STATUS_ACCESS_DENIED;}return OriginalNtCreateFile(FileHandle,DesiredAccess,ObjectAttributes,IoStatusBlock,AllocationSize,FileAttributes,ShareAccess,CreateDisposition,CreateOptions,EaBuffer,EaLength);
}// 初始化钩子
void InitializeHook()
{if (InterlockedCompareExchange(&g_hookInitialized, 1, 0) != 0)return;if (MH_Initialize() != MH_OK){DEBUG_OUTPUT(L"MH_Initialize failed");return;}// 挂钩 CreateFileWauto pCreateFileW = reinterpret_cast<LPVOID>(GetProcAddress(GetModuleHandleW(L"kernel32.dll"), "CreateFileW"));if (pCreateFileW &&MH_CreateHook(pCreateFileW, &HookedCreateFileW,reinterpret_cast<LPVOID*>(&OriginalCreateFileW)) == MH_OK){if (MH_EnableHook(pCreateFileW) == MH_OK){DEBUG_OUTPUT(L"CreateFileW hook installed");}else{DEBUG_OUTPUT(L"MH_EnableHook for CreateFileW failed");}}else{DEBUG_OUTPUT(L"CreateFileW hook creation failed");}// 挂钩更底层的 NtCreateFileauto pNtCreateFile = reinterpret_cast<LPVOID>(GetProcAddress(GetModuleHandleW(L"ntdll.dll"), "NtCreateFile"));if (pNtCreateFile &&MH_CreateHook(pNtCreateFile, &HookedNtCreateFile,reinterpret_cast<LPVOID*>(&OriginalNtCreateFile)) == MH_OK){if (MH_EnableHook(pNtCreateFile) == MH_OK){DEBUG_OUTPUT(L"NtCreateFile hook installed");}else{DEBUG_OUTPUT(L"MH_EnableHook for NtCreateFile failed");}}else{DEBUG_OUTPUT(L"NtCreateFile hook creation failed");}
}// DLL入口点
BOOL APIENTRY DllMain(HMODULE hModule, DWORD reason, LPVOID lpReserved)
{switch (reason){case DLL_PROCESS_ATTACH:DisableThreadLibraryCalls(hModule);InitializeHook();break;case DLL_PROCESS_DETACH:if (g_hookInitialized){MH_DisableHook(MH_ALL_HOOKS);MH_Uninitialize();DEBUG_OUTPUT(L"MinHook uninitialized");}break;}return TRUE;
}

再编译注入程序

// 简易注入工具示例
#include <Windows.h>
#include <TlHelp32.h>DWORD GetExplorerPID()
{PROCESSENTRY32W pe32 = { sizeof(pe32) };HANDLE snapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);if (Process32FirstW(snapshot, &pe32)) {do {if (_wcsicmp(pe32.szExeFile, L"explorer.exe") == 0) {CloseHandle(snapshot);return pe32.th32ProcessID;}} while (Process32NextW(snapshot, &pe32));}CloseHandle(snapshot);return 0;
}int main()
{DWORD pid = GetExplorerPID();if (pid == 0) return 1;HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, pid);if (!hProcess) return 2;LPCWSTR dllPath = L"C:\\Visual Studio 2015\\Projects\\Hook测试\\x64\\Release\\Hook测试.dll";SIZE_T pathSize = (wcslen(dllPath) + 1) * sizeof(WCHAR);LPVOID pRemoteMem = VirtualAllocEx(hProcess, NULL, pathSize,MEM_COMMIT, PAGE_READWRITE);if (!pRemoteMem) {CloseHandle(hProcess);return 3;}if (!WriteProcessMemory(hProcess, pRemoteMem, dllPath, pathSize, NULL)) {VirtualFreeEx(hProcess, pRemoteMem, 0, MEM_RELEASE);CloseHandle(hProcess);return 4;}HANDLE hThread = CreateRemoteThread(hProcess, NULL, 0,(LPTHREAD_START_ROUTINE)GetProcAddress(GetModuleHandleW(L"kernel32.dll"), "LoadLibraryW"),pRemoteMem, 0, NULL);if (!hThread) {VirtualFreeEx(hProcess, pRemoteMem, 0, MEM_RELEASE);CloseHandle(hProcess);return 5;}WaitForSingleObject(hThread, INFINITE);CloseHandle(hThread);VirtualFreeEx(hProcess, pRemoteMem, 0, MEM_RELEASE);CloseHandle(hProcess);return 0;
}

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/web/91206.shtml
繁体地址,请注明出处:http://hk.pswp.cn/web/91206.shtml
英文地址,请注明出处:http://en.pswp.cn/web/91206.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

图像平滑处理

图像平滑处理四种常用方式1. 均值滤波 (cv2.blur())2. 高斯滤波 (cv2.GaussianBlur())3. 中值滤波 (cv2.medianBlur())4、双边滤波 (cv2.bilateralFilter())总结存图时遇到一个中文版乱码问题四种常用方式 平滑处理&#xff08;也称为模糊处理&#xff09;&#xff0c;用于减少…

fortigate的waf功能

在系统管理----可见功能----web应用防火墙打开waf功能Web 应用程序防火墙 &#xff08;WAF&#xff09; 配置文件可以检测和阻止已知的 Web 应用程序攻击。您可以将 WAF 配置文件配置为使用签名和约束来检查 Web 流量。您还可以强制实施 HTTP 方法策略&#xff0c;该策略控制与…

AI Compass前沿速览:可灵创意工坊、字节Coze StudioCoze Loop、通义万相2.2 、智谱GLM-4.5、腾讯混元3D世界模型开源

AI Compass前沿速览&#xff1a;可灵创意工坊、字节Coze Studio&Coze Loop、通义万相2.2 、智谱GLM-4.5、腾讯混元3D世界模型开源 AI-Compass 致力于构建最全面、最实用、最前沿的AI技术学习和实践生态&#xff0c;通过六大核心模块的系统化组织&#xff0c;为不同层次的学…

SpringCloud之Gateway

SpringCloud之Gateway 官网地址&#xff1a; https://docs.spring.io/spring-cloud-gateway/docs/current/reference/html/#gateway-request-predicates-factories 1. 什么是gateway Spring Cloud Gateway 是Spring Cloud官方推出的第二代网关框架&#xff0c;定位于取代 Net…

关于获取某目录及子目录下所有文件且不包含隐藏文件

最近比较忙&#xff0c;很少写blog了&#xff01;&#xff01;&#xff01;关于获取目录及子目录下所有文件是常遇到的功能&#xff0c;一般通过递归遍历实现。而生产场景中&#xff0c;一般是遍历nas上的目录&#xff0c;在nas上利用File.listFiles(),在linux系统上无法获取含…

docker可视化管理工具lazydocker

Lazydocker 是一个用 Go 语言编写的命令行 Docker 管理工具。它提供了一个简洁、直观的终端界面&#xff0c;支持键盘和鼠标操作&#xff0c;可通过方向键与快捷键实时查看和管理容器、镜像、网络等资源&#xff0c;大幅简化了原本复杂的命令行操作&#xff0c;提升操作效率。2…

少林寺用什么数据库?

&#x1f4e2;&#x1f4e2;&#x1f4e2;&#x1f4e3;&#x1f4e3;&#x1f4e3; 作者&#xff1a;IT邦德 中国DBA联盟(ACDU)成员&#xff0c;15年DBA工作经验 Oracle、PostgreSQL ACE CSDN博客专家及B站知名UP主&#xff0c;全网粉丝15万 擅长主流Oracle、MySQL、PG、高斯及…

C语言---万能指针(void *)、查找子串(strncmp函数的应用)多维数组(一维数组指针、二维数组指针)、返回指针值函数、关键字(const)

一、字符串与指针用字符指针指向一个字符串&#xff0c;可以不定义字符数组&#xff0c;而定义字符指针。用字符指针指向字符串中的字符。不能使用指针去改变不能修改的空间。eg1. 运用指针将 src 的内容拷贝到 dest 中去void Strcpy(char *dest, char *src) {while(*src ! \0)…

Keepalived 实战

一、高可用集群基础核心概念与指标集群类型&#xff1a;LB&#xff08;负载均衡&#xff09;&#xff1a;如 LVS、HAProxy、Nginx&#xff0c;提升吞吐量&#xff1b;HA&#xff08;高可用&#xff09;&#xff1a;保障核心服务&#xff08;数据库、Redis&#xff09;连续性&am…

窗口函数替代子查询的复杂查询简化技巧

窗口函数通过单次扫描完成分析计算&#xff0c;能大幅简化子查询结构并提升性能&#xff0c;尤其在排名、累计计算等场景‌15。以下是核心优化技巧&#xff1a;一、排名场景替代方案‌部门工资排名‌传统子查询需自连接和聚合计数&#xff1a;sqlSELECT e1.name, e1.salary, (S…

深度学习:预训练和warm up的区别

“预训练&#xff08;Pre-training&#xff09;”和“Warm-up&#xff08;预热&#xff09;”是深度学习中常见的两个训练策略&#xff0c;它们虽然都在训练初期起作用&#xff0c;但本质和目的完全不同。一、预训练&#xff08;Pre-training&#xff09;1. 定义预训练是指&…

Apache Ignite中分布式信号量(Distributed Semaphore)的说明和使用示例

这段内容是关于 Apache Ignite 中 分布式信号量&#xff08;Distributed Semaphore&#xff09; 的说明和使用示例。我们来一步步解析&#xff0c;帮助你深入理解它的含义和用途。&#x1f539; 一、什么是 Semaphore&#xff08;信号量&#xff09;&#xff1f; 在并发编程中&…

怎么提升服务器的防攻击能力!

提升服务器的防攻击能力需要从​​架构设计、技术防护、运维管理​​等多维度入手&#xff0c;覆盖网络层、系统层、应用层及数据层的安全防护。以下是具体的策略和实践方法&#xff1a;​​一、基础安全加固&#xff1a;消除自身漏洞​​服务器自身的脆弱性是最常见的攻击入口…

vscode配置rust环境

1.官网下载vscode&#xff0c;安装 2.vscode命令行运行&#xff1a; Invoke-WebRequest https://win.rustup.rs/x86_64 -OutFile rustup-init.exe然后&#xff1a; .\rustup-init.exe3.验证 先配置path&#xff1a; $env:Path ";$env:USERPROFILE\.cargo\bin"查看是…

最新版 HarmonyOS NEXT 开发工具安装教程:如何在 macOS 系统安装 DevEco Studio 5.0.3 编辑器?

最新版 HarmonyOS NEXT 开发工具安装教程&#xff1a;如何在 macOS 系统安装 DevEco Studio 5.0.3 编辑器&#xff1f; 什么是 DevEco Studio&#xff1f; DevEco Studio 是华为为 HarmonyOS 开发的强大集成开发环境&#xff08;IDE&#xff09;&#xff0c;专为开发 Harmony…

电商项目统一认证方案设计与实战

1. 微服务网关整合 OAuth2.0 设计思路分析 网关整合 OAuth2.0 有两种思路&#xff0c;一种是授权服务器生成令牌, 所有请求统一 在网关层验证&#xff0c;判断权限等操作&#xff1b;另一种是由各资源服务处理&#xff0c;网关只做请求 转发 。 比较常用的是第一种&#xf…

学习Markdown

标题一 标题二 标题三 标题四 标题五 标题六这是一段引用文本直接编写&#xff0c;段落换行是末尾两个以上的空格&#xff0b;回车 或者在段落后加一个空行 粗体语法&#xff1a;使用两个星号 ** 或两个下划线 __ 包围文字&#xff1a;这是粗体文字使用星号 这是__粗体文字__使…

剧本杀系统 App 开发:科技赋能,重塑剧本杀游戏体验

在科技飞速发展的当下&#xff0c;各个行业都在积极寻求与科技的融合&#xff0c;以实现创新和升级。剧本杀行业也不例外&#xff0c;剧本杀系统 App 的开发正是科技赋能的生动体现&#xff0c;它重塑了传统的剧本杀游戏体验&#xff0c;为玩家带来了全新的感受。剧本杀系统 Ap…

wvp-gb28181-pro 只用jar运行

编译前端后npm install --global yarnyarn --registryhttps://registry.npmjs.org installyarn run build&#xff0c;生成的前端文件&#xff0c;会在wvp-GB28181-pro\src\main\resources\static&#xff0c;因为是在resources中&#xff0c;打maven打包后会一起打到jar中&…

深度学习(鱼书)day06--神经网络的学习(后两节)

深度学习&#xff08;鱼书&#xff09;day06–神经网络的学习&#xff08;后两节&#xff09;一、梯度 像 这样的由全部变量的偏导数汇总而成的向量称为梯度&#xff08;gradient&#xff09;。 梯度实现的代码&#xff1a; def numerical_gradient(f, x):h 1e-4 # 0.0001grad…