分享
 
 
 

给MSN Messager装个钩子

王朝vc·作者佚名  2006-01-10
窄屏简体版  字體: |||超大  

最近研究怎么样使用HOOK拦截其他应用程序的消息,于是就动手写了一个钩子程序来挂到最常用的通讯及时通讯工具MSN,虽然没有什么实际意义,但作为学习研究却能够帮助我们理解利用HOOK是怎么样将自己编写的DLL注入已经存在的程序空间中的。

我们需要做的是通过我们自己编写的应用程序去拦截别人写好的应用程序消息,实际上这是在两个进程之间进行的,难度就在这里,如果是同一个进程什么都好办,只要将系统响应WINDOWS消息的处理函数修改为我们自己编写的函数就可以,但现在不能这么做,因为两个进程有各自的进程地址空间,理论上你没有办法直接去访问别的进程的地址空间,那么怎么办来?办法还是很多的,这里仅仅介绍通过HOOK来达到目的。

需要拦截别的应用程序的消息,需要利用将自己编写的DLL注入到别人的DLL地址空间中才可以达到拦截别人消息的目的。只有将我们的DLL插入到别的应用程序的地址空间中才能够对别的应用程序进行操作,HOOK帮助我们完成了这些工作,我们只需要使用HOOK来拦截指定的消息,并提供必要的处理函数就行了。我们这里介绍拦截在MSN聊天对话框上的鼠标消息,对应的HOOK类型是WH_MOUSE。

首先我们要建立一个用来HOOK的DLL。这个DLL的建立和普通的DLL建立没有什么具体的区别,不过我们这里提供的方法有写不同。这里使用隐式导入DLL的方法。代码如下:

头文件

#pragma once

#ifndef MSNHOOK_API

#define MSNHOOK_API __declspec(dllimport)

#endif

MSNHOOK_API BOOL WINAPI SetMsnHook(DWORD dwThreadId);//安装MSN钩子函数

MSNHOOK_API void WINAPI GetText(int &x,int &y,char ** ptext);//安装MSN钩子函数

MSNHOOK_API HWND WINAPI GetMyHwnd();//安装MSN钩子函数

==================================================

DLL 的CPP文件

#include "stdafx.h"

#include "MSNHook.h"

#include <stdio.h>

// 下面几句的含义是告诉编译器将各变量放入它自己的数据共享节中

#pragma data_seg("Shared")

HHOOK g_hhook = NULL;

DWORD g_dwThreadIdMsn = 0;

POINT MouseLoc={0,0};

char text[256]={0};

HWND g_Hwnd = NULL;

#pragma data_seg()

//告诉编译器设置共享节的访问方式为:读,写,共享

#pragma comment(linker,"/section:Shared,rws")

HINSTANCE g_hinstDll = NULL;

BOOL APIENTRY DllMain( HANDLE hModule,

DWORD ul_reason_for_call,

LPVOID lpReserved

)

{

switch (ul_reason_for_call)

{

case DLL_PROCESS_ATTACH:

g_hinstDll = (HINSTANCE)hModule;

break;

case DLL_THREAD_ATTACH:

case DLL_THREAD_DETACH:

case DLL_PROCESS_DETACH:

break;

}

return TRUE;

}

LRESULT WINAPI GetMsgProc(int nCode,WPARAM wParam, LPARAM lParam);

BOOL WINAPI SetMsnHook(DWORD dwThreadId)

{

OutputDebugString("SetMsnHook");

BOOL fOK = FALSE;

if(dwThreadId != 0)

{

OutputDebugString("SetMsnHook dwThreadId != 0");

g_dwThreadIdMsn = GetCurrentThreadId();

//安装WM_MOUSE钩子和处理函数GetMsgProc

g_hhook = SetWindowsHookEx(WH_MOUSE,GetMsgProc,g_hinstDll,dwThreadId);

fOK = (g_hhook != NULL);

if(fOK)

{

fOK = PostThreadMessage(dwThreadId,WM_NULL,0,0);

}

else

{

fOK = UnhookWindowsHookEx(g_hhook);

g_hhook = NULL;

}

}

return(fOK);

}

