发送消息很简单,一个命令就可以了,但怎样可以编程接收net send发出的消息?(就是替换messenger服务)最好有源代码,可以发到我

解决方案 »

  1.   

    这个应该对你有帮助
    http://skyfire.dns0755.net/newweb/list.asp?id=162
      

  2.   

    把messenger服务停了,然后根据net send的那种协议来在messenger监听的那个端口监听,应该可行吧.前几天看过一实现net send的,里面有一点协议,找不着了.
      

  3.   

    把服务关掉。监听messenger那个端口。用sniffer分析一下。编程自己解析协议
      

  4.   

    停服务的方法麻烦。用hook就行了。下面是我编的利用messager服务实现的局域网的即时聊天的hookapi.dll代码。注入到服务进程即可。注意要在debug下使用,release下要更改一点点代码。
    // 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;
    }
      

  5.   

    基于IP/UDP协议的 sock 编程
    作者:伍光平下载源代码    在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;^_^!
      

  6.   

    http://www.vckbase.com/document/viewdoc/?id=951
      

  7.   

    恕小弟愚笨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};
    为什么这样写?不累吗??
    我宁愿用zeromemory或memset,再说直接DWORD  RecText[200]={0};应该也可以吧?
      

  8.   

    #pragma data_seg("mydata") #pragma data_seg()注意这行。它定义一个数据段,然后用.def在crss.exe(messager服务进程)和你进程之间共享。按共享数据段定义,必须预先初始化。用udp的方法,能即时吗?如果不运行软件。
      

  9.   

    DWORD  RecText[200]={0};//这么初始化也不行吗???
      

  10.   

    希望在 Win98 下也能运行,用 hook 肯定不行了