我无法弄清楚接入点如何确定附近客户端的信号功率。
我在任何 WiFi 数据包教程中都没有找到此信息,因此我只能假设电源信息不是来自客户端,而是由接入点决定的。
我知道一款名为 aircrack 的应用程序可以确定这些信息,但在我深入研究之前,我想先了解一下功率的计算方法。我的谷歌技能不够好那很糟糕,所以令我惊讶的是,到目前为止我还没有找到任何有关它的信息。如果 aircrack 能做到这一点,那么这些信息肯定是存在的!
我希望这里的用户可以给我指明正确的方向?
关于赏金
我想是时候尝试使用赏金了。在您的答案中,请发布您能找到的所有链接,这些链接将有助于任何人理解这种功率检测的工作原理。关于如何在 aircrack 中实现它的具体信息将是完美的!
更新:
到目前为止,以 aircrack-ng 套件为例,看起来功率值是从 net_read() 中的 buf[2] 中提取的。我相信这个值最终来自 net_cmd,这会导致对 net_send 和 net_get() 的成对调用。我认为 net_get() 会读取由于调用 net_send() 而发送的任何标头信息,并且此标头指示应将多少数据复制到缓冲区 buf[] 中。
但现在我不明白的是—— buf[] 看起来确实被对 net_read_exact() 的调用填充了,而 net_read_exact() 只是从套接字读取数据。如果是这样,并且如果功率是驱动程序详细信息,那么为什么功率值在缓冲区中?如果该缓冲区确实由套接字数据填充,这是否意味着功率是由客户端/站点发送的?我相信 AP/驱动程序负责提供功率信息,就像每个人都说的那样,但我不明白这一部分。
答案1
实际上,确定这些信息的应用程序是airodump-ng
,不是 aircrack-ng
。 来自airodump-ng
文档,功率水平确定为:
PWR - 卡报告的信号级别。其含义取决于驱动程序 [...]
好吧,让我们看看我们能不能做得更好。查看最新的源代码airodump-ng.c
文件中,我们看到在函数中设置了功率dump_add_packet(...)
:
/* only update power if packets comes from
* the AP: either type == mgmt and SA != BSSID,
* or FromDS == 1 and ToDS == 0 */
if (...)
ap_cur->power_lvl[ap_cur->power_index] = ri->ri_power;
在挖掘了几层抽象、结构和函数指针之后,我发现这些数据是linux_read(...)
从osdep/linux.c
文件。这是结构ri_power
中的变量ri
填充数据的地方,并且它确实似乎是特定于驱动程序的。
最多司机遵循广播电台标准(与下面详述的旧 prism54 标准相反),它具有几个预定义字段用于确定天线功率、噪声和衰减。这些字段直接用于airodump-ng
填充ri_power
变量。其中一些已经以分贝或功率值的形式提供。
airodump-ng
将使用天线信号场(单位:dBm)或dB天线信号场(以 dB 为单位)来计算显示的信号功率。其他字段使用类似的步骤,因为它们都是在上面链接的 Radiotap 规范中预先确定的。例如,ri_power
使用 dB 天线信号字段可以计算如下:
case IEEE80211_RADIOTAP_DB_ANTSIGNAL:
if(!got_signal) {
if( *iterator.this_arg < 127 )
ri->ri_power = *iterator.this_arg;
else
ri->ri_power = *iterator.this_arg - 255;
got_signal = 1;
}
break;
如前所述,有些设备遵循(较旧的)棱镜54规范(而不是 Radiotap),它使用固定长度的标头。在这种情况下,RX 功率直接来自缓冲区(请注意,这不是完整的源代码,仅显示了填充所采用的路径ri_power
):
if (tmpbuf[7] == 0x40)
ri->ri_power = tmpbuf[0x33];
else
ri->ri_power = *(unsigned int *)( tmpbuf + 0x5C );
答案2
我不太清楚你在问什么。
接入点自然有无线电接收器,这些接收器有带自动增益的模拟部分,硬件可以从中得出接收信号强度。然后,硬件驱动程序以操作系统相关的方式将此信息提供给其他软件。
这就是为什么 aircrack 制造关于驱动程序和硬件的大事。