标准【wpa_supplicant】到【神州数码】 认证的修改记录(中)——分析调试

还是不习惯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) 

注意宏定义当中的一些区别!GCC下的args... -> args

在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;
	}


你可能感兴趣的:(标准【wpa_supplicant】到【神州数码】 认证的修改记录(中)——分析调试)