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

一直以来在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,不是我不想睡,而是有问题晾在那里没解决就睡觉的话,就只会整晚失眠了。逃了一天课,终于大功告成,本来还想实现配置文件的功能,不过想想还是算了,很容易就能用脚本来记录。

文章分类 Unix/Linux 标签: , , , ,
52 comments on “神州数码802.1x认证的C语言版客户端
  1. liangsuilong说道:

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

  2. 刘群说道:

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

    gcc -m32 helloworld.c -o helloworld

    gcc -march=i386 helloworld.c -o helloworld

  3. 刘群说道:

    其他客户端:

    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说道:

    毛毛发来贺电~~~

  5. PT说道:

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

  6. cc说道:

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

  7. PT说道:

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

  8. abcdcan说道:

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

  9. PT说道:

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

  10. mac用户说道:

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

  11. dlinux说道:

    如何加入广州大学linuxQQ群

  12. Insion说道:

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

  13. Allyez说道:

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

  14. BOYPT说道:

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

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

  15. jpzj说道:

    太感动了~~

    WINDOWS7 上这个软件完美~~

  16. jpzj说道:

    太感动了~~

    WINDOWS7下用这个软件完美~

  17. Insion说道:

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

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

  18. Insion说道:

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

  19. BOYPT说道:

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

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

  20. Insion说道:

    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说道:

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

  22. VIP说道:

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

  23. BOYPT说道:

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

  24. Dyx5说道:

    学习.

  25. Dyx5说道:

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

  26. juko说道:

    跪求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

  27. racede说道:

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

    mail:racede123@yahoo.com.cn

  28. racede说道:

    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

  29. BOYPT说道:

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

  30. racede说道:

    我把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

  31. racede说道:

    libpcap是自己编译的1.0.0

  32. BOYPT说道:

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

  33. racede说道:

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

  34. PT说道:

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

  35. racede说道:

    一样的~~在/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

  36. PT说道:

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

  37. huang说道:

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

  38. BOYPT说道:

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

  39. yg说道:

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

  40. aguywant说道:

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

    • meng说道:

      我是小白,请问现在的神州数码还能用zdclient上网吗?我在linux下用了好多版本都失败了。请问大神怎么成功的?看你的回复是2010年,应该是升级之后,跪求方法!

  41. aguywant说道:

    为何找不到无线网卡?

  42. zhouJfu说道:

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

  43. zagfai说道:

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

  44. 23jsj说道:

    我还以为是模拟器呢

  45. 23jsj说道:

    等以后有了再下载吧。哎

  46. hana说道:

    许多路由器是不支持神州数码验证方式的 不知道博主有没有方法让路由器支持神州数码呢

  47. varick说道:

    我们学校的神州数码客户端是3.5.10的,如果你需要我可以发给你。

    我新买了一台笔记本学习Linux,但是发现帐户是和mac绑定在一起的。然后我修改了新电脑的mac地址使他和我原来电脑mac一样,登录成功,可是10秒钟之后出现:

    DigitalChinaSupplicant
    —————————
    您更改了认证网卡的MAC地址!禁止登录!

    我觉得它应该是通过我本地客户端对我电脑检测识别出来的。

    具体是别方式我还是不能理解。我通过修改注册表修改的mac。新电脑系统(win7 64位)不过有可能是对硬件扫描,但可能不大,估计有其他方式。

    之所以这么判断是因为,我既然先修改ip和mac之后,能够登陆上,也就是网络中心服务器对我新电脑判断应该是被欺骗成功了。

    我的想法是能不能反编译知道客户端是怎么知道我修改过mac,或者山寨一个客户端不扫描mac。

    我原本想找姚琦那个客户端,但是无法访问他个人网站,网易博客也因为在他博客留言被删除了。可能涉嫌打扰他人。

    其次我想了解你这款登录器是怎么做到山寨的呢?(源码链接错误无法下载。)

    再者,反编译技术确实不怎样。所以现在也没弄出所以然来。希望能够得到您的帮助。

    谢谢。

    by :xiaov888@qq.com

    name:varick

    • BOYPT说道:

      这个好像是很旧的版本号吧。姚琦那个和我那套的版本协议上是一致的,我好像也有做了win32的版本,在项目页可以下载的了。

      Windows下检测MAC地址还是可以的,官方客户端检测到也不奇怪。

  48. ouyangshiliang说道:

    博主,我把你的源码编译成openwrt能用的可执行文件,能够运行,但是却不能够正常的获取网卡信息,不能找到正确的网卡发送报文,导致失败,请问博主这是什么缘故啊

  49. zkper说道:

    能分享份c语言源代码么?用来研究下,十分感谢!

发表评论

电子邮件地址不会被公开。 必填项已用*标注

*