C++实现802.1x客户端
创始人
2025-05-31 18:55:07
0

图例:tp-link802.1x认证客户端,需要填入用户名、密码、网卡。

  1. 选择网卡

(1)添加网卡信息结构体

struct NetcardInfo {char name[NET_CARD_NAME_MAX_LENGTH];  // 用于pcap_open_live()函数,格式例: \Device\NPF_{D89BD73E-7192-407B-9871-E315194968F8}char description[NET_CARD_DESCRIPTION_MAX_LENGTH];  // 界面描述,同tp-link表述形式u_char mac[MAC_SIZE];  // 网卡mac地址,用于组二层包头bool is_physical;  // 是否物理网卡bool is_wireless;  // 是否无线网卡
};

(2)遍历所有网卡信息

通过函数GetAdaptersInfo遍历所有网卡,去除非物理与无线网卡,界面显示可选择的有线网卡(tp-link未去除,会显示所有网卡,包括无线和虚拟网卡)

具体获取:

sprintf_s(netcard.name, sizeof(netcard.name) - 1, "\\Device\\NPF_%s", adapter->AdapterName);
sprintf_s(netcard.description, sizeof(netcard.description) - 1, adapter->Description);
for (UINT i = 0; i < adapter->AddressLength && i < 6; ++i) {netcard.mac[i] = adapter->Address[i];
}
netcard.is_physical = (strstr(adapter->Description, "PCI") > 0);
netcard.is_wireless = (adapter->Type == 71);

  1. 基础函数调用

(1)pcap_open_live获取网卡handle用于通信

pcap_t* pcap_open_live(char* device, int snaplen, int promisc, int to_ms, char* ebuf);

device: 网卡名,格式 \\Device\\NPF_XXXX,如果传入NULL或"any",对所有接口进行捕获

snaplen: 设置每个数据包的捕捉长度,上限MAXIMUM_SNAPLEN

promisc: 是否打开混杂模式

to_ms: 设置获取数据包时的超时时间(ms)(时间过长导致捕获阻塞函数pcap_next_ex延迟退出?)

char error[PCAP_ERRBUF_SIZE];
handle = pcap_open_live("\\Device\\NPF_XXXX", 65536, 1, 20, error);

(2)pcap_compile && pcap_setfilter设置捕获过滤

  char filter[128];std::string src_dst = "dst";  // "src"sprintf_s(filter, "(ether proto 0x888e) and (ether %s host %02x:%02x:%02x:%02x:%02x:%02x)",src_dst.c_str(), mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]);struct bpf_program    fcode;pcap_compile(adapter_hander_, &fcode, filter, 1, 0xff);pcap_setfilter(adapter_hander_, &fcode);

(3)pcap_next_ex获取报文

void ProcessRecvData(Process* processer) {if (!processer) {return;}pcap_t* adapter =processer->GetAdapterHandle();if (!adapter) {return;}struct pcap_pkthdr *header;const unsigned char *captured;while (true) {if (connection_stop) {return;}int ret = pcap_next_ex(adapter, &header, &captured);if (1 == ret) {processer->HandleRecvData(captured);}else {Sleep(20);}}
}//recv_thread = new std::thread(ProcessRecvData, this);

(4)pcap_sendpacket发送数据包

int pcap_sendpacket(pcap_t p, u_char buf, int size);

buf是发送数据包的内容缓冲区首地址,目的mac+源mac+协议类型(802.1x是0x88 8e)+802.1x authentication ...

目的mac:广播mac地址{ 0xff,0xff,0xff,0xff,0xff,0xff }或多播mac地址{ 0x01,0x80,0xc2,0x00,0x00,0x03 },首次收到回复后可保存下ac的mac地址并通过pcap_setfilter设置捕获过滤

(5)pcap_close

  1. 数据包处理

(1)交互流程

client->AP: EAPOL START

AP->client: Request Identity

client->AP: Response Identity

AP->client: Request MD5-challenge EAP || ...

client->AP: Response Legacy Nak // 举例仅支持PEAP

AP->client: Request Protected PEAP

client->AP: Client Hello

...

AP->client: Server Hello

...

client->AP: TLS Data

AP->client: TLS Data

...

AP->client: Repeat // 可能出现

client->AP: Response

AP->client: Success

(2)加密数据处理

struct PeapPara {Tls* tls;u_char *in_buf;u_char *out_buf;int written;int read;int phase;u_char tk[PEAP_TLV_TK_LEN];u_char ipmk[PEAP_TLV_IPMK_LEN];u_char nonce[PEAP_TLV_NONCE_LEN];ChapMs chap;
};

