神州数码802.1x认证的C语言版客户端

May 18, 2009

一直以来在Linux下要接入神州数码认证用的是姚琦开发的Java版认证工具,不过现在起,使用神码的同学可以把jvm抛弃啦!PT开发出了C语言版的神州数码802.1x客户端!

项目主页:http://code.google.com/p/zdcclient/

开发手记

PT的客户端版本虽然是命令行的版本,但是功能和姚琦的Java版功能没多大差别,目前支持自定义接入网卡、支持DHCP、支持程序运行后自动fork到后台,用户名等通过参数传入程序。

Java版的软件虽然一般使用起来没太大区别,但是当系统中没有jvm虚拟机和软件依赖的库,而且电脑又不能上网的时候,这可是相当棘手的问题,我去年就为此在Ubuntu-cn的Wiki写了一篇教程,如何从源里面抓jvm的一堆包回来安装,再折腾一番才能用。况且Java程序占的资源颇大,就那个0.6.1版的客户端,常驻内存有50M!

姚琦的个人网站上面公布了他的客户端软件的源码,之前有下载回来,不过一直没看,早天兴起把文件重新放到Netbeans里面来编译一次,发现能编译却不能认证!好奇之下跟踪了其代码,把带界面的1500多行的程序删减到只剩400行的命令行程序,然后再根据抓数据包的对比,发现是这个版本获取本机地址的代码有问题,在Linux下获取本机IP是错的,这样组成的数据包去认证,当然不行了,具体在这里有人解释。

摸清楚认证过程的来龙去脉后,就打算自己用C来写一个客户端,虽然我有2G内存,但老被占着几十M也不舒服。Java里面用的jpcap,是Java用JNI对libpcap的封装,之前我弄过编译amd64版时候接触过,发现其功能很强大,使用也不复杂,于是对写个原生C语言版的客户端也有了信心。

为了弄清整个程序的工作流程,我进一步优化了Java版的代码,400多行最后剩下200多了,姚学长的编码好像有点太过那个,呃……而且姚学长好像连jpcap的toturial都没有读完,竟然使用一堆if来过滤抓到的数据包,怪不得之前内网传文件达10M速度的时候,客户端占的CPU狂飙了。为捕捉过程设置了驱动级别的过滤器,使用回呼方式抓包,对一些函数流程进行重构,最后这个版本运行的时候占内存不到10M,CPU占用率也低多了。

这两天对着一个libpcap的抓包示例,一步步地将包分析的功能改了出来,然后就是手动创建的报文,其中一个小插曲是用到的MD5算法,在Java中有个内建的digest功能,但C语言哪来这东西,上网找,连续下了几个版本,测试一下,有些算出来的值是错的,有些每次算出来都不一样,气死我了,看来是因为我现在用的是amd64版本的系统,算法里面的数据类型不兼容所致。最后在MD5 Homepage (unofficial)找到了L. Peter Deutsch's的版本才正常。

对着wireshark满是16进制数的窗口用笔划了两天框框彻底搞清楚了协议包的结构,然后在gvim里面倒腾了代码,终于程序完成了。不知为什么,写这个程序有很亢奋的感觉,昨天晚上是搞到3点钟才睡,然后早上7点多就爬了起来继续coding,不是我不想睡,而是有问题晾在那里没解决就睡觉的话,就只会整晚失眠了。逃了一天课,终于大功告成,本来还想实现配置文件的功能,不过想想还是算了,很容易就能用脚本来记录。

tags: , , , ,
posted in Unix/Linux by PT

Follow comments via the RSS Feed | Leave a comment | Trackback URL

