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

   折磨了本身一周多,供遇到一样问题的朋友们参考。linux

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

   以前我手上有rtl8187的网卡,一直把它看成神器,后来发现彻底是被误导了,不只信号通常,且支持的模式至关有限,最关键是不支持hostapd创建WPA加密的AP。用iw list命令能够看到rtl8187网卡支持的模式:windows


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


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


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


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


图像 001


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


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注释掉,以下:google


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窗口中进行排序后,找到两处连续的关键字符串:加密


p_w_picpath


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


p_w_picpath


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


p_w_picpath


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


hexeditor /usr/sbin/hostapd


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


图像 008-1


图像 008-2


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



p_w_picpath


   用hexeditor所有改成90:


p_w_picpath


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


p_w_picpath


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

相关文章
相关标签/搜索