Hook捕獲并攔截文件創建行為

需要用到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…