Linux下绕过校园天翼宽带客户端限制(已移植OpenWRT)

说在前面的话:

         国内很多高校的电信宽带限制用户使用路由器,具体手段是变态chap验证,因此只能用其客户端拨号。该客户端从驱动层面限制了windows的wifi共享功能,虽然有某豹wifi,但是天翼客户端的不定期更新总会使某豹wiif失效。另外,电信仅提供了Win、OS X、Android等平台的客户端,Linux用户根本无法使用。

        本篇博文根据网络上某位大神给出的算法补丁重新编译了ppp程序,实现了 Linux PC 以及 OpenWRT路由器 连接电信宽带的目标。

        之前南航有位叫什么fox的同学,他给出了修改过的pppd二进制程序,但是仅提供了2.4.4/2.4.5的版本,也仅支持部分芯片设备,最重要的是没有开放源码,本文则是根据另一位大神给出的源码补丁操作的,原文地址会在最后给出。(后来听说南航小狐狸的代码也扔Github了...)

一、源码准备

1、下载源码

这里我采用的是2.4.7的源代码,因为大神的补丁是针对2.4.7的,同时我的Dreambox上面的pppd也是2.4.7.

2、打上关键的patch

这里,我将针对chap-md5.c的补丁命名为“TianYi_DSL.patch”,文件路径是 ~/openwrt/TianYi_DSL.patch

3、其他的可选patch