加密数据分为TLS与CHAP-MS两层,TLS使用BIO_read && BIO_write读写,CHAP-MS需要单独类处理,建议参考PPP协议的开源代码

(3)特殊情况处理

交互流程中,最后可能存在一步Repeat

调试过程中,经过解密的TLS数据,根据首位EAP type的值,分为IDentity,Tls,MsChapV2处理,然而最后一步Response Identity 后一直返回failure。查找资料才知道这边是AP要求重复Request的值,详细参考Packet15

4、参考链接

802.1X协议及Radius协议(二)

IEEE 802.1X-PEAP认证过程分析(抓包)

最详细的802.1x认证原理及eap-md5的认证授权计费

SSL双向认证的认证模式设置问题

EAP-MSCHAPv2

EAP-PEAP with Mschapv2: Decrypted and Decoded

microsoft's PEAP version 0 (Implementation in Windows XP SP1)

PPP协议

5、拓展

以上是WIFI连接的抓包

流程与有线连接基本相同,不过每个包的802.1x WIFI头较有线的源mac目的mac复杂一些

也许去除二层头后处理逻辑可以复用?

留待后续学习后解答...

相关内容

热门资讯

美文摘抄加赏析 有关美文摘抄加赏析  美文《法汉词典》译为“纯文学”,法文《拉鲁斯普通名词大词典》中的定义是:“文学...
在那遥远的小山村美文 在那遥远的小山村美文  一直想写一篇关于母亲生病的文章,只放在心里,没有动笔,今天看到我哥的博文,叹...
心里很累的心情说说 心里很累的心情说说(精选120句)  随着社交网络的兴起,越来越多人习惯于在朋友圈发布说说,用以记录...
好句好段摘抄 好句好段摘抄集锦  文字像精灵,只要你用好它,它就会产生让你意想不到的效果。所以无论我们说话还是作文...
经典拟人句摘抄 经典拟人句摘抄  拟人句就是把某件东西比喻成人的动作,所写事物必须具有人的特点;不能出现比喻词;不能...
经典爱情小说:《理智与情感》   《理智与情感》是创作了世界名著《傲慢与偏见》的著名英国女作家简·奥斯汀的第一部小说,是《傲慢与偏...
每天早上大声朗读美文 每天早上大声朗读美文  每天早上大声朗读  很多孩子的“生物钟”还处于“寒假假状态”  通常早上还迷...
因为痛 所以叫青春 人生没有最佳新人奖——金兰都《因为痛,所以叫青春》已故韩国总统金大中的别名是“忍冬草”,其意为战胜整...
人生阡陌交错美文品读 人生阡陌交错美文品读  阡陌交错;阡陌,交,错。  人生就像一张网,没有限制,时光就在这由无数条线交...
精彩片段摘抄 精彩片段摘抄大全  导语:倘若希望在金色的秋天收获果实,那么在寒意侵人的早春,就该卷起裤腿,去不懈地...
qq空间留言爱情话语 qq空间留言爱情话语  1、没有什么东西是过不去的,只有自己跟自己过不去,爱情里的伤害也是这样。  ...
丁丁张小说推荐:《永无止尽的...   《永无止尽的约会》是由作家丁丁张所创作的长篇小说,下面,yjbys小编为大家简单介绍一下这部小说...
人生旅途美文欣赏 人生旅途美文欣赏  导语:人生是一段旅程,起点是生,终点是死。旅程的时间有短有长,旅途中我们会遇到各...
优美段落100字摘抄(2)   23、历史常给人以警示,假若当初商纣王能广开言路,察纳忠言,何至于落得众叛亲离,葬身火海的下场呢...
沈奇岚经典语句   沈奇岚是复旦大学哲学系硕士,德国明斯特大学哲学博士,同时也是一名作家,著名艺术评论人,策展人。下...
让人一看就赞的晚安说说 让人一看就赞的晚安说说(15篇)  随着社交平台的兴起,越来越多人热衷于在线上发表说说,用于分享快乐...
有一种爱不能牵手美文 有一种爱不能牵手美文  灯光穿过我有些空朦的双眸,那条车水马龙五光十色的大街,那双紧紧牵着的手定格在...
《西游降魔篇》经典台词   《西游·降魔篇》是由周星驰监制、编剧、导演,文章、舒淇、黄渤等主演的古装神话电影。此片故事围绕年...
无眠之夜的心情说说 无眠之夜的心情说说(精选170句)  随着移动互联网和社交网络的发展,越来越多人会在社交平台上发布说...
论语译注摘抄及读后感 论语译注摘抄及读后感  对于孔子的精神是值得我们学习的。试想一下在距今如此遥远的时代,就有人能发出如...