生活随笔
收集整理的這篇文章主要介紹了
进程间通信——自定义消息方式实现(SetWindowsHookEx)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
本文演示如何使用自定義消息來實現進程間通信。
原理:使用SetWindowsHookEx給目標進程添加一段HOOK程序,用來處理自定義消息,然后用SendMessage向目標進程發送自定義消息,從而實現進程間通信。
項目分為兩部分:設置HOOK的DLL和消息發送程序。
DLL
定義3個函數,分別用于安裝鉤子,卸載鉤子和自定義消息處理函數。其中前兩個函數是導出函數,由消息發送程序調用。
代碼如下:
#define _CRT_SECURE_NO_WARNINGS
#include "framework.h"
#include <stdio.h>HHOOK g_HookProc
;
extern "C" void __declspec(dllexport
) SetHook();
extern "C" void __declspec(dllexport
) UnHook();
LRESULT CALLBACK
MessageHookProc(int nCode
, WPARAM wParam
, LPARAM lParam
); BOOL APIENTRY
DllMain( HMODULE hModule
,DWORD ul_reason_for_call
,LPVOID lpReserved
)
{switch (ul_reason_for_call
){case DLL_PROCESS_ATTACH
:case DLL_THREAD_ATTACH
:case DLL_THREAD_DETACH
:case DLL_PROCESS_DETACH
:break;}return TRUE
;
}extern "C" void __declspec(dllexport
) SetHook()
{g_HookProc
= SetWindowsHookEx(WH_CALLWNDPROC
, MessageHookProc
, GetModuleHandle(TEXT("MessageHook.dll")), 0);
}extern "C" void __declspec(dllexport
) UnHook()
{if (NULL != g_HookProc
)UnhookWindowsHookEx(g_HookProc
);
}LRESULT CALLBACK
MessageHookProc(int nCode
, WPARAM wParam
, LPARAM lParam
)
{if (nCode
== HC_ACTION
){PCWPSTRUCT pcw
= (PCWPSTRUCT
)lParam
;if (pcw
->message
== WM_USER
+ 0x1){char szBuf
[200] = { 0 };sprintf(szBuf
, "wParam: %d\nlParam: %d\nPID: %d\n", pcw
->wParam
, pcw
->lParam
,GetCurrentProcessId());MessageBoxA(0, szBuf
, "接收到自定義消息", 0);}}return CallNextHookEx(g_HookProc
, nCode
, wParam
, lParam
);
}
其中,安裝鉤子和卸載鉤子由消息發送程序調用,自定義消息處理函數則被目標程序加載后,在目標程序的4GB地址空間內執行,在該函數內獲取當前進程id,會發現是目標程序的pid。
消息發送程序
這個程序的工作是設置全局鉤子,然后向目標程序發送消息,消息自動轉交給自定義消息處理函數MessageHookProc處理。
代碼如下:
#include <Windows.h>
#include <stdio.h>BOOL
Inject()
{HMODULE hModule
= LoadLibrary(TEXT("MessageHook.dll"));if (hModule
== NULL){printf("LoadLibrary失敗\n");return FALSE
;}typedef void(*PFNSETHOOK
)();PFNSETHOOK pFnSetHook
= (PFNSETHOOK
)GetProcAddress(hModule
, "SetHook");if (NULL == pFnSetHook
){printf("獲取函數地址失敗\n");return FALSE
;}pFnSetHook();HWND hWnd
= FindWindow(NULL, TEXT("掃雷"));if (!hWnd
){printf("獲取窗口句柄失敗\n");return FALSE
;}SendMessage(hWnd
, WM_USER
+ 0x1, (DWORD
)100, (DWORD
)200);return TRUE
;
}int main()
{Inject();return 0;
}
運行結果:
通過運行結果可以看到,自定義消息已經發送給了掃雷進程,并且由MessageHookProc處理,打印了兩個參數和掃雷的PID,另外,可以借助工具查看,我們的DLL已經注入到了掃雷進程中。
總結
以上是生活随笔為你收集整理的进程间通信——自定义消息方式实现(SetWindowsHookEx)的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。