防火墙阻止ping时如何从扫描本地网络中获取mac地址

问题描述

对于安全产品,我目前正在Delphi中编写。我正在使用以下解决方案来使用ARP表从设备获取MAC地址以检测网络上的内容。

How to find MAC addresses from arp -a scan

我只是执行了一系列Ping命令来填充ARP表并从ARP表中读取结果。

但是,当计算机上的防火墙阻止Ping时。有时,MAC仍然在ARP中公开,但并非总是如此。什么是检测网络上所有设备并从中获取MAC地址的更好解决方案?

//-----------------------------------------------------------------------------
{ ARP-table lists relations between remote IP and remote MAC-address.
 NOTE: these are cached entries;when there is no more network traffic to a
 node,entry is deleted after a few minutes.
}
//-----------------------------------------------------------------------------
procedure Get_ARPTable( aList: TStrings; aDeviceList : TObjectList<TNetworkDevice>);
var
  lIPNetRow    : TMibIPNetRow;
  lTableSize   : DWORD;
  lNumEntries  : DWORD;
  lErrorCode   : DWORD;
  lIdx         : Integer;
  lPBuf        : PAnsiChar;
  lPhysAddr    : TMACAddress;
  lMacAddr2Str : string;
  ldwAddr      : string;
  ldwType      : string;
  lNewDevice   : TNetworkDevice;
begin
  if not LoadIpHlp then Exit;
  if not Assigned( aList ) then Exit;
  if not Assigned( aDeviceList) then Exit;

  Get_LocalNetworkDevices(aDeviceList);

  aList.Clear;
  lTableSize := 0;
  lErrorCode := GetIPNetTable( Nil,@lTableSize,False );
  //
  if lErrorCode = ERROR_NO_DATA then
  begin
    aList.Add( ' ARP-cache empty.' );
    EXIT;
  end;
  // get table
  GetMem( lPBuf,lTableSize );
  lNumEntries := 0;
  try
  lErrorCode := GetIpNetTable( PTMIBIPNetTable( lPBuf ),False );
  if lErrorCode = NO_ERROR then
  begin
    lNumEntries := PTMIBIPNetTable( lPBuf )^.dwNumEntries;

    if lNumEntries > 0 then
    begin
      Inc( lPBuf,SizeOf( DWORD ) );
      for lIdx := 1 to lNumEntries do
      begin
        lIPNetRow := PTMIBIPNetRow( lPBuf )^;

        lMacAddr2Str := MacAddr2Str( lIPNetRow.bPhysAddr,lIPNetRow.dwPhysAddrLen );
        lPhysAddr := lIPNetRow.bPhysAddr;
        ldwAddr := IPAddr2StrTrunc(lIPNetRow.dwAddr);
        ldwType := ARPEntryType[lIPNetRow.dwType];

        lNewDevice := SeekDevice(aDeviceList,lMacAddr2Str);

        if Assigned(lNewDevice) then
        begin
          lNewDevice.IP := ldwAddr;
          lNewDevice.IsNew := False;
          lNewDevice.EntryType :=  ARPEntryType[lIPNetRow.dwType];
          if (lNewDevice.EntryType = 'Dynamic') or
             (lNewDevice.EntryType = 'Static') then
                 lNewDevice.SetStamp;
        end
        else
        begin
          lNewDevice := TNetworkDevice.Create;
          lNewDevice.IP := ldwAddr;
          lNewDevice.EntryType  := ARPEntryType[lIPNetRow.dwType];
          lNewDevice.AddOrUpdate(lMacAddr2Str);
          lNewDevice.SetFirstSeen;
          lNewDevice.SetStamp;
          lNewDevice.State := dtRogue;
          lNewDevice.IsNew := True;
          aDeviceList.Add(lNewDevice);
        end;

        with lIPNetRow do
        begin
          aList.Add( Format( '%8x | %12s | %16s| %10s',[dwIndex,MacAddr2Str( bPhysAddr,dwPhysAddrLen ),IPAddr2Str( dwAddr ),ARPEntryType[dwType]
                           ]));
        end;
        Inc( lPBuf,SizeOf( lIPNetRow ) );
      end;
    end
    else
      aList.Add( ' ARP-cache empty.' );
  end
  else
    aList.Add( SysErrorMessage( lErrorCode ) );

  // we _must_ restore Pointer!
  finally
      Dec( lPBuf,SizeOf( DWORD ) + lNumEntries * SizeOf( lIPNetRow ) );
      FreeMem( lPBuf );
  end;
end;

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)