发送消息很简单,一个命令就可以了,但怎样可以编程接收net send发出的消息?(就是替换messenger服务)最好有源代码,可以发到我
解决方案 »
- 请教MFC中位图做半透明的方法,可以调节透明度
- VC++2005中,往串口发数据的问题,数据量一大,串口就收到部分数据,为什么?
- 请教个问题,关于IDispatch到IOleObject
- 请教高手,怎样在 Microsoft Web浏览器 载入的网页的各个文本框中填上值,然后提交?
- 一个不太引人注意,但又很重要的问题:如何知道维持一个TCP连接,所需系统资源
- 本人参加外语考试后,准考证却丢了,现在无法查分。目前想了一个方法:利用程序自动改变查询网页上的文本框的值(内容是准考证号),然后
- 快救命!!请问如何在一个线程中NEW窗口???
- 求助 IE每次打开提示ActiveX 交互不安全
- 关于VK_1的问题.
- [100分] Socket发送的内容长度不确定,信息结构应该怎么设计?
- 有关MDI文档打开文件的问题
- 哎,弄不清楚原因的内存泄漏。
http://skyfire.dns0755.net/newweb/list.asp?id=162
// hookapi.cpp : Defines the entry point for the DLL application.
//#include "stdafx.h"
typedef DWORD (WINAPI *MYFUN1)(HWND, unsigned short * , unsigned short * , UINT);
typedef DWORD (WINAPI *MYFUN2)(HWND, unsigned short * , unsigned short * , UINT, DWORD,DWORD);#pragma data_seg("mydata") __declspec( dllexport )HMODULE hdll=NULL;
__declspec( dllexport )
DWORD RecText[200]= { NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,
NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,
NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,
NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,
NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,
NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,
NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,
NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,
NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,
NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,
NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,
NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,
NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,
NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,
NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,
NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,
NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,
NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,
NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,
NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL};
#pragma data_seg()HANDLE hDSMutex;
HANDLE hDSMutexIn;
FARPROC pfMessageBoxW;
int WINAPI MyMessageBoxW(HWND hWnd, unsigned short * lpText,unsigned short * lpCaption, UINT uType );
int WINAPI MyMessageBoxTimeOutW(HWND hWnd, unsigned short * lpText,unsigned short * lpCaption, UINT uType ,DWORD una,DWORD unb);
BYTE OldMessageBoxWCode[5],NewMessageBoxWCode[5];
DWORD dwIdOld,dwIdNew;
BOOL bHook=false;
void HookOn();
void HookOff();
BOOL init();
BOOL APIENTRY DllMain( HANDLE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
if (ul_reason_for_call==DLL_PROCESS_ATTACH)
init();
if (ul_reason_for_call==DLL_PROCESS_DETACH && bHook)
{
HookOff();
CloseHandle(hDSMutex);
CloseHandle(hDSMutexIn);
}
return TRUE;
}BOOL init()//初始化得到MessageBoxA的地址,并生成Jmp XXX(MyMessageBoxA)的跳转指令
{
hDSMutex=CreateEvent(NULL,FALSE,FALSE,_TEXT("DSCHAT"));
hDSMutexIn=CreateEvent(NULL,FALSE,TRUE,_TEXT("DSCHATIN"));
hdll=GetModuleHandle(_TEXT("hookapi.dll"));
BYTE* temhookapi;
HMODULE hModule=LoadLibrary(_TEXT("user32.dll"));
if ( (GetVersion()&0x0000ffff) > 5 )
{
temhookapi = (BYTE*)MyMessageBoxTimeOutW;
pfMessageBoxW=GetProcAddress(hModule,(char *)0x000001e3);
}
else
{
temhookapi = (BYTE*)MyMessageBoxW;
pfMessageBoxW=GetProcAddress(hModule,"MessageBoxW");
}
if(pfMessageBoxW==NULL)
return false;
_asm
{
lea edi,OldMessageBoxWCode
mov esi,pfMessageBoxW
cld
movsd
movsb
}
NewMessageBoxWCode[0]=0xe9;//jmp MyMessageBoxA的相对地址的指令
temhookapi++;
DWORD* tenhookapi = (DWORD *)temhookapi;
DWORD addHookapi = tenhookapi[0];
addHookapi += (DWORD)temhookapi;
addHookapi --;
addHookapi -= (DWORD)pfMessageBoxW;
temhookapi = (BYTE*)NewMessageBoxWCode;
temhookapi++;
tenhookapi = (DWORD *)temhookapi;
tenhookapi[0] = addHookapi;
dwIdNew=GetCurrentProcessId(); //得到所属进程的ID
dwIdOld=dwIdNew;
HookOn();//开始拦截
return(true);
}int WINAPI MyMessageBoxW(HWND hWnd, unsigned short * lpText,unsigned short * lpCaption, UINT uType )//首先关闭拦截,然后才能调用被拦截的Api 函数
{
int nReturn=IDOK;
DWORD* ca = (DWORD*)lpCaption;
if ( ca[0] == 0x4f7f4fe1)
{
WaitForSingleObject(hDSMutexIn,INFINITE);
lstrcpy(LPTSTR(RecText),lpText);
SetEvent(hDSMutex);
//PostMessage(rjhwnd,WM_COMMAND,9007,00);
//GetLastError();
}
else
{
HookOff();
nReturn=((MYFUN1)pfMessageBoxW)(hWnd,lpText,lpCaption,uType);
HookOn();
}
return(nReturn);
}
int WINAPI MyMessageBoxTimeOutW(HWND hWnd, unsigned short * lpText,unsigned short * lpCaption, UINT uType ,DWORD una,DWORD unb)//首先关闭拦截,然后才能调用被拦截的Api 函数
{
int nReturn=IDOK;
DWORD* ca = (DWORD*)lpCaption;
if ( ca[0] == 0x4f7f4fe1)
{
WaitForSingleObject(hDSMutexIn,INFINITE);
lstrcpy(LPTSTR(RecText),lpText);
SetEvent(hDSMutex);
//PostMessage(rjhwnd,WM_COMMAND,9007,00);
//GetLastError();
}
else
{
HookOff();
nReturn=((MYFUN2)pfMessageBoxW)(hWnd,lpText,lpCaption,uType,una,unb);
HookOn();
}
return(nReturn);
}void HookOn()
{
HANDLE hProc;
dwIdOld=dwIdNew;
hProc=OpenProcess(PROCESS_ALL_ACCESS,0,dwIdOld);//得到所属进程的句柄
VirtualProtectEx(hProc,pfMessageBoxW,5,PAGE_READWRITE,&dwIdOld);//修改所属进程中MessageBoxA的前5个字节的属性为可写
WriteProcessMemory(hProc,pfMessageBoxW,NewMessageBoxWCode,5,0);//将所属进程中MessageBoxA的前5个字节改为JMP 到MyMessageBoxA
VirtualProtectEx(hProc,pfMessageBoxW,5,dwIdOld,&dwIdOld);//修改所属进程中MessageBoxA的前5个字节的属性为原来的属性
bHook=true;
}
void HookOff()//将所属进程中JMP MyMessageBoxA的代码改为Jmp MessageBoxA
{
HANDLE hProc;
dwIdOld=dwIdNew;
hProc=OpenProcess(PROCESS_ALL_ACCESS,0,dwIdOld);
VirtualProtectEx(hProc,pfMessageBoxW,5,PAGE_READWRITE,&dwIdOld);
WriteProcessMemory(hProc,pfMessageBoxW,OldMessageBoxWCode,5,0);
VirtualProtectEx(hProc,pfMessageBoxW,5,dwIdOld,&dwIdOld);
bHook=false;
}
作者:伍光平下载源代码 在VC知识库我学到了很多知识,很短的时间我就掌握了vc,主要是在贵站下了很多源代码回来分析,学习。看了你处有人将net send封装进行消息群发的源代码,有看见网上某某公司消息群发软件要花钱才能购买,于是有感自己编写一个消息群发小程序。 特点:
vc源代码,基于IP/UDP协议的sock编程,按messager 服务的通信协议填写UDP数
据包,可在没有net send命令的win98 win95下实现消息发送,代码里含有messager 的通
信协议。并支持文本内容,ASCII文本图象发送。做广告很不错。在消息显示中可屏蔽自
己的主机名。
win2000/xp默认开着信使服务(messager),端口是135,网络通信方式采用ip/udp协议。一般这种服务使用于局域网,如果用代理就可绕过网关将消息发出去。
我们先来分析一下ip数据包的结构吧。 一个符合信使服务的数据包前面加上udp包头(8字节),就构成了udp包。udp包前面加上20个字节的ip包头,就构成了ip包。既是ip包里前28个字节是网络协议,从第29字节开始才是messager所接受的内容。以下简称消息包,消息包前80个字节为消息包头,当中第41到44字节为长整型变量,存放发送时间,第75到78字节为长整型,存放整个消息包-消息包头的大小。接下来3个域,每个域头大小12个字节,前4个和后4个字节(长整型)都为该域的大小(分配大小取偶),第一个域表示发送主机名,第二个表示接受主机名,第三个表示内容。*/|=====20======|====8====|=========80============|=12=|from|=12=|to|=12=| 消息 ///////////////////////////////////////////////////////////////////////
直接采用socket udp协议,发送消息无法隐藏自己的ip,别人用网络工具可查到你
的ip,如果前28个字节都自己加工,采用原始套接字方式进行发送,伪装了ip,不怕
查ip;^_^!
NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,
NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,
NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,
NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,
NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,
NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,
NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,
NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,
NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,
NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,
NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,
NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,
NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,
NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,
NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,
NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,
NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,
NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,
NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL};
为什么这样写?不累吗??
我宁愿用zeromemory或memset,再说直接DWORD RecText[200]={0};应该也可以吧?