给hostapd打补丁, 解决rt3070网卡建立软AP时无法握手的问题

折磨了自己一周多,供遇到同样问题的朋友们参考。

一般有两种方法在kali linux下建立软AP,一是使用airbase-ng,优点是运行方便,适应网卡的范围比较广,比如常见的rtl8187的网卡,局限是只能建立OPN和WEP加密的,不支持WPA和WPA2加密。二是通过hostapd,支持OPN、WEP、WPA、WPA2等多种加密方式,但支持的网卡有限。

之前我手上有rtl8187的网卡,一直把它当作神器,后来发现完全是被误导了,不仅信号一般,且支持的模式相当有限,最关键是不支持hostapd建立WPA加密的AP。用iw list命令可以看到rtl8187网卡支持的模式:

iw list
…
Supported interface modes:
     * IBSS
     * managed
     * monitor

一阵google后,在某电商那淘了一块rt3070芯片的,价格便宜、童叟无欺,支持b/g/n(rtl8187仅支持b/g),标配双6dBi增益天线,iw list看一下,瞬间发现这泥马才是真正的神器啊!(强烈推荐!!)

Supported interface modes:
     * IBSS
     * managed
     * AP
     * AP/VLAN
     * WDS
     * monitor
     * mesh point

关键就是其中显示的AP,这说明网卡支持软AP模式。下面进入正题,我在用kali linux自带的hostapd建立WPA2加密的AP后,终端连接时总是显示无法正常握手的错误:

注意红色标的错误信息,主要就是:

wlan2: STA xx:xx:xx:xx:xx:xx IEEE 802.11: did not acknowledge authentication response
mgmt::assoc_resp cb
wlan2: STA xx:xx:xx:xx:xx:xx IEEE 802.11: did not acknowledge association response
Data/PS-poll frame from not associated STA xx:xx:xx:xx:xx:xx

接下来,为了解决这个问题,我在网上搜了无数中文和鸟语网页,尝试了各路方法。比如,删除系统自带的hostapd,下载源码直接编译。不过git clone下载的源码在我机器上始终无法编译通过,直接下载官方网站提供的tar.gz源码包,虽然可以编译通过,但运行出错。

卡在这里很长时间,不过有个别网站说到也遇到这个问题,并通过修改源代码后再编译可以解决。修改方法是,在源代码src/ap/ieee802_11.c中将两处return注释掉,如下:

if (!ok) {  
hostapd_logger(hapd, mgmt->da, HOSTAPD_MODULE_IEEE80211,   
HOSTAPD_LEVEL_NOTICE,   
"did not acknowledge authentication response");   
   //return;
}   
if (!ok) {  
hostapd_logger(hapd, mgmt->da, HOSTAPD_MODULE_IEEE80211,   
HOSTAPD_LEVEL_DEBUG,   
"did not acknowledge association response");   
   //return;
}

但我的机器上源码编译通过不了啊!没办法,只能直接更改系统自带的hostapd程序了。用ida打开hostapd,在Strings windows窗口中进行排序后,找到两处连续的关键字符串:

双击后可以找到引用字符串的代码处。第一处是在080D9678处,同时可以看到,sub_80D95E0的子程序调用了loc_80D9678:

继续跟踪到sub_80D95E0,以图形视图查看,明显jz是错误信息判断,出错了就沿绿线,调用上面的出错误信息,我们只需要将jz跳转nop掉,让程序沿红线继续下去即可。

经过查看,这句jz代码在文件偏移0009160C处,代码为74 6A,只需要将其改为90 90。在kali中,用十六进制编辑器对hostapd进行修改:

 hexeditor /usr/sbin/hostapd

将对应偏移处的数值修改完毕:

同理,再将第二处错误信息的调用跳转nop掉,这次是jz loc_80DC618,文件偏移00094426,十六进制数据为0F 84 EC 01 00 00:

用hexeditor全部改为90:

Ctrl+x 保存推出,再次运行hostapd,手机成功连接,显示connected:

真是一次无比曲折的经历。从最初想用airbase-ng建立WPA加密的AP到无奈使用hostapd,从使用rtl8187网卡无果再到购买合适的网卡,从编译代码不通过再到直接修改可执行文件,折腾了那么长时间。把经历写出来,供有需要的朋友参考,少走弯路!

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注