禁止 拦击 关机 重启 注销 事件
来源:互联网 发布:mac重装系统后无声音 编辑:程序博客网 时间:2024/05/21 17:48
新网站 http://www.softwareace.cn/?p=120前段时间 有个项目需要此功能,貌似国内没人放出完整的例子新建 DLL 动态库 工程名 InterceptShutdown本文出自 王牌软件,转载时请注明出处及相应链接。本文永久链接: http://www.softwareace.cn/?p=120//新建 InterceptShutdown.h#if !defined __INTERCEPTSHUTDOWN__H#define __INTERCEPTSHUTDOWN__H#define INJECT_EX_EXPORTS #ifdef INJECT_EX_EXPORTS#define HOOKDLL_API __declspec(dllexport)#else#define HOOKDLL_API __declspec(dllimport)#endif #include <mapidefs.h> typedefstruct _APIHOOK32_ENTRY{ LPCTSTR pszAPIName; //API名字 LPCTSTR pszCallerModuleName; //被调用的模块名 PROC pfnOriginApiAddress; //原始的函数地址 PROC pfnDummyFuncAddress; //新的函数地址 HMODULE hModCallerModule; //调用的模块句柄}APIHOOK32_ENTRY, *PAPIHOOK32_ENTRY; PROC lpAdder;APIHOOK32_ENTRY pe; HOOKDLL_APIintInstallHook();HOOKDLL_APIintUninstallHook(); #endif // !defined(INJECT_EX__H) //新建 InterceptShutdown.cpp #include "InterceptShutdown.h"#include <windows.h>#include <imagehlp.h>#include <tlhelp32.h>//odbc32.lib odbccp32.lib ImageHlp.lib#pragma comment(lib, "odbc32.lib")#pragma comment(lib, "odbccp32.lib")#pragma comment(lib, "ImageHlp.lib")//-------------------------------------------------------------// shared data // Notice: seen by both: the instance of "HookInjEx.dll" mapped// into "explorer.exe" as well as by the instance// of "HookInjEx.dll" mapped into our "HookInjEx.exe" #pragma data_seg("mydata") HHOOKglhHook=NULL;//安装的勾子句柄 //HINSTANCE glhInstance=NULL; //DLL实例句柄 #pragma data_seg() #pragma comment(linker,"/SECTION:mydata,RWS") //-------------------------------------------------------------// global variables (unshared!)//HINSTANCEglhInstance=NULL; //DLL实例句柄 LRESULTHookProc(int code, // hook code WPARAMwParam, // removal option LPARAMlParam // message ) { returnCallNextHookEx(glhHook,code,wParam,lParam);} BOOLWINAPI _SetApiHookUp(PAPIHOOK32_ENTRY phk){ PIMAGE_THUNK_DATA pThunk; ULONG size; //获取指向PE文件中的Import中IMAGE_DIRECTORY_DESCRIPTOR数组的指针 PIMAGE_IMPORT_DESCRIPTOR pImportDesc = (PIMAGE_IMPORT_DESCRIPTOR)ImageDirectoryEntryToData(phk->hModCallerModule, TRUE, IMAGE_DIRECTORY_ENTRY_IMPORT,&size); if(pImportDesc == NULL) returnFALSE; //查找记录,察看导入表中是否存指定的DLL for(;pImportDesc->Name;pImportDesc++) { LPSTRpszDllName = (LPSTR)((PBYTE)phk->hModCallerModule+pImportDesc->Name); if(lstrcmpiA(pszDllName,phk->pszCallerModuleName) == 0) break; } if(pImportDesc->Name ==NULL) returnFALSE; //寻找我们想要的函数 pThunk = (PIMAGE_THUNK_DATA) ((PBYTE)phk->hModCallerModule+pImportDesc->FirstThunk);//IAT // pThunk = (PIMAGE_THUNK_DATA) ((PBYTE)phk->hModCallerModule+pImportDesc->OriginalFirstThunk); for(;pThunk->u1.Function;pThunk++) { //ppfn记录了与IAT表项相应的函数的地址 PROC *ppfn= (PROC *)&pThunk->u1.Function; if(*ppfn == phk->pfnOriginApiAddress) { //如果地址相同,也就是找到了我们想要的函数,进行改写,将其指向我们所定义的函数 WriteProcessMemory(GetCurrentProcess(),ppfn,&(phk->pfnDummyFuncAddress),sizeof(phk->pfnDummyFuncAddress),NULL); returnTRUE; } } returnFALSE;} //***************************************************************************************/// SetWindowsAPIHook 挂接WindowsAPI函数 当phk->hModCallerModule == NULL //// 会在整个系统内挂接函数 //// 仿照SetWindowsHookEx 建立 ////***************************************************************************************//BOOLWINAPI SetWindowsAPIHook(PAPIHOOK32_ENTRY phk){ MEMORY_BASIC_INFORMATION mInfo; HMODULE hModHookDLL; HANDLE hSnapshot; BOOL bOk; MODULEENTRY32 me = {sizeof(MODULEENTRY32)}; if(phk->pszAPIName == NULL || phk->pszCallerModuleName == NULL || phk->pfnOriginApiAddress == NULL) returnFALSE; if(phk->hModCallerModule == NULL) { VirtualQuery(_SetApiHookUp,&mInfo,sizeof(mInfo)); hModHookDLL=(HMODULE)mInfo.AllocationBase; hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE,0); bOk = Module32First(hSnapshot,&me); while(bOk) { if(me.hModule != hModHookDLL) { phk->hModCallerModule = me.hModule; _SetApiHookUp(phk); } bOk = Module32Next(hSnapshot,&me); } phk->hModCallerModule = NULL; returnTRUE; } else return_SetApiHookUp(phk); returnFALSE; } BOOLWINAPI UnhookWindowsAPIHooks(PAPIHOOK32_ENTRY lpHk){ PROC temp; temp = lpHk->pfnOriginApiAddress; lpHk->pfnOriginApiAddress = lpHk->pfnDummyFuncAddress; lpHk->pfnDummyFuncAddress = temp; returnSetWindowsAPIHook(lpHk);} BOOLWINAPI MyExitWindowsEx( UINTuFlags, // shutdown operation DWORDdwReserved // reserved ){ //MessageBox(NULL,"不能重起!!!","提示",MB_OKCANCEL); returnFALSE;} intInstallHook(){ glhHook = SetWindowsHookEx( WH_GETMESSAGE,(HOOKPROC)HookProc,glhInstance, 0); if( glhHook==NULL ) return0; return1;} intUninstallHook(){ if(!UnhookWindowsAPIHooks(&pe) || !UnhookWindowsHookEx(glhHook)) return0; return1;}//-------------------------------------------------------------// DllMain//BOOLAPIENTRY DllMain( HINSTANCEhModule, DWORD ul_reason_for_call, LPVOIDlpReserved ){ if(ul_reason_for_call == DLL_PROCESS_ATTACH) { glhInstance=hModule; // MessageBox(NULL,"不能重起!!!","提示",MB_OKCANCEL); // showup(); pe.pszAPIName ="ExitWindowsEx"; //API名字 pe.pszCallerModuleName="user32.dll"; //被调用的模块名 pe.pfnOriginApiAddress=(PROC)ExitWindowsEx;//原始的函数地址 pe.pfnDummyFuncAddress=(PROC)MyExitWindowsEx; //新的函数地址 pe.hModCallerModule =NULL; lpAdder=(PROC)ExitWindowsEx; SetWindowsAPIHook(&pe); } return(TRUE);} //新建 InterceptShutdown.def LIBRARY"InterceptShutdown"DESCRIPTION 'Intercept shutdown restart'EXPORTSInstallHookUninstallHook1