43 Responses to 神州数码802.1x认证的C语言版客户端

  1. 哈哈,跪求PT大牛开发ruijie的啊.......哈哈!!“广大”人民期盼着你的开发啊!

  2. 刘群 says:

    支持!
    64位系统上的gcc可以为32位机进行交叉编译,选项是-m32或-march=i386,但具体情况我不确定,你试试看:

    gcc -m32 helloworld.c -o helloworld

    gcc -march=i386 helloworld.c -o helloworld

  3. 刘群 says:

    其他客户端:

    1、兼容锐捷linux
    项目主页:http://code.google.com/p/ruijieclient

    2、兼容华为H3C/iNode的客户端
    南京工程学院:
    http://gforge.osdn.net.cn/projects/njit8021xclient/

    中国海洋大学:
    http://hi.baidu.com/syshall

    3、兼容“赛尔宽带802.1X"的客户端,已经测试成功,但暂时只提供源代码:
    http://gforge.osdn.net.cn/svn/njit8021xclient/branches/ouc.edu.cn/fushanxiaoqu/

    (正在南京工程学院和中国海洋大学浮山校区测试)

  4. maomaol says:

    毛毛发来贺电~~~

  5. PT says:

    哇!楼上的发了那么多网址都没被反垃圾留言的插件杀掉,看来Spam Karma的智能化挺不错的! 我们学校现在居然有三种认证方案,神州数码、锐捷、H3C,以后还请你们技术支持哈!

  6. cc says:

    这东西很不错,本人在武大,现在linux可以上网了mac os应该也能上网,希望能有哪位大神将mac os攻关成功并发个教程上来,此乃奉献之大道!

  7. PT says:

    ……mac那边也有gcc吧,直接make就好了,没攻关那么夸张……

  8. abcdcan says:

    你好,能开发个在windows7下的客户端吗?

  9. PT says:

    Windows版会在考虑之列,不过会放在最后了,因为api的变化最大。

  10. mac用户 says:

    各位说的太专业了,苹果机怎么才能越过塞尔宽带客户端上网啊?高手请指招。谢啦

  11. dlinux says:

    如何加入广州大学linuxQQ群

  12. Insion says:

    啊!感動啊,可是我現在是mac os x啊,mac要裝什麼才能編譯linux的源碼?或者PT開發個mac版的神州數碼?

  13. Allyez says:

    请问用什么软件截获数据包呢?

  14. BOYPT says:

    @Allyez 抓包用wireshark,每个平台都有;

    @Insion 我没MAC的环境,很难测试到;不过基本上多数的Linux软件都能port到MAC,似乎GCC是通用的

  15. jpzj says:

    太感动了~~

    WINDOWS7 上这个软件完美~~

  16. jpzj says:

    太感动了~~

    WINDOWS7下用这个软件完美~

  17. Insion says:

    哎,那我提供数据可以吗?可以协助我完成吗?希望可以和你用gmail联系.

    我下了你的代码研读了2天了!装了个3GB的xcode(不熟悉),可以用gcc了,但不熟悉gcc、不熟悉c/c++语言,以前只自学过可视化的ide写点小玩意,现在直接用编译器还是第一次.现在在宿舍拉了根15m长的网线,又装了个lazarus企图用pascal来写个客户端(我只懂delphi),现在又下个Future BASIC和REALbasic,妄想用basic来写(我自学vb时候还是vb4.0),现在又下载Wireshark ppc...............这一切的一切都是为了写这个该死的神州数码登陆器......

  18. Insion says:

    对了,你这个还需要pcap吗?for mac(ppc)版在那里下?linux版可以直接用吗?

  19. BOYPT says:

    @Insion : 好大排场……哈哈~~

    libpcap是需要的,跨平台,MAC下安装应该问题不大,请看libpcap的主页,应该也是用gcc编译;gcc似乎用不着3GB这么大型的东西吧……你可以问问别的MACer,或者相关的资料,特别是外国的。

  20. Insion says:

    libpcap已经找到了,是不是只需要libpcap.a文件?我编译的时候出现了一些错误,发了邮件给你了,现在贴到这里来:

    make
    Makefile:136: .main.d: No such file or directory
    Makefile:136: .md5.d: No such file or directory
    Makefile:136: .zdclient.d: No such file or directory
    gcc -c -Wall -O3 main.c
    gcc -c -Wall -O3 md5.c
    gcc -c -Wall -O3 zdclient.c
    zdclient.c:54: error: 'devname' redeclared as different kind of symbol
    /usr/include/stdlib.h:284: error: previous declaration of 'devname' was here
    zdclient.c: In function 'init_device':
    zdclient.c:591: error: 'SIOCGIFHWADDR' undeclared (first use in this function)
    zdclient.c:591: error: (Each undeclared identifier is reported only once
    zdclient.c:591: error: for each function it appears in.)
    zdclient.c:596: error: 'struct ifreq' has no member named 'ifr_hwaddr'
    make: *** [zdclient.o] Error 1

  21. PT says:

    使用BSD/MAC版本的代码编译

  22. VIP says:

    你好,大侠。我有一个很怪的想法,能否把这个zdcclient的代码写入linux系统的路由器里面去,这样就可以共享了。另外我用的是一个带语音网关的路由器,在校园网下不能用这个路由器。如果可以的话,我的语音网关也可以发挥作用。请给予答复。我用的是lynsys的WRTP54G路由器。

  23. BOYPT says:

    交叉编译路由器的程序,应该网上有别的资料的,你路由器的CPU是arm吧,安装个arm-gcc,重新编译一下libpcap,就可以编译路由器版本的zdclient了。

  24. Dyx5 says:

    这个神州的系统消息,貌似加过密的.

  25. juko says:

    跪求3.5.05.0617版的神州数码ZDClient客户端。。。如果能有,小弟感激不尽啊。
    ps:3.5.05.0617版的神州数码原版客户端下载地址http://mail.qq.com/cgi-bin/ftnExs_download?k=773064614b2dd8cd9f6af77b1265031d0d525602565d08001456555802480556010649580154051f08565307030753070b525c57347f317650570d155509725a505e05324115415e5053050f404b43534b30&t=exs_ftn_download&code=90da4e12

  26. racede says:

    我在硬盘盒子上的debian编译不过来好像也是iconv出问题了...用BSD的Makefile也不行,用现成编译好的提示没有glib-2.7 glib-2.4 弄了几天没弄好...可以帮我编译一个只用glib-2.4的吗?我的硬盘盒子是x86的~普通版本就ok

    mail:racede123@yahoo.com.cn

  27. racede says:

    WMU-6000FS:/zdcclient# make -f Makefile.bsd
    gcc -Wall -g -O2 -c main.c -I/usr/local/include
    main.c: In function 'signal_interrupted':
    main.c:127: warning: implicit declaration of function 'pcap_breakloop'
    gcc -Wall -g -O2 -c md5.c -I/usr/local/include
    gcc -Wall -g -O2 -c zdclient.c -I/usr/local/include
    zdclient.c: In function 'action_by_eap_type':
    zdclient.c:238: warning: implicit declaration of function 'pcap_breakloop'
    zdclient.c: In function 'send_eap_packet':
    zdclient.c:325: warning: implicit declaration of function 'pcap_sendpacket'
    gcc -Wall -g -O2 -o zdclient main.o md5.o zdclient.o /usr/lib/libpcap.a -liconv
    -I/usr/local/include -L/usr/local/lib
    /usr/bin/ld: cannot find -liconv
    collect2: ld returned 1 exit status
    make: *** [zdclient] Error 1

  28. BOYPT says:

    libiconv在Linux下是包含在glib里面的,不需要加-liconv(也不能加),而BSD下是单独的库,必须加;你修改一下使用bsd那个Makefile试试吧;

  29. racede says:

    我把Makefile.bsd的-liconv去掉了但是还是报错...

    WMU-6000FS:/zdcclient-read-only# make -f Makefile.b
    gcc -Wall -g -O2 -c main.c -I/usr/local/include
    gcc -Wall -g -O2 -c md5.c -I/usr/local/include
    gcc -Wall -g -O2 -c zdclient.c -I/usr/local/include
    gcc -Wall -g -O2 -o zdclient main.o md5.o zdclient.o /usr/lib/libpcap.a -I/usr/
    local/include -L/usr/local/lib
    main.o: In function `signal_interrupted':
    /zdcclient-read-only/main.c:127: undefined reference to `pcap_breakloop'
    zdclient.o: In function `send_eap_packet':
    /zdcclient-read-only/zdclient.c:325: undefined reference to `pcap_sendpacket'
    zdclient.o: In function `action_by_eap_type':
    /zdcclient-read-only/zdclient.c:238: undefined reference to `pcap_breakloop'
    collect2: ld returned 1 exit status
    make: *** [zdclient] Error 1

  30. racede says:

    libpcap是自己编译的1.0.0

  31. BOYPT says:

    pcap_breakloop 这些找不到肯定是libpcap没安装好了,在标准路径里面没找到libpcap.a; 你会自己编译库应该了解INC / L路径吧,自己指定或者安装到标准路径里面

  32. racede says:

    路径也没错,最后把Makefile里的“LIBS = /usr/lib/libpcap.a”改成“LIBS = -lpcap”就通过了....不管怎样~~谢谢哈~

  33. PT says:

    /usr/lib/libpcap.a是静态库,为了编译出来的文件可以在没有安装libpcap的系统运行;可能你的系统安装的位置不同?

  34. racede says:

    一样的~~在/usr/lib/也能找到它但是,就不知怎么这样...
    前段时间是在硬盘盒挂载的Debain下编译的能够正常使用

    最后直接在硬盘盒的linux下编译~成功了,但是在运行的时候出现段错误(Segmentation fault),最后把print_server_info函数和相关部分注释掉才能正常运行(呃...不懂编程,瞎着弄的~~呵呵)

    具体如下:

    ######## ZDClient ver. 0.12 $Revision: 93 $ #########
    Device: br0
    MAC: 00:50:18:11:22:33
    IP: 10.19.1.85
    MASK: 255.255.255.0
    Gateway: 0.0.0.0
    DNS: 0.0.0.0
    Client ver: 3.5.04.1110fk
    ##################################################
    >>Protocol: SEND EAPOL-Start
    >>Protocol: REQUEST EAP-Identity
    >>Protocol: SEND EAP-Response/Identity
    >>Protocol: REQUEST MD5-Challenge(PASSWORD)
    >>Protocol: SEND EAP-Response/Md5-Challenge
    >>Protocol: EAP_SUCCESS
    &&Info: Authorized Access to Network.
    Segmentation fault

  35. PT says:

    噢,神州数码的服务器信息查找过程确实很hack,只判断几个特殊点的值,可能有些地方不大合适;
    注释了看不到服务器信息而已,影响不大;

  36. huang says:

    武大现在ubuntu下,认证好像出了问题,不知道是不是学校又把标准换了,一直不能从交换机获取IP地址,不能连上网。这个情况最近两天一直出现。将标准换成3.5.04.1110fk还是不行~~~
    求助一下~~~

  37. BOYPT says:

    听说武大的神州数码已经升级到3.5版本,其协议加入动态加密字段,现在还是没办法山寨的到; 建议你们跟网络中心联系,打开标准报文认证,这样就可以使用人大版的;

  38. yg says:

    你好,交换机无法获取客户端IP地址! 是什么问题?
    我们学校用的是3.5.10.0527版的。
    怎么办?

  39. aguywant says:

    很好。。山东聊城大学测试完美通过,要是能支持无线就好了,要是能把这写到路由器里就更好了

  40. aguywant says:

    为何找不到无线网卡?

  41. zhouJfu says:

    @yg:
    @yg:
    你在本地连接添加学校分配给你的ip和mask,即wired连接,或者你直接zdclient --ip 你的ip --mask 255.255.255.0

  42. zagfai says:

    請問BLOG主. 在ARM下編譯有什麼不同嗎??

Leave a Reply

Your email address will not be published. Required fields are marked *

*

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> <pre lang="" line="" escaped="" highlight="">

Page optimized by WP Minify WordPress Plugin

 
Powered by Wordpress and MySQL. Theme by Shlomi Noach, openark.org