安装全局消息钩子实现dll窗体程序注入
生活随笔
收集整理的這篇文章主要介紹了
安装全局消息钩子实现dll窗体程序注入
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
說明{
? ? ?通過設置全局消息鉤子來實現dll注入,然后窗體有相關消息請求的時候就會自動加載注入dll,
然后在入口處做處理就可以了。注入方式簡單很多,比代碼注入和lsp等注入都簡單,就不解釋了。
這個也可以傳遞不同的劫持類型來進行鍵盤按鍵記錄等。
}
注意{
? ? 1.dll注入期間注入程序不可以退出,否則dll內核句柄有可能被釋放。
? ? 2.注意32位和64位注入問題
//DLL相關代碼#include <windows.h> #include <tlhelp32.h> #include <Psapi.h> #pragma comment(lib,"psapi.lib")#pragma data_seg("Yrrehs") HHOOK HT = NULL; #pragma data_seg()HINSTANCE DLLhinst = NULL;LRESULT CALLBACK CProc(int nCode,WPARAM wParam,LPARAM lParam){return CallNextHookEx(HT,nCode,wParam,lParam); }//安裝鉤子 extern "C" __declspec(dllexport) BOOL SetHook(){HT = SetWindowsHookEx(WH_CALLWNDPROC,CProc,DLLhinst,0);if(HT == NULL){return false;}return true; }//卸載鉤子 extern "C" __declspec(dllexport) BOOL UnHook(){BOOL HM_BOOL = FALSE;if(HT != NULL){HM_BOOL = UnhookWindowsHookEx(HT);}return HM_BOOL; }//獲得進程名 wchar_t* GetProcessName(DWORD processID){HANDLE hProcess = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ,FALSE,processID);wchar_t *procName = new wchar_t[MAX_PATH];GetModuleFileNameEx(hProcess,NULL,procName,MAX_PATH);CloseHandle(hProcess);return procName; }//獲得進程名 wchar_t* GetProcessName(wchar_t *FileName){size_t len = wcslen(FileName);size_t i = len-1;for(;i>=0;i--){if(FileName[i] == L'\\'){break;}}wchar_t *temp = FileName + i + 1;return temp; }BOOL WINAPI DllMain(HINSTANCE hinstDll,DWORD fdwReason,LPVOID lpvReserved){DLLhinst = hinstDll;if(DLL_PROCESS_ATTACH == fdwReason){wchar_t *procName = GetProcessName(GetCurrentProcessId());if(_wcsicmp(L"xxx.exe",GetProcessName(procName))==0){//XXXXXX}}if(DLL_PROCESS_DETACH == fdwReason){}return TRUE; }
《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀
? ? ?通過設置全局消息鉤子來實現dll注入,然后窗體有相關消息請求的時候就會自動加載注入dll,
然后在入口處做處理就可以了。注入方式簡單很多,比代碼注入和lsp等注入都簡單,就不解釋了。
這個也可以傳遞不同的劫持類型來進行鍵盤按鍵記錄等。
}
注意{
? ? 1.dll注入期間注入程序不可以退出,否則dll內核句柄有可能被釋放。
? ? 2.注意32位和64位注入問題
}
DLL調用 /* HMODULE h = LoadLibrary(L"xx.dll"); _SetHook SetHook = (_SetHook)GetProcAddress(h,"SetHook"); _UnHook UnHook = (_UnHook)GetProcAddress(h,"UnHook");SetHook();Sleep(10000);UnHook();CloseHandle(h); */
//DLL相關代碼#include <windows.h> #include <tlhelp32.h> #include <Psapi.h> #pragma comment(lib,"psapi.lib")#pragma data_seg("Yrrehs") HHOOK HT = NULL; #pragma data_seg()HINSTANCE DLLhinst = NULL;LRESULT CALLBACK CProc(int nCode,WPARAM wParam,LPARAM lParam){return CallNextHookEx(HT,nCode,wParam,lParam); }//安裝鉤子 extern "C" __declspec(dllexport) BOOL SetHook(){HT = SetWindowsHookEx(WH_CALLWNDPROC,CProc,DLLhinst,0);if(HT == NULL){return false;}return true; }//卸載鉤子 extern "C" __declspec(dllexport) BOOL UnHook(){BOOL HM_BOOL = FALSE;if(HT != NULL){HM_BOOL = UnhookWindowsHookEx(HT);}return HM_BOOL; }//獲得進程名 wchar_t* GetProcessName(DWORD processID){HANDLE hProcess = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ,FALSE,processID);wchar_t *procName = new wchar_t[MAX_PATH];GetModuleFileNameEx(hProcess,NULL,procName,MAX_PATH);CloseHandle(hProcess);return procName; }//獲得進程名 wchar_t* GetProcessName(wchar_t *FileName){size_t len = wcslen(FileName);size_t i = len-1;for(;i>=0;i--){if(FileName[i] == L'\\'){break;}}wchar_t *temp = FileName + i + 1;return temp; }BOOL WINAPI DllMain(HINSTANCE hinstDll,DWORD fdwReason,LPVOID lpvReserved){DLLhinst = hinstDll;if(DLL_PROCESS_ATTACH == fdwReason){wchar_t *procName = GetProcessName(GetCurrentProcessId());if(_wcsicmp(L"xxx.exe",GetProcessName(procName))==0){//XXXXXX}}if(DLL_PROCESS_DETACH == fdwReason){}return TRUE; }
《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀
總結
以上是生活随笔為你收集整理的安装全局消息钩子实现dll窗体程序注入的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 虚拟桌面模拟查找点击自绘控件
- 下一篇: C#-自动获取IP