逆向必备技术:进程间通信——自定义消息方式实现(SETWINDOWSHOOKEX)

  进程的通信,在HOOK类逆向领域是非常的重要,在早器,我使用过 SetWindowText 的模式来进行把傀儡进程里面的数据导出到 我自身的软件上,但是 这个方法很笨,如果数据量多了以后就会出现丢失。后来采用了 本文的自定义消息 和 消息回调函数 可以完美实现 注入到目标进程的DLL 和 我自身的EXE进程进行通信。(自身EXE 是MFC,建立了 自定义消息处理函数,而注入到其他进程的DLL里面有PostMessage消息函数,因为当时数据传递只做了单项 的,只需将DLL里面的数据 传入到EXE即可!)

本文演示如何使用自定义消息来实现进程间通信。
原理:使用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()
{
	// 安装HOOK
	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;
}
 

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

侠客软件开发

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值