首页
社区
课程
招聘
[求助]怎么处理sendmessage的返回值
发表于: 2010-12-31 18:21 6709

[求助]怎么处理sendmessage的返回值

2010-12-31 18:21
6709
我DLL注入到B程序里面,然后我A程序向B程序发送sendmessage,

在DLL里面能截获到sendmessage,但是我想让DLL自定义返回一个数据回A程序,

下面是DLL的部分代码,A程序获取到的返回值一直是0,不知道怎么弄了,求助!

HHOOK g_hhook = NULL;
HINSTANCE m_hInst;

LRESULT CALLBACK KeyboardProc(int nCode, WPARAM wParam, LPARAM lParam);

BOOL APIENTRY DllMain( HANDLE hModule,   //DLL入口
                       DWORD ul_reason_for_call, 
                       LPVOID lpReserved
      )
{
	m_hInst=(HINSTANCE)hModule;
    return TRUE;
};

extern "C" __declspec(dllexport) HHOOK _stdcall InstallHook(HWND hHwnd)
{
	g_hhook = ::SetWindowsHookEx(WH_CALLWNDPROC, (HOOKPROC)KeyboardProc, m_hInst, ::GetWindowThreadProcessId(hHwnd,NULL));
	if (g_hhook != NULL)
		return g_hhook;
	return 0;
}

extern "C" __declspec(dllexport) BOOL _stdcall UninstallHook(HHOOK hHook)
{
	return ::UnhookWindowsHookEx(hHook);
}

LRESULT CALLBACK KeyboardProc(int nCode, WPARAM wParam, LPARAM lParam)
{
	if(nCode == HC_ACTION)
	{
		PCWPSTRUCT p=(PCWPSTRUCT)lParam;
	
		if(p->message == WM_USER+1) 
		{
			::MessageBox(0,"成功","提示",0);			                                return 77586;
		}
	}
	return ::CallNextHookEx(g_hhook, nCode, wParam ,lParam);
}

[课程]FART 脱壳王!加量不加价!FART作者讲授!

收藏
免费 0
支持
分享
最新回复 (7)
雪    币: 1157
活跃值: (847)
能力值: ( LV8,RANK:150 )
在线值:
发帖
回帖
粉丝
2
给你我的理解啊,是这样,你的DLL已经注入到B程序,那么这个 所谓的77586会返回给B程序,你的A程序的发送代码没有给出,那我建议你这样

A:
//hWnd_A  ===程序A的一个窗口句柄,hwnd_B===程序B的窗口句柄
SendMessage(hWnd_B,WM_MY_MESSAGE,(LPARAM)hWnd_A,0);//这里记得保存hwnd_A啊,下面回馈信息要用

Dll中,你的那个:
if(p->message == WM_USER+1)
    {
      ::MessageBox(0,"成功","提示",0);                                      return 77586;
    }
替换成
if(p->message == WM_USER+1)
    {
      ::MessageBox(0,"成功","提示",0);                                    
      ::SendMessage(hwnd_A,WM_MY_MESSAGE_BACK,77586,0);
       //当然这里的hwnd_A要在你发送WM_MY_MESSAGE消息的时候带过来,然后保存的适当的地方,只要这里能够访问到就好
    }

//仅供参考,
2011-1-2 09:14
0
雪    币: 209
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
首先谢谢楼上的这位朋友,

但是这样数据不同步额.

我之前试过自己写的程序子类化本窗口,自己处理过程,

然后在写一个主程序,发送消息就可以得到返回值,

DLL里面子类化宿主窗口没成功不知道怎么回事.
2011-1-3 10:29
0
雪    币: 209
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
刚才搜索了一下论坛

貌似要Hook SendMessage必须Hook WH_CALLWNDPROC and WH_CALLWNDPROCRET
2011-1-3 10:36
0
雪    币: 1157
活跃值: (847)
能力值: ( LV8,RANK:150 )
在线值:
发帖
回帖
粉丝
5
自己写的窗口,还需要子类化??要是SDK不用子类化,要是MFC那就加个ON_MESSAGE(WM_MY_MESSAGE,OnMyMessage),主要是不知道你的代码,在这里乱猜测一通啊
2011-1-3 13:23
0
雪    币: 208
活跃值: (40)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
6
在程序B中真的收到了那个消息吗?
2011-1-3 15:16
0
雪    币: 209
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
最后还是子类化搞定了
HHOOK g_hhook = NULL;
HINSTANCE m_hInst;
WNDPROC  OldProc= NULL; //原窗口过程

LRESULT CALLBACK KeyboardProc(int nCode, WPARAM wParam, LPARAM lParam);
LRESULT CALLBACK WindowProc(HWND hwnd,UINT uMsg,WPARAM wParam,LPARAM lParam);

BOOL APIENTRY DllMain( HANDLE hModule,   //DLL入口
                       DWORD ul_reason_for_call, 
                       LPVOID lpReserved
      )
{
	m_hInst=(HINSTANCE)hModule;
    return TRUE;
};

extern "C" __declspec(dllexport) HHOOK _stdcall InstallHook(HWND hHwnd)
{
	g_hhook = ::SetWindowsHookEx(WH_CALLWNDPROCRET, (HOOKPROC)KeyboardProc, m_hInst, ::GetWindowThreadProcessId(hHwnd,NULL));
	if (g_hhook != NULL)
		return g_hhook;
	return 0;
}

extern "C" __declspec(dllexport) BOOL _stdcall UninstallHook(HHOOK hHook)
{
	return ::UnhookWindowsHookEx(hHook);
}

LRESULT CALLBACK KeyboardProc(int nCode, WPARAM wParam, LPARAM lParam)
{
	if(nCode == HC_ACTION)
	{
		//PCWPSTRUCT p=(PCWPSTRUCT)lParam;
		CWPRETSTRUCT *p=(CWPRETSTRUCT*)lParam;
	
		if(p->message == WM_USER+1)
		{
			HWND retNum;
			char tt[10];
			retNum=(HWND)p->wParam;
			ltoa((DWORD)retNum,tt,10);
			::MessageBox(0,tt,"提示",0);
			OldProc=(WNDPROC)GetWindowLong(retNum,GWL_WNDPROC); 
            if (SetWindowLong(retNum,GWL_WNDPROC,(long)WindowProc)==0) //子类化
			{
		  	  ::MessageBox(0,"安装失败","提示",0);
			}
			//return 77586;
		}
        //::MessageBox(0,"hgggg","提示",0);
	}
	return ::CallNextHookEx(g_hhook, nCode, wParam ,lParam);
}

LRESULT CALLBACK WindowProc(HWND hwnd,UINT uMsg,WPARAM wParam,LPARAM lParam)
{
	switch(uMsg)
	{
	case WM_DESTROY://接收到销毁窗口消息时取消子类化
		if (OldProc != NULL)
		{
			SetWindowLong(hwnd,GWL_WNDPROC,(long)OldProc);
			OldProc=NULL;
		}
	case WM_USER + 2:
		::MessageBox(0,"收到WM_USER+2消息","提示",0);
		return 7758;
	}
	return CallWindowProc(OldProc,hwnd,uMsg,wParam,lParam);
}
2011-1-3 16:15
0
雪    币: 209
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
先安装HOOK,然后发送WM_USER+1传送一个窗口句柄过去子类化,就安装成功了.

我在其他程序调用sendmessage发送WM_USER+2也能得到7758这个值了.
2011-1-3 16:18
0
游客
登录 | 注册 方可回帖
返回
//