如何屏蔽win2000信使服务的弹出信息,并且捕获信息
net send localhost 信息
我的目的是不允许信使服务弹出这个信息,用我们自己的程序来截获它,用自己的窗体显示它。
问题点数:100、回复次数:28Top
1 楼mrtxc(阿春)回复于 2003-09-02 10:01:30 得分 5
想想,UPTop
2 楼mrtxc(阿春)回复于 2003-09-02 10:02:33 得分 5
想想,UPTop
3 楼Drate(小虫(好好学习,天天向上))回复于 2003-09-02 10:08:34 得分 5
这个,不知道下HOOK有没有用的呢?
没有试过,不过楼主可以试一试看,如果设置一下MESSAGEBOX的HOOK函数,试试
或是在创建窗口的时候查询一个标题为“信使服务”的窗口就转到你自己的处理过程 上去Top
4 楼lw549(那个孩子他爹)回复于 2003-09-02 10:18:45 得分 0
是也想过hook,觉得这个不是很正规的做法。
我的想法是:有没有一个dll接口能监听信使消息?应该是有的吧。Top
5 楼lxpbuaa(桂枝香在故国晚秋)回复于 2003-09-02 10:23:02 得分 5
它应该是在一个端口监听net send 发来的消息。如果知道这个端口并知道net send 数据包的格式,那么可以自己作一个程序实现替代监听。
————————————————————————————————————
宠辱不惊,看庭前花开花落,去留无意;毁誉由人,望天上云卷云舒,聚散任风。
————————————————————————————————————Top
6 楼Eastunfail(龍子龍孫) (Serpent's Embrace)回复于 2003-09-02 10:24:56 得分 5
不让信使服务弹出信息那就关掉俄~~~~~~~~~~~~~~~~~
Control Panel->Administrative Tools->Services->Messager->Stop
拦截偶不会Top
7 楼Drate(小虫(好好学习,天天向上))回复于 2003-09-02 10:27:39 得分 5
+,1801,Microsoft Message Que,,,
楼主可以试一试监听一下1801的端口,信息应该是从这里过的Top
8 楼zdcnow(磁效应)回复于 2003-09-02 10:45:09 得分 5
这方面的讨论已经非常多,但至今的停留在 邮槽 和 查找窗体将其关闭 两种方法。
以前nowcan做过深入的探讨:
http://vip.6to23.com/NowCan1/tech/msgs98.htm
http://asp.6to23.com/nowcan/tech/cb_hook_messenger.htm
通过建立邮槽的方法实现。
查找窗体,取其内容之后将其关闭的方法代码非常多,很容易就找到,不再细说。
wh_cbt是窗体创建的消息,大部分窗体都可以拦截,但是信史服务窗口用hook拦截wh_cbt是拦截不到的。所以hook都没办法,不信大家可以自己试试,代码找我要也行。
net send数据包的格式非常简单,大家可以在上面的连接中看到。
拦截数据包的方法不现实。Top
9 楼liumengchuan()回复于 2003-09-02 10:45:48 得分 5
98的时候有个winpopup程序,如果可以的话可以使用该窗口Top
10 楼sy_315(apollo)回复于 2003-09-02 13:19:56 得分 4
net stop msg //关闭消息服务
net start msg //打开
关闭以后就发不近来了
:)
Top
11 楼qevan(guodong)回复于 2003-09-02 13:44:42 得分 4
发信人: qevan (开学就颓废了), 信区: Programming
标 题: 拦截你的Net Send (二)zz
发信站: 日月光华 (2003年09月02日13:31:46 星期二), 站内信件
发信人: zzzzzzzzzzzz (肥龟·Synchronize), 信区: Programming
标 题: 拦截你的Net Send (二)
发信站: 逸仙时空 Yat-sen Channel (Sun May 4 12:58:02 2003), 站内信件
作者:ZSQ
Windows的消息服务沿用的是SMB/CIFS Over Netbios Over TCP/IP 的架构
我们自然就从这方面着手,主要实现两个功能,1是接收,二是发送
以下是实现的源代码,具体的原理也容易理解
//QMessngr.h
#define WM_QMESSNGR_NOTIFY WM_USER+1
#define MAX_BUFFER_LENGTH 500
#define REPLY_LENGTH 35
#define SMB_HEADER_LENGTH 35
#define NAME_LENGTH 16
class CQMessngr
{
public:
CQMessngr();
virtual ~CQMessngr();
public:
//发送函数
BOOL Send(char* sTo,char* sMsg);
//启动/停止消息接收线程
//参数:HWND 接收消息的窗口句柄,
//收到消息后会发送WM_MESSENGER_NOTIFY到该窗口
int Start(HWND hwnd);
int Stop();
//线程函数
static UINT MsgMonitorProc(LPVOID param);
static CQMessngr *pseudoThis; //
static HWND hWndNotify;
public:
char m_sLocalName[16];
char m_sRemoteName[16];
char m_sMsg[400];
UCHAR m_sBuffer[500];
CWinThread* m_pThread;
};
(待续)
--
● 我的愿望很简单 ●
┏━━━━━━━━━━┓
┃ ①我的朋友快乐 ┃
┃ ┃
┃ ②自己快乐 ┃
┗━━━━━━━━━━┛
※ 来源:.逸仙时空 Yat-sen Channel bbs.zsu.edu.cn.[FROM: 192.168.50.34]
※ 修改:.zzzzzzzzzzzz 于 May 4 13:00:01 修改本文.[FROM: 192.168.50.34]
--
※ 来源:·日月光华 bbs.fudan.edu.cn·
Top
12 楼qevan(guodong)回复于 2003-09-02 13:45:11 得分 4
发信人: qevan (开学就颓废了), 信区: Programming
标 题: 拦截你的Net Send (三) zz
发信站: 日月光华 (2003年09月02日13:32:09 星期二), 站内信件
发信人: zzzzzzzzzzzz (肥龟·Synchronize), 信区: Programming
标 题: 拦截你的Net Send (三)
发信站: 逸仙时空 Yat-sen Channel (Sun May 4 12:59:07 2003), 站内信件
作者:ZSQ
//QMessngr.cpp
#pragma comment(lib,"netapi32.lib")
#pragma comment(lib,"ws2_32.lib")
CQMessngr *CQMessngr::pseudoThis=NULL;
HWND CQMessngr::hWndNotify=NULL;
void ToNcbName(char* str1,char* str2)
{
char pattern[20];
sprintf(pattern,"%%%ds",NAME_LENGTH);
sprintf(str2,pattern,"\3");
memcpy(str2,str1,strlen(str1));
}
CQMessngr::CQMessngr()
{
//成员变量初始化
WSADATA wsadata;
char name[NAME_LENGTH];
WSAStartup(MAKEWORD(2,0),&wsadata);
gethostname(name,NAME_LENGTH);
_tcsupr(name);
strcpy(m_sLocalName,name);
strcpy(m_sRemoteName,"*");
strcpy(m_sMsg,"");
//NETBIOS初始化
NCB ncb;
memset( &ncb, 0, sizeof(ncb) );
ncb.ncb_command = NCBRESET;
int b=Netbios( &ncb );
char ncbname[NAME_LENGTH];
ToNcbName(m_sLocalName,ncbname);
ncb.ncb_command = NCBADDNAME;
memcpy((char*)ncb.ncb_name,ncbname,NAME_LENGTH);
b=Netbios(&ncb);
if (b==NRC_DUPNAME) {
MessageBox(NULL,"Messngr端口发现重名,初始化失败","警告",MB_O
K);
return;
}else if (b!=0) {
MessageBox(NULL,"Messngr未知错误,初始化失败","警告",MB_OK);
}
}
CQMessngr::~CQMessngr()
{
NCB ncb;
char ncbname[NAME_LENGTH];
memset( &ncb, 0, sizeof(ncb) );
ToNcbName(m_sLocalName,ncbname);
ncb.ncb_command = NCBDELNAME;
memcpy((char*)ncb.ncb_name,ncbname,NAME_LENGTH);
int b=Netbios( &ncb );
}
//发送函数
BOOL CQMessngr::Send(char* sTo,char* sMsg)
{
NCB ncb;
char ncbname[NAME_LENGTH];
int bRet;
memset( &ncb, 0, sizeof(ncb) );
ToNcbName(m_sLocalName,ncbname);
memcpy((char*)ncb.ncb_name,ncbname,16);
ToNcbName(sTo,ncbname);
memcpy((char*)ncb.ncb_callname,ncbname,16);
ncb.ncb_command = NCBCALL;
bRet=Netbios( &ncb);
// memset(buffer,0,sizeof(buffer));
memset(m_sBuffer,0,sizeof(m_sBuffer));
sprintf((char*)m_sBuffer,"%c%s%c",0xff,"SMB",0xD0);
unsigned char *pos=m_sBuffer+0x21;
int Length=7+strlen(m_sLocalName)+strlen(sTo)+strlen(sMsg);
*((WORD*)pos)=Length;
pos+=2;
*(pos++)=4; //TYPE
strcpy((char*)pos,m_sLocalName); //MACHINENAME
pos+=strlen(m_sLocalName)+1;
*(pos++)=4; //TYPE
strcpy((char*)pos,sTo); //MACHINENAME
pos+=strlen(sTo)+1;
*(pos++)=1;
*((WORD*)pos)=strlen(sMsg);
pos+=2;
memcpy(pos,sMsg,strlen(sMsg));
ncb.ncb_buffer=m_sBuffer;
ncb.ncb_length=Length+0x23;
ncb.ncb_command = NCBSEND;
bRet=Netbios( &ncb);
ncb.ncb_command = NCBRECV;
ncb.ncb_buffer=m_sBuffer;
ncb.ncb_length=MAX_BUFFER_LENGTH;
bRet=Netbios(&ncb);
ncb.ncb_command = NCBHANGUP;
bRet=Netbios(&ncb);
return TRUE;
}
//初始化NETBIOS功能,启动消息接收线程
//参数:HWND 接收消息的窗口句柄,
//收到消息后会发送WM_MESSENGER_NOTIFY到该窗口
int CQMessngr::Start(HWND hwnd)
{
pseudoThis=this;
hWndNotify=hwnd;
m_pThread=AfxBeginThread(MsgMonitorProc,NULL);
return TRUE;
}
int CQMessngr::Stop()
{
TerminateThread(m_pThread->m_hThread,0);
return 0;
}
//线程函数
UINT CQMessngr::MsgMonitorProc(LPVOID param)
{
NCB ncb;
char ncbname[NAME_LENGTH];
int bRet;
while (TRUE)
{
////////////LISTEN ON NAME STUB//////////////
memset( &ncb, 0, sizeof(ncb)
);
ToNcbName(pseudoThis->m_sLocalName,ncbname);
memcpy((char*)ncb.ncb_name,ncbname,NAME_LENGTH);
strcpy((char*)ncb.ncb_callname,"*");
ncb.ncb_command = NCBLISTEN;
bRet=Netbios( &ncb);
//RECEIVE THE NETBIOS BLOCK WHICH CONTAINING SMB DATA//
ncb.ncb_command = NCBRECV;
ncb.ncb_buffer=pseudoThis->m_sBuffer;
ncb.ncb_length=MAX_BUFFER_LENGTH;
bRet=Netbios(&ncb);
////////////SEND NETBIOS ACK/////////////////
pseudoThis->m_sBuffer[33]=0;
ncb.ncb_length=REPLY_LENGTH;
ncb.ncb_command = NCBSEND;
bRet=Netbios(&ncb);
///////////PARSE THE SMB PACKET//////////////
//SMB Structure
//TYPE 1 byte 04 Name
//REMOTEMACHINENAME string terminate with '\0'
//TYPE 1 byte 04 Name
//LOCALMACHINENAME string terminate with '\0'
//TYPE 1 byte 01 Message
//LENGTH 2 byte
//DATA string with the Length indicate in LENGTH
unsigned char* pos=pseudoThis->m_sBuffer+SMB_HEADER_LENGTH+1;
strcpy(pseudoThis->m_sRemoteName,(char*)pos);
pos+=strlen((char*)pos)+2;
pos+=strlen((char*)pos)+2;
WORD MsgLength=*((WORD*)pos);
pos+=2;
memset(pseudoThis->m_sMsg,0,sizeof(pseudoThis->m_sMsg));
memcpy(pseudoThis->m_sMsg,(char*)pos,MsgLength);
*(pseudoThis->m_sMsg+MsgLength)=0;
////////////POST A MESSAGE TO TH E NOTIFY WINDOW//////////
PostMessage(hWndNotify,WM_QMESSNGR_NOTIFY,NULL,NULL);
}
return 0;
}
(待续)
--
● 我的愿望很简单 ●
┏━━━━━━━━━━┓
┃ ①我的朋友快乐 ┃
┃ ┃
┃ ②自己快乐 ┃
┗━━━━━━━━━━┛
※ 来源:.逸仙时空 Yat-sen Channel bbs.zsu.edu.cn.[FROM: 192.168.50.34]
※ 修改:.zzzzzzzzzzzz 于 May 4 13:02:55 修改本文.[FROM: 192.168.50.34]
--
※ 来源:·日月光华 bbs.fudan.edu.cn·
Top
13 楼qevan(guodong)回复于 2003-09-02 13:46:15 得分 4
发信人: qevan (开学就颓废了), 信区: Programming
标 题: 拦截你的Net Send(一) zz
发信站: 日月光华 (2003年09月02日13:30:11 星期二), 站内信件
发信人: zzzzzzzzzzzz (肥龟·Synchronize), 信区: Programming
标 题: 拦截你的Net Send(一)
发信站: 逸仙时空 Yat-sen Channel (Sun May 4 12:51:26 2003), 站内信件
作者:ZSQ
大家应该会经常收到一些骚扰的Net Send消息,有没有想过怎么实现消息过滤呢?
有没有想过为net send 定制一个pp一点的界面呢,或者利用Net Send 做一个聊天室
呢?
归结到最后,我们发现问题的关键在于,如何替换掉Windows Net Send 服务
如果大家注意一下nbtstat 的输出,就会发现
NetBIOS Remote Machine Name Table
Name Type Status
--------------------------------------------
ZSQ <00> UNIQUE Registered
CHINA <00> GROUP Registered
ZSQ <20> UNIQUE Registered
ZSQ <03> UNIQUE Registered
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~这个就是Net Send 用的Stub
CHINA <1E> GROUP Registered
ZSQ <01> UNIQUE Registered
类似于Socket中端口, 所有的Net Send 消息,都是通过这个位置传到你的计算机的
所以我们的第一个任务就是要先把这个端口关闭,然后用我们自己的服务来替换掉它
命令行方式的net stop msg 可以把整个消息服务关闭
只要我们写的程序沿用消息服务的协议,就可以完全地替换掉它的功能了
(待续)
--
※ 来源:·日月光华 bbs.fudan.edu.cn·
Top
14 楼lw549(那个孩子他爹)回复于 2003-09-02 13:50:41 得分 0
go onTop
15 楼lw549(那个孩子他爹)回复于 2003-09-02 16:14:36 得分 0
正在等待另一个答案
http://www.experts-exchange.com/Programming/Programming_Languages/Delphi/Q_20726219.html
那些代码都是c++的,我没有bcbTop
16 楼bphoenix(吸血凤凰)回复于 2003-09-02 17:34:49 得分 4
同意qevan(guodong)的做法,我就是利用这种方法自己写了套WEB SERVER出来的Top
17 楼lw549(那个孩子他爹)回复于 2003-09-03 09:14:48 得分 0
朋友们有没有Delphi的代码,谢了。Top
18 楼CloneCenter(复制中心)回复于 2003-09-03 09:39:47 得分 4
不知道怎么做,想法和其他几位也一样,帮你顶吧!Top
19 楼romandion(罗蒙迪翁)回复于 2003-09-06 01:16:40 得分 4
想请教qevan 一个问题
在windows 2000 下,使用你的这个接收程序,可以接收到别人机器发来的net send 消息吗
如果也要是用你的send 方法,似乎没有什么用!Top
20 楼IORILI(眼镜)回复于 2003-09-09 15:30:22 得分 4
俺也不会,帮你upTop
21 楼xiaofei7569(夏雁)回复于 2003-09-12 11:59:32 得分 4
好方法。Top
22 楼nyf1220(我是党员----不过听说最近风声紧,打算换名字)回复于 2003-09-12 12:07:30 得分 4
看不懂Top
23 楼hare007(hare)回复于 2003-09-13 14:45:06 得分 4
markTop
24 楼bluenightsky()回复于 2003-09-15 13:38:58 得分 4
markTop
25 楼dawnming(笨小孩)回复于 2003-09-15 14:25:04 得分 4
markTop
26 楼asbeforelong(martin)回复于 2003-09-16 00:40:35 得分 4
不让信使服务弹出信息那就关掉俄~~~~~~~~~~~~~~~~~
Control Panel->Administrative Tools->Services->Messager->Stop
如果实在没有需要信使服务,感觉这个办法比较好用.
Top
27 楼yanhuizen(星河谷)回复于 2003-09-18 01:54:14 得分 4
关注!Top
28 楼lw549(那个孩子他爹)回复于 2003-09-18 16:15:16 得分 0
等了n久,算了,散分。Top
29 楼lw549(那个孩子他爹)回复于 2003-09-20 17:38:46 得分 0
改了昵称,测试一下,呵呵。Top




