SetWindowsHookEx为某个进程安装钩子

HMODULE GetModuleHandle (LPCTSTRlpModuleName);
功能说明

获取一个特定的应用程序或动态链接库的模块句柄,且这个模块必须已经被加载到调用者的进程空间中,否则调用LoadLibrary

GetModuleHandle(NULL);
这将返回自身应用程序句柄(好像一直是0x40000000,和GetCurrentProcess(一直是0xFFFFFFFF)是不一样的,一个是模块一个进程,用在不同的地方)即使是在模块内,返回的也是调用它的应用程序的句柄,而不是模块本身的句柄。


要在模块中获得模块本身的句柄,可以通过如下函数获得,该函数通过模块内的函数获得模块的句柄

HMODULE ModuleFromAddress(PVOID pv) 
{
MEMORY_BASIC_INFORMATION mbi;
if(::VirtualQuery(pv, &mbi, sizeof(mbi)) != 0)
{

  • 1
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
目前最好的EasyHook的完整Demo程序,包括了Hook.dll动态库和Inject.exe注入程序。 Hook.dll动态库封装了一套稳定的下钩子的机制,以后对函数下钩子,只需要填下数组表格就能实现了,极大的方便了今后的使用。 Inject.exe是用MFC写的界面程序,只需要在界面上输入进程ID就能正确的HOOK上相应的进程,操作起来非常的简便。 这个Demo的代码风格也非常的好,用VS2010成功稳定编译通过,非常值得下载使用。 部分代码片段摘录如下: //【Inject.exe注入程序的代码片段】 void CInjectHelperDlg::OnBnClickedButtonInjectDllProcessId() { ////////////////////////////////////////////////////////////////////////// //【得到进程ID值】 UINT nProcessID = 0; if (!GetProcessID(nProcessID)) { TRACE(_T("%s GetProcessID 失败"), __FUNCTION__); return; } ////////////////////////////////////////////////////////////////////////// //【得到DLL完整路径】 CString strPathDLL; if (!GetDllFilePath(strPathDLL)) { TRACE(_T("%s GetDllFilePath 失败"), __FUNCTION__); return; } ////////////////////////////////////////////////////////////////////////// //【注入DLL】 NTSTATUS ntStatus = RhInjectLibrary(nProcessID, 0, EASYHOOK_INJECT_DEFAULT, strPathDLL.GetBuffer(0), NULL, NULL, 0); if (!ShowStatusInfo(ntStatus)) { TRACE(_T("%s ShowStatusInfo 失败"), __FUNCTION__); return; } } //【Hook.dll动态库的代码片段】 extern "C" __declspec(dllexport) void __stdcall NativeInjectionEntryPoint(REMOTE_ENTRY_INFO* InRemoteInfo) { if (!DylibMain()) { TRACE(_T("%s DylibMain 失败"), __FUNCTION__); return; } } FUNCTIONOLDNEW_FRMOSYMBOL array_stFUNCTIONOLDNEW_FRMOSYMBOL[]= { {_T("kernel32"), "CreateFileW", (void*)CreateFileW_new}, {_T("kernel32"), "CreateFileA", (void*)CreateFileA_new}, {_T("kernel32"), "ReadFile", (void*)ReadFile_new} }; BOOL HookFunctionArrayBySymbol() { /////////////////////////////////////////////////////////////// int nPos = 0; do { /////////////////////////////// FUNCTIONOLDNEW_FRMOSYMBOL* stFunctionOldNew = &g_stFUNCTIONOLDNEW_FRMOSYMBOL[nPos]; if (NULL == stFunctionOldNew->strModuleName) { break; } /////////////////////////////// if (!HookFunctionBySymbol(stFunctionOldNew->strModuleName, stFunctionOldNew->strNameFunction, stFunctionOldNew->pFunction_New)) { TRACE(_T("%s HookFunctionBySymbol 失败"), __FUNCTION__); return FALSE; } } while(++nPos); /////////////////////////////////////////////////////////////// return TRUE; } HANDLE WINAPI CreateFileW_new( PWCHAR lpFileName, DWORD dwDesiredAccess, DWORD dwShareMode, LPSECURITY_ATTRIBUTES lpSecurityAttributes, DWORD dwCreationDisposition, DWORD dwFlagsAndAttributes, HANDLE hTemplateFile ) { TRACE(_T("CreateFileW_new. lpFileName = %s"), lpFileName); return CreateFileW( lpFileName, dwDesiredAccess, dwShareMode, lpSecurityAttributes, dwCreationDisposition, dwFlagsAndAttributes, hTemplateFile); }
要使用C++安装钩子来监控串口通信,你可以使用Windows API中的串口通信函数和钩子函数来实现。下面是一个示例代码,用于安装钩子来监控串口通信: ```cpp #include <iostream> #include <Windows.h> HHOOK g_hookHandle; // 全局钩子句柄 LRESULT CALLBACK SerialPortHookProc(int code, WPARAM wParam, LPARAM lParam) { if (code >= 0) { if (wParam == HC_ACTION) // 监听串口通信事件 { PMSG pMsg = reinterpret_cast<PMSG>(lParam); if (pMsg->message == WM_COMMNOTIFY) // 检查通信通知消息 { // 在这里可以获取串口通信相关信息并进行自定义操作 std::cout << "Serial port communication event detected!" << std::endl; } } } return CallNextHookEx(g_hookHandle, code, wParam, lParam); } int main() { // 安装钩子 g_hookHandle = SetWindowsHookEx(WH_GETMESSAGE, SerialPortHookProc, NULL, GetCurrentThreadId()); if (g_hookHandle == NULL) { std::cout << "Failed to install hook!" << std::endl; return -1; } std::cout << "Serial port hook installed. Press any key to exit." << std::endl; std::cin.get(); // 卸载钩子 UnhookWindowsHookEx(g_hookHandle); return 0; } ``` 这个示例代码使用`SetWindowsHookEx`函数安装一个全局的钩子来拦截串口通信事件。钩子处理函数中,我们检查钩子事件的消息类型,如果是串口通信相关的消息(如`WM_COMMNOTIFY`),则可以获取相关信息并进行自定义操作。 请注意,为了安装全局钩子,程序需要具有管理员权限。另外,这个示例只是演示了如何安装钩子来监控串口通信,具体的操作和处理逻辑需要根据你的实际需求来进行调整。 希望这个示例对你有所帮助!如果你还有其他问题,请随时提问。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值