本文演示如何使用自定义消息来实现进程间通信。
原理:使用SetWindowsHookEx给目标进程添加一段HOOK程序,用来处理自定义消息,然后用SendMessage向目标进程发送自定义消息,从而实现进程间通信。

项目分为两部分:设置HOOK的DLL和消息发送程序。

DLL

定义3个函数,分别用于安装钩子,卸载钩子和自定义消息处理函数。其中前两个函数是导出函数,由消息发送程序调用。
代码如下:

// dllmain.cpp : 定义 DLL 应用程序的入口点。
#define _CRT_SECURE_NO_WARNINGS
#include "framework.h"
#include <stdio.h>HHOOK g_HookProc;
extern "C" void __declspec(dllexport) SetHook(); // 安装HOOK
extern "C" void __declspec(dllexport) UnHook(); // 卸载HOOK
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()
{// 安装HOOKHMODULE 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)相关推荐

  1. 安卓 linux 信令,呼叫信令

    呼叫信令 产品概述¶ 提供基于 TCP 协议的消息通道,兼容主流音视频 SDK,支持离线推送和自定义消息.信令消息不丢.不乱序.稳定可靠. 支持平台: 支持 iOS.Android.Web.Mac.W ...

  2. android:使用Messenger进行进程间通信(一)

    Messenger简介 Messenger和AIDL是实现进程间通信(interprocess communication)的两种方式. 实际上,Messenger的实现其实是对AIDL的封装. Me ...

  3. Android系统在新进程中启动自定义服务过程(startService)的原理分析 (下)

    Step 10. ActivityManagerService.attachApplicationLocked 这个函数定义在frameworks/base/services/java/com/and ...

  4. python多进程存储数据_Python 多进程及进程间通信

    python 因 GIL 的存在,处理计算密集型的任务时无法高效利用多核 CPU 的计算资源,这时就需要使用多进程来提高对 CPU 的资源利用.Python 多进程主要用 multiprocessin ...

  5. linux c 进程间通信

    进程间通信概述 进程间通信(InterProcess Communication,IPC)是指在不同进程之间传播或交换信息. Linux的进程间通信方法有管道(Pipe)和有名管道(FIFO).信号( ...

  6. linux系统编程_Linux系统编程:进程间通信

    进程的重要性对于编程人员来说,至关重要,那么,进程间是如何通信的呢?在一个大的项目中,进程间的通信有哪些方式,这对于我们程序员来说也是很重要的一个点?那么本节我们就来聊聊进程间通信的方式,以及各自的优 ...

  7. Linux进程间通信三 System V 信号量简介与示例

    1. System V信号量简介 SystemV信号量主要用于解决生产者和消费者问题,一个信号量能够控制多个资源,说它是信号量集也不为过. 2. API接口介绍 2.1 创建或打开信号量集 #incl ...

  8. Linux进程间通信二 System V 消息队列简介与示例

    1. SystemV消息队列简介 消息队列,顾名思义即是存放消息的队列,内核为每个SystemV 维护了一个msg_queue的结构体,里面记录了每个消息队列的信息. struct msg_queue ...

  9. Linux进程间通信一 System V 共享内存简介与示例

    目录 1. System V共享内存简介 2. API介绍 2.0 key_t和标识符 2.1  创建system v共享内存 2.2 映射共享内存并使用 2.3 取消共享内存映射 2.4 控制共享内 ...

最新文章

  1. [吴恩达机器学习笔记]12支持向量机2 SVM的正则化参数和决策间距
  2. Zabbix安装 Grafana安装
  3. OC中runtime的使用
  4. Weblogic10 集群配置
  5. 基于nodejs实现每天固定时间发送邮件服务
  6. Linux中断处理与定时器
  7. cf1557D. Ezzat and Grid
  8. Java程序员从笨鸟到菜鸟之(五十一)细谈Hibernate(二)开发第一个hibernate基本详解...
  9. 玩转 SpringBoot 2 快速整合 | 丝袜哥(Swagger)
  10. [Java] 蓝桥杯ADV-185 算法提高 五次方数
  11. cmakelists语法_cmake使用教程(六)-蛋疼的语法
  12. DJ Mix Pads 2 - Remix Version for Mac(独特DJ混音创作软件)
  13. Jetpack 新成员 AndroidX App Startup 实践以及原理分析
  14. 厦门大学 软件学院 夏令营
  15. Webpack 2 视频教程 007 - 配置 WDS 进行浏览器自动刷新
  16. 磁力搜索网站+下载神器放送2019-03-05
  17. 星聚宝—云服务器快速搭建网站(阿里云服务器举例)
  18. 自动化测试面试题及答案大全(5)
  19. citespace 版本5.6.R5无法打开, 版本为5.6.R2可以打开
  20. c++操作Office之Word

热门文章

  1. centos修改mysql密码_WAMP下修改MYSQL数据库密码
  2. 成功解决ImportError: cannot import name ‘joblib‘
  3. AI:2020年6月21日北京智源大会演讲分享之09:40Judea教授《 The New Science of Cause and Effect with reflections ondata s》
  4. Python:利用python编程将上海十六区,2020年5月份房价实时地图(数据来源房天下)进行柱状图、热图可视化
  5. Py之keras-retinanet:keras-retinanet的简介、安装、使用方法之详细攻略
  6. NLP:利用DictVectorizer对使用字典存储的数据进行特征抽取与向量化
  7. BlockChain:Py实现区块链简单场景应用:程序猿记录在区块里的收入记录图
  8. 成功解决Python中出现的ValueError: not enough values to unpack (expected 2, got 1)的问题
  9. C# using的用法
  10. jQuery选择器整理