Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
发现没有DHCP的默认网关_C_Dhcp_Gateway - Fatal编程技术网

发现没有DHCP的默认网关

发现没有DHCP的默认网关,c,dhcp,gateway,C,Dhcp,Gateway,这是一个疯狂的问题,但是有没有发现没有DHCP的默认网关 这将适用于网络上不使用DHCP的设备,该设备目前还没有IP地址。我在想,如果我可以发现默认网关,那么我可以尝试猜测一个未使用的ip地址,然后在网络上广播,看看它是否被使用 我可能是自找麻烦,我明白。例如,如果已经有一台具有静态IP的计算机正在关闭。可以这样做,但不容易(据我所知)。 我将进一步分析解决方案: 检测网关-2种可能性(均与数据嗅探相关): 捕获DHCP提供数据包和 检索网关 查找发往外部网络的数据包(例如,对每个目标IP地

这是一个疯狂的问题,但是有没有发现没有DHCP的默认网关

这将适用于网络上不使用DHCP的设备,该设备目前还没有IP地址。我在想,如果我可以发现默认网关,那么我可以尝试猜测一个未使用的ip地址,然后在网络上广播,看看它是否被使用


我可能是自找麻烦,我明白。例如,如果已经有一台具有静态IP的计算机正在关闭。

可以这样做,但不容易(据我所知)。 我将进一步分析解决方案:

  • 检测网关-2种可能性(均与数据嗅探相关):
    • 捕获DHCP提供数据包和 检索网关
    • 查找发往外部网络的数据包(例如,对每个目标IP地址执行arp请求-如果没有答案,您可能有默认网关的mac地址-您需要找到该网关的IP地址(分析arp数据包、所有数据包等)
  • 你有一个ip地址做一个arp请求,并找到你的免费ip
嗅探库我认为是libpcap或winpcap


从未做过类似的事情,但如果我在谷歌上找不到任何参考资料,我想我会这样做。

在Windows网络上,你可以使用IP 0.0.0,打开一个端口67(或68)的UDP套接字然后等待SMB广播消息了解IP地址。从那里,您可以使用ARP数据包在接近该IP的地址上搜索设备

如果网络使用的网络掩码小于255.255.255.0,请尝试查找与原始IP(相同的高位)尽可能接近的未使用地址。一旦找到未使用的IP,请为您的设备申请该地址,并发送免费的ARP

现在继续您的ARP扫描,无论何时您发现有响应的设备,请临时将其设置为默认网关,并尝试ping Internet上将响应的设备的已知IP地址。如果您收到响应,则您已找到网关


当使用DHCP时,99%的时间都会用到这一点,这需要做大量的工作。

数据包嗅探一段时间,然后应用启发式方法。我假设在剩下的时间里使用IPv4和以太网。如果使用以太网交换机而不是集线器,这将无法很好地工作。最后将详细介绍这一点

根据您看到的以太网(或其他)和IP头以及实际的ARP数据包(忽略广播和多播IP和MAC地址),创建您自己的RARP(反向地址解析)表。请确保您的表能够将多个IP地址映射到单个硬件接口。表中任何由实际ARP数据包输入或验证的IP地址都应标记为该地址

网关可能接收和发送更多流量。此流量可能具有来自多个不同网络的多个IP地址,但具有相同的硬件地址。网关将在您的表中显示为一个具有多个IP地址的MAC地址。您可能已观察到涉及此MAC地址的ARP事务,因此可以查找一个IP地址,该地址别名为MAC,该MAC还设置了ARP数据包中的
标志。这几乎肯定是网关的IP地址

您可能能够根据网关的IP地址猜出网络地址和子网掩码,但这可能不是您可以信任的。如果您想在具有非标准网络掩码的网络上实现这一点,可以尝试执行以下操作。 设置两个IP地址大小的累加器变量:

uint32_t acc_and = 0xFFffFFff;
uint32_t acc_or  = 0x00000000;
然后针对表中的每个ARP验证地址

acc_and &= ip_addr;
acc_or  |= ip_addr;
您还可以在来自网关的数据包中使用目标IP地址(不是多播),但您必须知道网关,然后才能将其标记为目标IP地址

查找网络掩码和网络地址 地址的网络部分在两种情况下应保持不变(第一次操作后),但在
acc_和
中,底部位应开始清除,而在
acc_或
中,底部位应开始填充。有足够的样本,您可以通过以下方式确定网络地址:

uint32_t net_addr = acc_and & acc_or;
和网络掩码:

uint32_t net_mask = acc_and ^ acc_or;
获取足够的采样本地IP地址可能需要很长时间,因此您可以开始尝试通过以下方式缩小范围:

uint32_t almost_net_mask = acc_and ^ acc_or;
int i = 0;
while ( 1 & almost_net_mask ) {
   i++;
   almost_net_mask >>= 1;
}
uint32_t net_mask = 0xFFffFFff;
while( i-- ) {
     net_mask <<=1;
}
如果您现在真的想确定您的网络掩码和网络地址,您可以尝试其他方法。您可以尝试查看网关是否会尝试将您发送的数据包转发到您认为应该是本地地址的数据包。因为这将不得不继续并为自己分配一个IP地址,如果您的网络掩码这是不对的

为自己选择IP 尝试选择最低的合法IP地址,该地址是您尚未看到的流量,以增加该地址未超出范围的可能性。您可以欺骗该地址的ARP请求并查找任何回复(你可以使用你自己的真实MAC地址,但可能会为此编一个IP。不一定是你的IP,这可能会让事情有点混乱)。在你找到一个IP地址后,你不能自己ARP声明它

很可能你的IP地址实际上太高了。这很难确定,因为你的网络掩码仍然只是一个很好的猜测。如果是这样的话,你就不走运了,因为没有空闲的插槽供你使用

回到网络掩码 若要查看您的网络掩码是否需要调整,请尝试发送带有目标地址的IP数据包,这些目标地址在本地网络中没有看到,但根据您对网络掩码和网络地址的猜测,这些地址可能在本地网络中。如果这些猜测被取消,则应该为网络地址分配过多的位,因此发送到地址您希望更改(到目前为止)最佳猜测网络地址的网络掩码部分的低位
i = ffs( ~ ( acc_and ^ acc_or ) ) ; // assuming that int on your system is 32 bit.  if not use ffsl