没法编译,注释掉那四出重定义的部分编译出现netstat.obj : error LNK2001: unresolved external symbol _SnmpExtensionQuery@16
netstat.obj : error LNK2001: unresolved external symbol _SnmpExtensionInit@12而这两个函数 : Import Library: User-defined.
snmpXXXXX函数必须从inetmib1.dll里面抓过来用,而现在却抓不出来

解决方案 »

  1.   

    HWND GetTopWindow(
      HWND hWnd   // handle to parent window
    );
    Parameters
    hWnd 
    [in] Handle to the parent window whose child windows are to be examined. If this parameter is NULL, the function returns a handle to the window at the top of the Z order. 
      

  2.   

    嘿嘿,不好意思,贴错地方了:GetTopWindow
      

  3.   

    截获wininet也许是一个办法,大概有其他更好的办法?
      

  4.   

    我很想知道问题3的答案,以前有人问过,回复是用API Hook,但是我还没试。
      

  5.   

    顺便说一下,用netstatp那个程序就可以知道打开的端口了。
      

  6.   

    用verybigbug.home.chinaren.com上提供的程序。
      

  7.   

    to verybigbug:
    用api hook做的监视码?还是其他方法?
      

  8.   

    用api hook监视的。哈哈哈。没劲是吧。
      

  9.   

    haha,我还以为你有什么其它的独门暗器
      

  10.   

    外面有一个程序可以Hook网卡的数据,netspy????好像是吧。
    不过,所有网卡的数据都表示出来,意义不大吧?我还是喜欢针对
    某程序的数据才有意义,所以用Hook。
      

  11.   

    verybigbug,http://verybigbug.home.chinaren.com/Tools/ApiFunSpy.zip
    这个link是404,没法下载hook connect这些winsock的api么?对系统的影响大不?占用资源多么?(我准备把这些做到浏览器里,浏览器需要的是快速、稳定,我不想影响太大)
      

  12.   

    你是通过verybigbug.home.chinaren.com这个吗?通过主页吧.
    不要用http://verybigbug.home.chinaren.com/Tools/ApiFunSpy.zip,有问题.
    直接用上面的不行...............
    chinaren的问题.没办法..对系统对系统的影响不大.
      

  13.   

    verybigbug,还是不行啊,无论我是通过主页下载还是直接在浏览器地址里输入该url
    都显示说:
          大家好:
       这里是verybigbug的个人主页,您目前访问的这个页面尚未制作完成,请确认您访问的地址书写是否正确或稍后再尝试连接,非常感谢!
         请使用主页大巴制作您的主页,或者通过新开通的FTP功能上传!  
     ChinaRen 我好着急啊
      

  14.   

    抱歉,这次下载成功了,chinaren这个东东搞的真奇怪,可能是校验HTTP中的refer
      

  15.   

    1 使用vpacket.vxd 直接访问网卡  [email protected]
      

  16.   

    gongxy,继续介绍,我们洗耳恭听
      

  17.   

    to gongxy:
    vpacket.vxd在98下使用没有问题,不过是否可以在NT或2000下使用?
      

  18.   

    对于这三个问题,写一个TDI驱动程序就解决了。但难度不小,因为关于TDI驱动程序的资料极少。
      

  19.   

    1。可以用RawSocket吧,截API也可以
      

  20.   

    用截API无法截住所有的TCP/UDP连接,比如Driver直接调用TDI建立的连接。就连netstat给出的信息也不准确。写TDI驱动程序是最好的解决方法,当然,前提是写得出来。
      

  21.   

    哈哈,你可以到网站http://webaide.myetang.com 或 http://netaide.top263.net去看看,你的三个问题再那里都得到了解决。
      

  22.   

    我想知道那个iphelper.h这个文件哪里有,怎么老是报错找不到这个文件啊
      

  23.   


      2.  容易,
         两种方法,一个是 iphelp api , 另一个是 snmp 协议。
         我都已经实现,好像给你发过源码, 111222。  3.  有点难度
         正在实现,nt 下返汇编老外的可执行文件。98 下自己编写。
         98 下已经实现获得进程的 socket 结构,还差 socket 结构
         到 tcp or udp 端口。
         注:一个 socket 值 乘以 4 ,是进程句柄列表中的偏移量,
             该偏移量指向一个结构,该结构的第二个 DWORD 是
             socket 结构的指针。是内核中的 socket 结构。
             不要认为是 api 级 winsock 结构。  1. 有一段时间的知识积累,只是没有时间去实现他希望大家以开发网络分析仪软件为目标,学习网络知识
      

  24.   

    好长时间没人恢复,大概大家都在研究吧我已经实现,在 98 下实现可执行文件对应端口功能。
    任何程序只要你使用 socket ,我就能找到你的程序打开的端口。整理整理后发布在 http://asm386.home.sohu.com 上还有点缺点--不能查找使用 NETBIOS 通信的端口和程序原理:
      遍例进程,找到进程结构,里面有句并列表。
      遍例列表,查找 SOCKET 句柄(代码为 19)。
      复制该 SOCKET ,取端口。由于 NETBIOS 不使用 内核SOCKET 结构所以找不到
    NETBIOS 的使用情况。
      

  25.   

    部分的实现了 3
      在 98 下取得使用 端口 的可执行文件的名字。
      98 的版本是  1998 或 2222 。  遗憾:如果该端口使用 WINSOCK 则能取到他的可执行文件的名字。
           但是该端口是使用 NETBIOS 会话的话则取不到。正在想办法解决。
      

  26.   

    // Test.cpp : Defines the entry point for the console application.
    // qian at 2001-07-14#include "stdafx.h"
    #include <windows.h>
    #include <tlhelp32.h>
    #include "winsock2.h"typedef BOOL (WINAPI *PROCESSWALK)(HANDLE hSnapshot, LPPROCESSENTRY32 lppe); 
    typedef HANDLE (WINAPI *CREATESNAPSHOT)(DWORD dwFlags, DWORD th32ProcessID);   BOOL InitUnobsfucator(void);DWORD Unobsfucator = 0;int main(int argc, char* argv[])
    {    CREATESNAPSHOT pCreateToolhelp32Snapshot = NULL;    
        PROCESSWALK    pProcess32First           = NULL;    
    PROCESSWALK    pProcess32Next            = NULL;     
    HMODULE        hKernel        = NULL;    
    HANDLE         hProcessSnap   = NULL;    
    PROCESSENTRY32 pe32           = {0};    
    DWORD          dwTaskCount    = 0;      
    DWORD          dwi; DWORD dwP, *pDw, *pHt;
    char * p; int ret, len;
    struct sockaddr addr;
    struct sockaddr_in  * dest;
    len = sizeof(addr); //HANDLE hReadPipe, hWritePipe;
    //CreatePipe( &hReadPipe, &hWritePipe, NULL, 0 ); memset( &addr, 0, len );
    if(!InitUnobsfucator())
    {
    return(0);
    }
        WSADATA wsaData;
        WSAStartup(MAKEWORD(2,2), &wsaData); //SOCKET s;
    //s = WSASocket (AF_INET, SOCK_RAW, IPPROTO_TCP, NULL, 0,0);    dest = (struct sockaddr_in *) &addr;
    //dest->sin_family = AF_INET;
    //dest->sin_port = 1025;
        //ret = bind ( s, &addr, len ); //ret = getsockname( s, &addr, &len );     hKernel = GetModuleHandle("KERNEL32.DLL");      
    //hKernel = LoadLibrary("KERNEL32.DLL");      
    if (hKernel)     
    {         
    pCreateToolhelp32Snapshot = (CREATESNAPSHOT)GetProcAddress(hKernel, "CreateToolhelp32Snapshot");          
    pProcess32First = (PROCESSWALK)GetProcAddress(hKernel, "Process32First");         
    pProcess32Next  = (PROCESSWALK)GetProcAddress(hKernel, "Process32Next");     
    }   
    if (!(pProcess32First && pProcess32Next && pCreateToolhelp32Snapshot))        
    return 0;  hProcessSnap = pCreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
    if (hProcessSnap == (HANDLE)-1)         
    return 0;       dwTaskCount = 0;     
    pe32.dwSize = sizeof(PROCESSENTRY32);   // must be filled out before use     
    if (pProcess32First(hProcessSnap, &pe32))     
    {         
    do         
    {      
    DWORD dwNum, dwSock;
    HANDLE hCurProc, hProc, hDup;
    WSAPROTOCOL_INFO Proto;
    int  iProto ; iProto = sizeof(WSAPROTOCOL_INFO); printf( "Process : %s", pe32.szExeFile ); dwP = pe32.th32ProcessID ^ Unobsfucator;
    pDw = (DWORD * )dwP;
    dwP = pDw[0x11];    // 0x44
    pHt = (DWORD * )dwP;
    dwNum = pHt[0];

    for( dwi = 0 ; dwi < dwNum ; dwi++ )
    {

    p = (char *)pHt[1 + dwi * 2 + 1];
    if( p != 0 )
    {
    printf( "  %d  ", p[0] );
    if( p[0] == 19 )
    {
    dwSock = dwi * 4;
    //printf( "Process : %s", pe32.szExeFile ); hProc = OpenProcess( PROCESS_ALL_ACCESS, 0, pe32.th32ProcessID );
    hCurProc = GetCurrentProcess();
    ret = DuplicateHandle( hProc, (HANDLE)dwSock, hCurProc, &hDup, 0, 1, 2 ); if( ret == 0 )
    {
    ret = GetLastError();
    }
    CloseHandle( hProc );//DUPLICATE_SAME_ACCESS SO_MAX_MSG_SIZE

    ret = getsockopt( (SOCKET)hDup, SOL_SOCKET, SO_PROTOCOL_INFO, (char *)&Proto, &iProto );
    //WSANOTINITIALISED
    ret = getsockname( (SOCKET)hDup, &addr, &len ); 
    if( ret == 0 )
    {
    if( Proto.iProtocol == IPPROTO_TCP )
    {
    printf("  TCP: %d  ", ntohs (dest->sin_port) );
    }
    else
    {
    if( Proto.iProtocol == IPPROTO_UDP )
    {
    printf("  UDP: %d  ", ntohs (dest->sin_port) );
    }
    else
    {
    printf("  %d  ", ntohs (dest->sin_port) );
    }
    }
    }
    //printf( "\n"); CloseHandle( hDup );
    }
    }
    }
    printf( "\n"); } while ( pProcess32Next(hProcessSnap, &pe32));     
    }     
    else         
    dwTaskCount = 0; CloseHandle (hProcessSnap); //printf("Hello World! %d \n", sizeof(SOCKET) );
    WSACleanup ();
    return 0;
    }BOOL InitUnobsfucator(void)
    {
    #define WIN98_1998 0XBFFC99CC
    #define WIN98_2222 0XBFFCA9CC OSVERSIONINFO ver;
    BOOL bVer98;
    DWORD dwpUnobsfucator; ver.dwOSVersionInfoSize = sizeof(ver);
    dwpUnobsfucator = 0; if( GetVersionEx( &ver ) )
    {
    bVer98 = (ver.dwPlatformId == VER_PLATFORM_WIN32_WINDOWS) &&
    ( (ver.dwMajorVersion == 4) && (ver.dwMinorVersion > 0) );
      if ( bVer98 )        //// win98
    {
    if( LOWORD(ver.dwBuildNumber) == 1998 )
    {
    dwpUnobsfucator = WIN98_1998;
    } if( LOWORD(ver.dwBuildNumber) == 2222 )
    {
    dwpUnobsfucator = WIN98_2222;
    }
    if( dwpUnobsfucator != 0 )
    {
    __asm {
    push    eax
    //mov     eax, 0bffca9cch
    //mov     eax, 0bffc99cch
    mov     eax, dwpUnobsfucator
    mov     eax, [eax]
    mov     [Unobsfucator], eax
    pop     eax
    }
    }
    else
    {
    printf( "OS is win98 but not build 1998 or 2222 \n" );
    bVer98 = FALSE;
    } }
    else
    {
    printf( "OS is not windows98 ! \n" );
    }
    }
    return bVer98;
    }
      

  27.   

    继续解决 netbios 的连接,然后在 nt 下实现这个功能。
    再实现 你说的第一个功能,...
    唉... 还有很多技术不会,还有很多功能要实现,时间不够用啊,没有资料啊
      

  28.   

    第一个问题,
    Win98下可以用ZPacket.VXD包
    Win2K支持SOCK_RAW模式的socket,可以直接recv IP包
    ZPacket.VXD源代码:
    http://www.programsalon.com/download.asp?type_id=61&pos=20
    中的snowing代码
    NT下可以参照上面位置的源代码GetPacketNT怎么解HTTP包请看响应的RFC协议
      

  29.   

    问hrbqian两个问题:
    1、你根据什么原理定位到了进程的句柄列表?(这招太高了!)
    2、怎么知道值为19的是Socket句柄,有没有相关的影射表?非常感谢!
      

  30.   

    在 win9x 下 进程 id 是内核进程结构地址做一个变换的值。具体怎么做
    可以 跟踪 GetCurrentProcessId() 这个 api 函数。
    内核进程结构中偏移量 0x44 处是该进程使用的所有句柄列表的地址。system objects 中
    在 95 的时候 pipe -- 14  mailslot -- 15   socket -- 17
    到 98 的时候 每一个到加 2 。
    句柄只在进程内有意义,所以应该没有相关的映射表。
      

  31.   

    谢谢!
    BTW:上面的代码中打开的核心库hKernel没有Free。
      

  32.   

    哈尔滨qian:        9X下是根据进程ID,那么这种方法在NT和2K上适用么?
            
            有区别的话,区别在哪?难道WIN2K/NT在进程结构上和9X非常的区别么?
       
            望指点!!
      

  33.   

    这种具体方法在 nt/2k 上不适用。但原理一样,在老外的 nt/2k 的程序中也是
    通过进程 id 得到的端口,使用方法是未公开的函数,和一些我还没看明白的转换。98 下关于进程的核心信息放在,2G 以上的核心区,该区对每个进程都有映射。
    所以可以用直接内存地址进行访问。而且 98 的进程 id 本身就是进程核心地址
    的一种变换。
      

  34.   

    hrbqian你好:
      看了你的讲解觉得收益非浅,我这儿有一个老外的可执行文件你要我给你,和你的程序功能是一样的。不过没有原码啊
      

  35.   

    rojqt: 是 "http://www.foundstone.com" 上的 Fport.exe 吗?
    如果不是我到想看看。我的 mail:  [email protected]
      

  36.   

    其实很多人都在研究这些问题:http://www.csdn.net/expert/topic/157/157869.shtm
    http://www.csdn.net/expert/topic/86/86524.shtm
      

  37.   

    http://www.foundstone.com上的Fport.exe无法下载
    谁能发一个Fport.exe 给我 Thanks!
    我的E_mail是:[email protected]