向所有机器发送ARP包,
在从返回包中的到MAC地址

解决方案 »

  1.   

    向每台机器发送ARP包,
    看返回包
      

  2.   

    使用NetBios的API函数,给我分的话,我可以详细说明.
      

  3.   

    这个问题已经问过号几次了。vc提供了两个类好像是ENUMNET之类汇编的到有:.386
    .model flat
    .const
    greet_message db ’Example win32 console program’,0Dh,0Ah,0Dh,0Ah,0
    error1_message db 0Dh,0Ah,’Could not get current user name’,0Dh,0Ah,0
    error2_message db 0Dh,0Ah,’Could not enumerate’,0Dh,0Ah,0
    good_exit_msg db 0Dh,0Ah,0Dh,0Ah,’Normal termination’,0Dh,0Ah,0
    enum_msg1 db 0Dh,0Ah,’Local ’,0
    enum_msg2 db ’ remote - ’,0
    .data
    user_name db ’List of connected resources for user ’
    user_buff db 64 dup (?) 
    user_buff_l dd $-user_buff  
    enum_buf_l dd 1056 ;
    enum_entries dd 1 
     
    .data?
    enum_buf NTRESOURCE  
    dd 256 dup (?)  
    message_l dd ?  
    enum_handle dd ?  
    .code
    _start:
     
    push STD_OUTPUT_HANDLE
    call GetStdHandle 
    mov ebx,eax ;  
     
    mov esi,offset greet_message
    call output_string
     
    mov esi,offset user_buff
    push offset user_buff_l  
    push esi  
    push 0 ; NULL
    call WNetGetUser
    cmp eax,NO_ERROR  
    jne error_exit1  
    mov esi,offset user_name  
    call output_string
     
    push offset enum_handle  
    push 0
    push RESOURCEUSAGE_CONNECTABLE 
    push RESOURCETYPE_ANY  
    push RESOURCE_CONNECTED  
    call WNetOpenEnum  
    cmp eax,NO_ERROR  
    jne error_exit2  
     
    enumeration_loop:
    push offset enum_buf_l 
    push offset enum_buf  
    push offset enum_entries  
    push dword ptr enum_handle  
    call WNetEnumResource
    cmp eax,ERROR_NO_MORE_ITEMS  
    je end_enumeration 
    cmp eax,NO_ERROR  
    jne error_exit2  
    mov esi,offset enum_msg1  
    call output_string 
    mov esi,dword ptr enum_buf.lpLocalName  
    call output_string  
     
    mov esi,offset enum_msg2  
    call output_string  
    mov esi,dword ptr enum_buf.lpRemoteName  
    call output_string  
    jmp short enumeration_loop  end_enumeration:
    push dword ptr enum_handle
    call WNetCloseEnum  
    mov esi,offset good_exit_msg
    exit_program:
    call output_string 
    push 0  
    call ExitProcess  
    error_exit1:
    mov esi,offset error1_message
    jmp short exit_program
    error_exit2:
    mov esi,offset error2_message
    jmp short exit_program
     
    output_string proc near
     
    cld
    xor eax,eax
    mov edi,esi
    repne scasb
    dec edi
    sub edi,esi
     
    push 0
    push offset message_l  
    push edi  
    push esi  
    push ebx  
    call WriteConsole  
    ret
    output_string endp
    end _start
      

  4.   

    To: windwu
    如果目标机器上没有安装netbios,你的方法就失效了;
    而且,netbios api能够获得novell工作站的网卡地址吗?To:
    ju_feng(NorthSky)
    能不能详细一点,我看不懂;最好不要用汇编。
      

  5.   

    如果所有的机器都配置了ip协议,就可以用发送arp报文的方法。
      

  6.   

    To xuying:
    你说的对,如果有的机器是novell的客户端,没有配置ip怎么办?
      

  7.   

    To Knight_T
    最好也配上ip,novell客户端也可配ip,没有影响的。如果不行,就要研究ipx协议了。ipx协议中肯定也有类似arp的东西。
      

  8.   

    那么如果在一个局域网中,所有的机器都配置了ip,我怎样得到所有的ip地址呢?
      

  9.   

    用本机地址和掩码得到ip范围或干脆手工配置ip范围,
    然后用循环向每个ip发送arp request请求,然后收集arp echo报文。对于范围不大的子网,速度会足够快,C类(254台主机)用不了几分钟。
      

  10.   

    http://www.csdn.net/expert/topic/567/567762.xml?temp=.3103449