LRESULT WINAPI GetMsgProc(int nCode,WPARAM wParam, LPARAM lParam)

{

char temp[20];

sprintf(temp,"%d\n",nCode);

OutputDebugString("temp");

if (nCode==HC_ACTION)

{

MOUSEHOOKSTRUCT *l=(MOUSEHOOKSTRUCT *)lParam;

MouseLoc=l->pt; //送鼠标位置

//char text[256] = "";

HWND hWnd = WindowFromPoint(l->pt);

if(hWnd)

{

//GetWindowText(hWnd,text,256);

SendMessage(hWnd,WM_GETTEXT,256,(LPARAM)(LPCTSTR)text);

// strcpy(text,"123455555");

SendMessage(hWnd,WM_SETTEXT,256,(LPARAM)(LPCTSTR)text);

g_Hwnd = hWnd;

}

//SendMessage(WindowFromPoint(l->pt),WM_GETTEXT,256,(LPARAM)(LPCTSTR)psw);

}

return(CallNextHookEx(g_hhook,nCode,wParam,lParam));

}

void WINAPI GetText(int &x,int &y,char ** ptext)

{

x = MouseLoc.x;

y = MouseLoc.y;

*ptext = text;

}

HWND WINAPI GetMyHwnd()

{

return g_Hwnd;

}

上面是处理钩子的DLL代码,下面我们要让这个DLL起作用还需要一个启动部分,通过这个启动部分我们才能让我们的钩子函数真正的注入到系统其他函数中。我们这里使用个对话框的程序,程序非常简单:一个按钮用来启动钩子,一个用来停止,一个TIMER用来刷新显示,还有一个EDITBOX用来接受信息。

程序如下:

//包含DLL函数导出的头文件

#include "MSNHook.h"

//隐式导入

#pragma comment(lib,"MSNHook.lib")

//声明导入函数

__declspec(dllimport) BOOL WINAPI SetMsnHook(DWORD dwThreadId);

__declspec(dllimport) void WINAPI GetText(int &x,int &y,char ** ptext);

__declspec(dllimport) HWND WINAPI GetMyHwnd();//安装MSN钩子函数

void CTestMSNHookDlg::OnBnClickedOk()

{

//通过SPY++可以看到MSN聊天对话框窗口类是IMWindowClass,通过这个得到该窗口句柄

CWnd *pMsnWin = FindWindow(TEXT("IMWindowClass"),NULL);

if(pMsnWin == NULL) return ;

//通过窗口句柄得到对应的线程的ID

SetMsnHook(GetWindowThreadProcessId(pMsnWin->GetSafeHwnd(),NULL));

MSG msg;

GetMessage(&msg,NULL,0,0);

SetTimer(101,100,NULL);

}

void CTestMSNHookDlg::OnTimer(UINT_PTR nIDEvent)

{

//刷新消息

char * pText = NULL;

int x = 0,y = 0;

GetText(x,y,&pText);

if(x ==0 && y ==0) return ;

m_Edit.Format("%d:%d:%s",x,y,pText);

//m_Edit = pText;

UpdateData(FALSE);

HWND hWnd = GetMyHwnd();

CWnd * pWnd = CWnd::FromHandle(hWnd);

pWnd->GetWindowText(m_Edit);

CDialog::OnTimer(nIDEvent);

}

void CTestMSNHookDlg::OnBnClickedButton1()

{

//关闭

KillTimer(101);

SetMsnHook(0);

OnCancel();

}

好了,基本上就这些了。这里有个问题,我本想得到MSN用户聊天时输入的聊天信息,这里通过WM_GETTEXT消息的不到,如果有知道的朋友告诉一声。

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有