其实如果只是用于桌面Linux 的ppp,下面这些补丁不是必选。
但是如果为OpenWRT交叉编译pppd,那么就必须打下这几个补丁,因为openwrt的拨号脚本里面用到了一些选项。
还是和上面一样,patch路径也是 ~/openwrt/*.patch,这些补丁是从openwrt trunk分支下面直接下载的,对应的也是2.4.7的源码。

 

二、交叉编译环境准备

1、下载toolchain

直接去openwrt官网下载已经准备好的对应芯片的工具链,这样就不用自己编译工具链了。
但是对于官网没有给出的芯片(可能是我没找到...),比如我的另一个RT5350,mipsel的架构,我就只能自己编译toolchain了。详见另一篇博文:Lenovo R2100刷机以及编译pppd实现连接天翼宽带

下面示例的是brcm63xx,mips架构的芯片。

2、配置环境变量

 

三、开始编译

如果不加参数,直接运行make,将会根据本机架构编译,之后还可以使用make install安装到当前系统中 。

四、最后的工作

下面需要登陆进入路由器配置:

然后就可以在Luci界面(web界面)配置ppoe拨号了。
需要注意的是,用户名前需要添加 ^#03 ,比如手机号为 18912345678 ,那么用户名请填写 ^#[email protected]

五、其他说明

1、上面没有给出桌面系统中ppp的安装,其实不用安装到特定目录就可以直接运行。
Debian系的发行版推荐使用pppoeconf配置拨号脚本,具体过程如下

如果安装到了指定目录并替换了原来的pppd,那么NetworkManager之类的程序应该都OK了。

2、这里展示一下strip的效果:

        如果需要进一步压缩可执行程序,(我在另一篇博文中会介绍我遇到的情况),可以选择upx压缩或者适当的编译优化选项。
当然,那些编译选项其实并没有什么好优化的,直接上upx吧。

3、在openwrt里面设置pppoe拨号的时候,请关闭该接口的开机启动选项,因为不断地错误重拨会被电信那边禁掉的。
同时在尝试连接的时候,建议您监控系统日志,如果拨号错误请及时停用接口,防止被电信锁定账户什么的。

4、桌面Linux中使用宽带连接设置请见:ADSL(PPPOE) 接入指南
5、大家有什么问题欢迎联系我,但是不保证一定都能解决哈!

六、参考资料

1、算法分析以及代码patch: 电信校园客户端逆向工程
2、OpenWRT官方wiki: Cross Compile

资源下载

ppp-2.4.7 源码:ppp-2.4.7.tar

patch打包:ppp-2.4.7-patch.tar

《Linux下绕过校园天翼宽带客户端限制(已移植OpenWRT)》有25个想法

  1. 你好,我按照你说的操作,在编译时出问题了,显示mips-openwrt-linux-uclibc-gcc.bin: cannot execute binary file: Exec format error.请问应该怎么处理?

    1. 不清楚你是怎么安装的交叉编译环境。我有个疑问:

      mips-openwrt-linux-uclibc-gcc.bin: cannot execute binary file: Exec format error.

      这里面的gcc编译器程序最后怎么会有“ .bin ”呢?希望能够提供你准备交叉编译环境的具体细节。

      1. 设置好环境变量后,用mips-openwrt-linux-uclibc-gcc 测试就输出:/home/yu/TianYi/OpenWrt-Toolchain-brcm63xx-for-mips_mips32-gcc-4.8-linaro_uClibc-0.9.33.2/toolchain-mips_mips32_gcc-4.8-linaro_uClibc-0.9.33.2/bin/mips-openwrt-linux-gcc: line 82: /home/yu/TianYi/OpenWrt-Toolchain-brcm63xx-for-mips_mips32-gcc-4.8-linaro_uClibc-0.9.33.2/toolchain-mips_mips32_gcc-4.8-linaro_uClibc-0.9.33.2/bin/mips-openwrt-linux-uclibc-gcc.bin: cannot execute binary file: Exec format error
        /home/yu/TianYi/OpenWrt-Toolchain-brcm63xx-for-mips_mips32-gcc-4.8-linaro_uClibc-0.9.33.2/toolchain-mips_mips32_gcc-4.8-linaro_uClibc-0.9.33.2/bin/mips-openwrt-linux-gcc: line 82: /home/yu/TianYi/OpenWrt-Toolchain-brcm63xx-for-mips_mips32-gcc-4.8-linaro_uClibc-0.9.33.2/toolchain-mips_mips32_gcc-4.8-linaro_uClibc-0.9.33.2/bin/mips-openwrt-linux-uclibc-gcc.bin: Success
        然后编译也是出现这个结果。

        1. 感谢反馈,问题应该是这样的:

          openwrt提供的工具链里面的mips-openwrt-linux-gcc是一个指向mips-openwrt-linux-uclibc-gcc的软链接,然而后者又是一个指向mips-openwrt-linux-uclibc-wrapper.sh的软链接,也就是说最后到了一个脚本这里进行处理,然后这个脚本根据配置会调用mips-openwrt-linux-uclibc-gcc.bin这个可执行程序,这才是真正的 gcc 编译器。。。

          这个我之前也没注意,我的错。。。

          然后你的问题就很明显了,你运行的应该是32位的系统吧,openwrt给的这个是64位的,使用file命令就能看到。所以你要么自己编译toolchain,要么找个64位系统运行去吧。(这个其实仅仅是我的猜测,猜对了到话记得告诉我哈)

          1. 恩,我运行的是32位系统。然后我自己编译了一个toolchain,可以使用,但是在交叉编译时有新的错误,这是输出:
            make[2]: Entering directory ‘/home/yu/TianYi/ppp-2.4.7/pppd/plugins/rp-pppoe’
            mips-openwrt-linux-gcc -O2 -g -I../../../include ‘-DRP_VERSION=”3.8p”‘ -I../../.. -c -o plugin.o -fPIC plugin.c
            In file included from pppoe.h:96:0,
            from plugin.c:29:
            /home/yu/openwrt/trunk/bin/ar71xx/OpenWrt-Toolchain-ar71xx-generic_gcc-4.8-linaro_musl-1.1.10.Linux-i686/toolchain-mips_34kc_gcc-4.8-linaro_musl-1.1.10/include/netinet/if_ether.h:96:8: error: redefinition of ‘struct ethhdr’
            struct ethhdr {
            ^
            In file included from pppoe.h:84:0,
            from plugin.c:29:
            /home/yu/openwrt/trunk/bin/ar71xx/OpenWrt-Toolchain-ar71xx-generic_gcc-4.8-linaro_musl-1.1.10.Linux-i686/toolchain-mips_34kc_gcc-4.8-linaro_musl-1.1.10/include/linux/if_ether.h:139:8: note: originally defined here
            struct ethhdr {
            ^
            Makefile:54: recipe for target ‘plugin.o’ failed
            make[2]: *** [plugin.o] Error 1

            make[1]: Entering directory ‘/home/yu/TianYi/ppp-2.4.7/pppd’
            mips-openwrt-linux-gcc -O2 -pipe -Wall -g -DHAVE_PATHS_H -DIPX_CHANGE -DHAVE_MMAP -I../include ‘-DDESTDIR=”/usr/local”‘ -DCHAPMS=1 -DMPPE=1 -DHAS_SHADOW -DHAVE_CRYPT_H=1 -DHAVE_LOGWTMP=1 -DUSE_CRYPT=1 -DHAVE_MULTILINK -DUSE_TDB=1 -DPLUGIN -DINET6=1 -DMAXOCTETS -c -o sys-linux.o sys-linux.c
            In file included from sys-linux.c:76:0:
            /home/yu/openwrt/trunk/bin/ar71xx/OpenWrt-Toolchain-ar71xx-generic_gcc-4.8-linaro_musl-1.1.10.Linux-i686/toolchain-mips_34kc_gcc-4.8-linaro_musl-1.1.10/include/sys/errno.h:1:2: warning: #warning redirecting incorrect #include to [-Wcpp]
            #warning redirecting incorrect #include to
            ^
            sys-linux.c: In function ‘sif6addr’:
            sys-linux.c:2599:22: error: storage size of ‘rt6’ isn’t known
            struct in6_rtmsg rt6;
            ^
            sys-linux.c:2599:22: warning: unused variable ‘rt6’ [-Wunused-variable]
            : recipe for target ‘sys-linux.o’ failed
            make[1]: *** [sys-linux.o] Error 1
            make[1]: Leaving directory ‘/home/yu/TianYi/ppp-2.4.7/pppd’
            Makefile:13: recipe for target ‘all’ failed
            make: *** [all] Error 2
            请你继续帮忙解决下,谢谢啦!

          2. 第一个error是结构体的重复定义,因为两个头文件里面都有对它的定义,是uclibc库的问题,如果为本地架构编译的话,就不会有这个问题。解决方法就是打补丁:132-fix_linux_includes.patch。另外,140-pppoe_compile_fix.patch这个补丁好像也能解决问题,未亲测。
            第二个error大概是有关ipv6地址的问题,我也不懂。。。
            你先打上132那个补丁,然后再试试。如果还不行,请确认一下之前的一个ipv6的补丁有没有打。
            期待你的好消息!

  2. 打了132-fix_linux_includes.patch的补丁,第一个错误还在,第二个错误变成类型未定义了。。。

    make[1]: Entering directory ‘/home/yu/TianYi/ppp-2.4.7/pppd’
    mips-openwrt-linux-gcc -O2 -pipe -Wall -g -DHAVE_PATHS_H -DIPX_CHANGE -DHAVE_MMAP -I../include ‘-DDESTDIR=”/usr/local”‘ -DCHAPMS=1 -DMPPE=1 -DHAS_SHADOW -DHAVE_CRYPT_H=1 -DHAVE_LOGWTMP=1 -DUSE_CRYPT=1 -DHAVE_MULTILINK -DUSE_TDB=1 -DPLUGIN -DINET6=1 -DMAXOCTETS -c -o sha1.o sha1.c
    In file included from sha1.c:21:0:
    ../include/net/ppp_defs.h:182:5: error: unknown type name ‘time_t’
    time_t xmit_idle; /* time since last NP packet sent */
    ^
    ../include/net/ppp_defs.h:183:5: error: unknown type name ‘time_t’
    time_t recv_idle; /* time since last NP packet received */
    ^
    : recipe for target ‘sha1.o’ failed
    make[1]: *** [sha1.o] Error 1

    1. 我已经看到希望了!
      首先,之前的两个error明明不在了。。。。
      这次只有一个error,是有关ppp_defs.h头文件里面time_t结构体未定义的问题。
      打下这个补丁:133-fix_sha1_include.patch,另外可能的话也需要打下这个补丁:130-no_cdefs_h.patch。
      其实这些error信息把问题暴露的很明显,然后到openwrt的官方代码库里去找patch即可,根据patch名字基本上都能找到的。

      1. 恩,我按照错误提示打上相应的补丁,成功编译了!谢谢你这几天的热心帮助!!!

  3. 小白一个,不喜欢上淘宝买破解版的路由器,喜欢自己折腾。
    学校的宽带是先在系统的宽带连接拨号,然后会自动跳转到http://125.88.59.131:10001/?wlanuserip=192.168.242.54&wlanacip=183.57.32.32这样一个登陆页面,请问我们学校是哪一种认证方式,能否使用你的方法。

    1. 看起来好复杂。。。
      你们是不是先连接的ChinaNET的wifi,然后再系统宽带连接,最后跳转web认证?
      有个问题啊,都宽带连接了,干啥还要web认证。。。。
      最后,回答你的问题,很明显,你的应该用不了,我们这边的都是电信有线宽带。

  4. 为什么patch出现:
    [[email protected]:/openwrt]#patch -p1 < ../TianYi_DSL.patch
    -ash: can't open ../TianYi_DSL.patch: no such file
    -ash: patch: not found

    这是怎么回事??

      1. 我那个是在本地开发环境中打的补丁,你竟然在路由器里面做这个。。。
        第一个错误就是那个文件不在,我不知道你解压的路径出了什么问题。
        第二个错误,patch这个工具没有呗,路由器里面肯定没有安装开发环境。。。

  5. 博主您好 ,那个 电信校园客户端逆向工程的网页根本进不去。。。能否发一份网页给我参考,想要研究一下这个算法 还有patch包中的TianYi_DSL.patch是否不完整 在WINDOWS下用记事本打开文件的最后是static struct chap_digest_type md5_digest = {
    花括号都没完全….

    1. 你好,那个blog确实进不去了。。。我也没办法,不过主要代码都在那个patch里面。
      然后至于你说的代码不完整。。。看来你没玩过Linux。。。建议你去学习一下Linux下面代码patch的基础知识

    1. 额,不知道。。。我都很久没碰这个了,我们学校这边有点复杂。有的帐号可以用这个破解算法,有的连这个破解算法都不能用,有的普通路由器都可以用。。。反正电信很恶心。。。各种奇葩。。。

    1. 不好意思,并不清楚安徽的情况,而且这个方法在南京也早已经失效了。

  6. 为什么同样的代码,openwrt-sdk-18.06.8-ramips-mt7620_gcc-7.3.0_musl.Linux-x86_64.tar这个sdk中的toolchain-mipsel_24kc_gcc-7.3.0_musl编译工具编译会出错,但是使用OpenWrt-Toolchain-ramips-for-mipsel_24kec+dsp-gcc-4.8-linaro_uClibc-0.9.33.2这个编译工具就能正常编译

    1. musl 和 uClibc是两个不同的 C 库, 不兼容的地方很多。 因为 musl 性能、体积等方面的原因, openwrt 后来全部转用 musl 编译了

  7. 多谢大神,那有什么办法能让这个代码使用musl编译工具链编译呢

Lios进行回复 取消回复

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