还是不习惯linux下gdb调试,windows下的VS实在是太强大了,于是转到windows环境进行编译、调试与分析。
同样修改一些定义,让输出过程更加便于分析和调试:
// ============== manfeel ==================== #define HELP printf("--------------------------------------------------\n[%s(%d) => %s]\n",__FILE__,__LINE__,__FUNCTION__) #define wpa_printf(...) do { HELP;wpa_printf_manfeel(__VA_ARGS__); } while(0) #define wpa_dbg(...) do { HELP;wpa_msg_manfeel(__VA_ARGS__); } while(0) #define wpa_msg(...) do { HELP;wpa_msg_manfeel(__VA_ARGS__); } while(0)
在windows下,应该这样写:... -> __VAR_ARGS__(两个下划线,一般人我不告诉他;-)
在开始分析之前,还有一个要注意的地方,那就是命令行参数,windows下应该这样写:
-Dndis -i"\Device\NPF_{829D2AD2-5783-4D5A-B925-2AD7B3EBD2F7}" -cc:\wpa_supplicant1.conf
驱动只能用ndis,注意网络设备的写法。在ethereal当中,可以快速的查看到。也可以在编译好的目录中运行win_if_list.exe查看:
ifname: \Device\NPF_{1B259B4B-BA41-47F4-A656-6394785602B0} description: VMware Virtual Ethernet Adapter ifname: \Device\NPF_{B1D9248D-6490-442E-B1CC-E40BC841C6FE} description: VMware Virtual Ethernet Adapter ifname: \Device\NPF_{CE9BA6F0-73FC-4FE2-B0DC-AEF52E2069B0} description: Microsoft ifname: \Device\NPF_{20B000C7-F5FB-49CE-BE5A-0C0D3369103A} description: Microsoft ifname: \Device\NPF_{829D2AD2-5783-4D5A-B925-2AD7B3EBD2F7} description: Broadcom NetLink (TM) Gigabit Ethernet Driver
-Dndis -iBroadcom -cc:\wpa_supplicant1.conf
好,正式开始分析:
发现关键的发送函数是 wpas_glue.c 的 wpa_supplicant_eapol_send
而构建identity的关键函数 eap_sm_buildIdentity 在src/eap_peer/eap.c中:
标准的eapol认证,只发送了identity,而神州数码的除了identity以外,还需要dhcp标志、ip、mask、gateway、dns、identity(username)的MD5值和最后的版本号
发送MD5-Challenge的关键函数 eap_md5_process 在 src/eap_peer/eap_md5.c中
eap.c判断连接状态的地方,eap_peer_sm_step_received -》eap_success_workaround 里面,需要对 id 进行一些修改
// manfeel, 神州数码,居然是 reqId == lastId - 1 if (sm->workaround && (reqId == ((lastId + 1) & 0xff) || reqId == ((lastId - 1) & 0xff) || reqId == ((lastId + 2) & 0xff))) { wpa_printf(MSG_DEBUG, "EAP: Workaround for unexpected " "identifier field in EAP Success: " "reqId=%d lastId=%d (these are supposed to be " "same)", reqId, lastId); return 1; }