需要自己开发ndis, 但现在没时间做, 只有请坛子里的朋友帮忙了.我说话算话, 500相送。事后再开4帖结帐。

解决方案 »

  1.   

    http://expert.csdn.net/Expert/topic/2238/2238340.xml?temp=.4278833
      

  2.   

    ping的程序在
    http://www.vckbase.com/code/   里有看到源代码到那里找找
      

  3.   

    ping的源码好简单, 但探测和阻塞ICMP包的源码就难了.
      

  4.   

    看看这个:http://www.vckbase.com/document/viewdoc.asp?id=652再谈突破TCP-IP过滤/防火墙进入内网(icmp篇)
    作者:TOo2y 一 现状
    二 ICMP协议转发数据报原理
    三 QQicmp工作流程
    四 QQicmp代码分析
    五 小结
    六 QQicmp源代码 
      

  5.   

    DDK里面有个源码,自己修改不了多少就可实现了
      

  6.   

    wwww2() :
    请给出url, 急, 谢谢!
      

  7.   

    看看这个可不可以
    #include <windows.h>
    #include <winsock.h>
    #include <stdio.h>
    #include <string.h>typedef struct tagIPINFO
    {
     u_char Ttl;    // Time To Live
     u_char Tos;    // Type Of Service
     u_char IPFlags;   // IP flags
     u_char OptSize;   // Size of options data
     u_char FAR *Options; // Options data buffer
    }IPINFO, *PIPINFO;typedef struct tagICMPECHO
    {
     u_long Source;   // Source address
     u_long Status;   // IP status
     u_long RTTime;   // Round trip time in milliseconds
     u_short DataSize;  // Reply data size
     u_short Reserved;  // Unknown
     void FAR *pData;  // Reply data buffer
     IPINFO ipInfo;   // Reply options
    }ICMPECHO, *PICMPECHO;
    // ICMP.DLL Export Function Pointers
    HANDLE (WINAPI *pIcmpCreateFile)(VOID);
    BOOL (WINAPI *pIcmpCloseHandle)(HANDLE);
    DWORD (WINAPI *pIcmpSendEcho)
     (HANDLE,DWORD,LPVOID,WORD,PIPINFO,LPVOID,DWORD,DWORD);//
    //
    void main(int argc, char **argv)
    {
     WSADATA wsaData;   // WSADATA
     ICMPECHO icmpEcho;   // ICMP Echo reply buffer
     HANDLE hndlIcmp;   // LoadLibrary() handle to ICMP.DLL
     HANDLE hndlFile;   // Handle for IcmpCreateFile()
        LPHOSTENT pHost;   // Pointer to host entry structure
        struct in_addr iaDest;  // Internet address structure
     DWORD *dwAddress;   // IP Address
     IPINFO ipInfo;    // IP Options structure
     int nRet;     // General use return code
     DWORD dwRet;    // DWORD return code
     int x; // Check arguments
     if (argc != 2)
     {
      fprintf(stderr,"\nSyntax: pingi HostNameOrIPAddress\n");
      return;
     } // Dynamically load the ICMP.DLL
     hndlIcmp = LoadLibrary("ICMP.DLL");
     if (hndlIcmp == NULL)
     {
      fprintf(stderr,"\nCould not load ICMP.DLL\n");
      return;
     }
     // Retrieve ICMP function pointers
     pIcmpCreateFile = (HANDLE (WINAPI *)(void))
      GetProcAddress(hndlIcmp,"IcmpCreateFile");
     pIcmpCloseHandle = (BOOL (WINAPI *)(HANDLE))
      GetProcAddress(hndlIcmp,"IcmpCloseHandle");
     pIcmpSendEcho = (DWORD (WINAPI *)
      (HANDLE,DWORD,LPVOID,WORD,PIPINFO,LPVOID,DWORD,DWORD))
      GetProcAddress(hndlIcmp,"IcmpSendEcho");
     // Check all the function pointers
     if (pIcmpCreateFile == NULL  || 
      pIcmpCloseHandle == NULL ||
      pIcmpSendEcho == NULL)
     {
      fprintf(stderr,"\nError getting ICMP proc address\n");
      FreeLibrary(hndlIcmp);
      return;
     } // Init WinSock
     nRet = WSAStartup(0x0101, &wsaData );
        if (nRet)
        {
            fprintf(stderr,"\nWSAStartup() error: %d\n", nRet); 
            WSACleanup();
      FreeLibrary(hndlIcmp);
            return;
        }
        // Check WinSock version
        if (0x0101 != wsaData.wVersion)
        {
            fprintf(stderr,"\nWinSock version 1.1 not supported\n");
            WSACleanup();
      FreeLibrary(hndlIcmp);
            return;
        } // Lookup destination
        // Use inet_addr() to determine if we're dealing with a name
        // or an address
        iaDest.s_addr = inet_addr(argv[1]);
        if (iaDest.s_addr == INADDR_NONE)
            pHost = gethostbyname(argv[1]);
        else
            pHost = gethostbyaddr((const char *)&iaDest, 
                            sizeof(struct in_addr), AF_INET);
     if (pHost == NULL)
     {
      fprintf(stderr, "\n%s not found\n", argv[1]);
            WSACleanup();
      FreeLibrary(hndlIcmp);
      return;
     } // Tell the user what we're doing
     printf("\nPinging %s [%s]", pHost->h_name,
       inet_ntoa((*(LPIN_ADDR)pHost->h_addr_list[0]))); // Copy the IP address
     dwAddress = (DWORD *)(*pHost->h_addr_list); // Get an ICMP echo request handle        
     hndlFile = pIcmpCreateFile();
     for (x = 0; x < 4; x++)
     {
      // Set some reasonable default values
      ipInfo.Ttl = 255;
      ipInfo.Tos = 0;
      ipInfo.IPFlags = 0;
      ipInfo.OptSize = 0;
      ipInfo.Options = NULL;
      //icmpEcho.ipInfo.Ttl = 256;
      // Reqest an ICMP echo
      dwRet = pIcmpSendEcho(
       hndlFile,  // Handle from IcmpCreateFile()
       *dwAddress,  // Destination IP address
       NULL,   // Pointer to buffer to send
       0,    // Size of buffer in bytes
       &ipInfo,  // Request options
       &icmpEcho,  // Reply buffer
       sizeof(struct tagICMPECHO),
       5000);   // Time to wait in milliseconds
      // Print the results
      iaDest.s_addr = icmpEcho.Source;
      printf("\nReply from %s  Time=%ldms  TTL=%d",
        inet_ntoa(iaDest),
        icmpEcho.RTTime,
        icmpEcho.ipInfo.Ttl);
      if (icmpEcho.Status)
      {
       printf("\nError: icmpEcho.Status=%ld",
        icmpEcho.Status);
       break;
      }
     }
     printf("\n");
     // Close the echo request file handle
     pIcmpCloseHandle(hndlFile);
     FreeLibrary(hndlIcmp);
     WSACleanup();
    }
      

  8.   

    很简单, 只需要探测ICMP echo request就可以了, 探测到后弹出一个报警消息框就行了.
    你多久能做好, 最好快点, 我保证你今晚发源码给我明天你的专家分就可多500!
      

  9.   

    自己看DDK中的例子passthru,改动不到20行代码就可以搞定了。再说了,这种东西用分是很难买的。
      

  10.   

    emmyjeff(jeff) :
          Thanks a lot ,Check it out!
      

  11.   

    这是五贴, 共500分 , 再次感谢!
    http://expert.csdn.net/Expert/topic/2276/2276355.xml?temp=.1394464
    http://expert.csdn.net/Expert/topic/2276/2276360.xml?temp=.540951
    http://expert.csdn.net/Expert/topic/2276/2276364.xml?temp=.4398462
    http://expert.csdn.net/Expert/topic/2276/2276372.xml?temp=5.776614E-02
    http://expert.csdn.net/Expert/topic/2276/2276374.xml?temp=.3336145