监控ARP缓存

我对C不是太懂,为了完成上级的任务,组合了几个函数,目的是监控ARP缓存,对ARP条目的删除时出现了问题,删除不了想要删除的IP地址,麻烦各位帮指导一下

 

 

 

 

 

int main()
{
    DWORD i, dwCurrIndex;
    char szPrintablePhysAddr[256];
    char szType[128];
    char szIpAddr[128];
     GetGlobalData();
 // 首先获取ARP表
 PMIB_IPNETTABLE pIpNetTable = MyGetIpNetTable(true);
    if (pIpNetTable == NULL)
    {
        printf( "pIpNetTable == NULL in line %d/n", __LINE__);
        return -1;
    }

 // 获取IP地址表,以便根据它将ARP表项中的接口索引转化为IP地址
 PMIB_IPADDRTABLE pIpAddrTable = MyGetIpAddrTable(TRUE);

 // 当前的适配器索引。注意,ARP表应该按照接口索引排序
    dwCurrIndex = pIpNetTable->table[0].dwIndex;
    if(InterfaceIdxToInterfaceIp(pIpAddrTable, dwCurrIndex, szIpAddr))
    {
        printf("/nInterface: %s on Interface 0x%X/n", szIpAddr, dwCurrIndex);
        printf("  Internet Address      Physical Address      Type     通信情况/n");
    }
    else
    {
        printf("Error: Could not convert Interface number 0x%X to IP address./n",
                    pIpNetTable->table[0].dwIndex);
        return -1;
    }
       
 // 打印出索引为dwCurrIndex的适配器上的ARP表项

  
 for(i = 0; i < pIpNetTable->dwNumEntries; ++i)
    {
  // 不相等则说明要打印下一个适配器上的ARP表项了
        if(pIpNetTable->table[i].dwIndex != dwCurrIndex)
        {
            dwCurrIndex = pIpNetTable->table[i].dwIndex;
            if (InterfaceIdxToInterfaceIp(pIpAddrTable, dwCurrIndex, szIpAddr))
            {
                printf("Interface: %s on Interface 0x%X/n", szIpAddr, dwCurrIndex);
                printf("Internet Address Physical Address  Type/n");
            }
            else
            {
                printf("Error: Could not convert Interface number 0x%X to IP address./n",
                    pIpNetTable->table[0].dwIndex);
                return -1;
            }
        }

   // 打印出此ARP表项中的数据
  // MAC地址
  
  u_char *p = pIpNetTable->table[i].bPhysAddr;
        wsprintf(szPrintablePhysAddr, "%02X-%02X-%02X-%02X-%02X-%02X", p[0], p[1], p[2], p[3], p[4], p[5]);
  // IP地址
  struct in_addr inadTmp;
        inadTmp.s_addr = pIpNetTable->table[i].dwAddr;

printf("xxyy1=%ld/n",pIpNetTable->table[i].dwIndex );

 


  // 类型
        switch (pIpNetTable->table[i].dwType)
        {
        case 1:
            strcpy(szType,"other");
            break;
        case 2:
            strcpy(szType,"invalidated");
            break;
        case 3:
            strcpy(szType,"dynamic");
            break;
        case 4:
            strcpy(szType,"static");
            break;
        default:
            strcpy(szType,"invalidType");
        }

       xy=pingdestip(inet_ntoa(inadTmp));

      if(xy==-1)
   { printf("  %-16s     %-17s    %-11s 受阻,删除/n",inet_ntoa(inadTmp), szPrintablePhysAddr, szType);

 

 

 

 

 

 

   if(DeleteIpNetEntry (pIpNetTable->table )== NO_ERROR)      //主要是这时使用删除,但是没有成功
 
  printf("A IP Address Deleted./n");
  
   }


   else
         printf("  %-16s     %-17s    %-11s 正常/n",inet_ntoa(inadTmp), szPrintablePhysAddr, szType);
  
   return 0;
}

// 获取IP地址到适配器的映射关系,即ARP表

PMIB_IPNETTABLE MyGetIpNetTable(BOOL bOrder)
{
 PMIB_IPNETTABLE pIpNetTable = NULL;
 DWORD dwActualSize = 0;

 // 查询所需缓冲区的大小
 if(::GetIpNetTable(pIpNetTable,
     &dwActualSize, bOrder) == ERROR_INSUFFICIENT_BUFFER)
 {
  // 为MIB_IPNETTABLE结构申请内存
  pIpNetTable = (PMIB_IPNETTABLE)::GlobalAlloc(GPTR, dwActualSize);
  // 获取ARP表
  if(::GetIpNetTable(pIpNetTable,
      &dwActualSize, bOrder) == NO_ERROR)
  {
   return pIpNetTable;
  }
  ::GlobalFree(pIpNetTable);
 }
 return NULL;
}

void MyFreeIpNetTable(PMIB_IPNETTABLE pIpNetTable)
{
 if(pIpNetTable != NULL)
  ::GlobalFree(pIpNetTable);
}


PMIB_IPADDRTABLE MyGetIpAddrTable(BOOL bOrder)
{
 PMIB_IPADDRTABLE pIpAddrTable = NULL;
 DWORD dwActualSize = 0;

 // 查询所需缓冲区的大小
 if(::GetIpAddrTable(pIpAddrTable,
     &dwActualSize, bOrder) == ERROR_INSUFFICIENT_BUFFER)
 {
  // 为MIB_IPADDRTABLE结构申请内存
  pIpAddrTable = (PMIB_IPADDRTABLE)::GlobalAlloc(GPTR, dwActualSize);
  // 获取IP地址表
  if(::GetIpAddrTable(pIpAddrTable,
      &dwActualSize, bOrder) == NO_ERROR)
   return pIpAddrTable;
  ::GlobalFree(pIpAddrTable);
 }
 return NULL;
}

void MyFreeIpAddrTable(PMIB_IPADDRTABLE pIpAddrTable)
{
 if(pIpAddrTable != NULL)
  ::GlobalFree(pIpAddrTable);
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
软件介绍 你的网络是否经常掉线,是否经常发生IP冲突? 你是否担心通讯数据受到监控(如MSN、QQ、EMAIL)? 你的网络速度是否受到网管软件限制(如聚生网管、P2P终结者)? 你是否深受各种ARP攻击软件之苦(如网络执法官、网络剪刀手、局域网终结者)? 以上各种问题的根源都是ARP欺骗(ARP攻击)。在没有ARP欺骗之前,数据流向是这样的:网关本机。ARP欺骗之后,数据流向是这样的:网关攻击者(“网管”)本机,本机与网关之间的所有通讯数据都将流经攻击者(“网管”),所以“任人宰割”就在所难免了。 ARP防火墙通过在系统内核层拦截虚假ARP数据包以及主动通告网关本机正确的MAC地址,可以保障数据流向正确,不经过第三者,从而保证通讯数据安全、保证网络畅通、保证通讯数据不受第三者控制,从而完美的解决上述所有问题。 ARP防火墙六大功能 * 拦截外部攻击。在系统内核层拦截外部虚假ARP数据包,保障系统不受ARP欺骗、ARP攻击影响,保持网络畅通及通讯安全; * 拦截IP冲突。在系统内核层拦截IP冲突数据包,保障系统不受IP冲突攻击的影响; * 拦截外对攻击。在系统内核层拦截本机对外的ARP攻击数据包,以减少感染恶意程序后对外攻击给用户带来的麻烦; * 监测ARP缓存。自动监测本机ARP缓存,如发现网关MAC地址被恶意程序篡改,将报警并自动修复,以保持网络畅通及通讯安全; * 主动防御。主动与网关保持通讯,通告网关正确的MAC地址,以保持网络畅通及通讯安全; * 锁定攻击者。发现攻击行为后,自动快速锁定攻击者IP地址;

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值