说在前面的话:
国内很多高校的电信宽带限制用户使用路由器,具体手段是变态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.
1 2 3 4 5 6 |
$ mkdir openwrt && cd openwrt $ git clone git@github.com:paulusmack/ppp.git # 从github上clone代码 $ mv ppp ppp-2.4.7 # 重命名为ppp-2.4.7 |
2、打上关键的patch
这里,我将针对chap-md5.c的补丁命名为“TianYi_DSL.patch”,文件路径是 ~/openwrt/TianYi_DSL.patch
1 2 |
$ cd ppp-2.4.7 $ patch -p1 < ../TianYi_DSL.patch |
3、其他的可选patch
其实如果只是用于桌面Linux 的ppp,下面这些补丁不是必选。
但是如果为OpenWRT交叉编译pppd,那么就必须打下这几个补丁,因为openwrt的拨号脚本里面用到了一些选项。
还是和上面一样,patch路径也是 ~/openwrt/*.patch,这些补丁是从openwrt trunk分支下面直接下载的,对应的也是2.4.7的源码。
1 2 3 4 |
$ patch -p1 < ../100-debian_ip-ip_option.patch $ patch -p1 < ../110-debian_defaultroute.patch $ patch -p1 < ../120-debian_ipv6_updown_option.patch $ patch -p1 < ../320-custom_iface_names.patch |
二、交叉编译环境准备
1、下载toolchain
直接去openwrt官网下载已经准备好的对应芯片的工具链,这样就不用自己编译工具链了。
但是对于官网没有给出的芯片(可能是我没找到...),比如我的另一个RT5350,mipsel的架构,我就只能自己编译toolchain了。详见另一篇博文:Lenovo R2100刷机以及编译pppd实现连接天翼宽带
下面示例的是brcm63xx,mips架构的芯片。
1 2 |
$ wget "http://downloads.openwrt.org/barrier_breaker/14.07/brcm63xx/generic/OpenWrt-Toolchain-brcm63xx-for-mips_mips32-gcc-4.8-linaro_uClibc-0.9.33.2.tar.bz2" $ tar -jxvf OpenWrt-Toolchain-brcm63xx-for-mips_mips32-gcc-4.8-linaro_uClibc-0.9.33.2.tar.bz2 |
2、配置环境变量
1 2 3 4 5 6 7 8 9 10 11 |
$ vim ~/.profile # 我一般喜欢配置在这里,其他地方比如/etc/profile、~/.bashrc都一样。 # 添加下面这行内容 export PATH=$PATH:~/openwrt/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 # 路径名很长,自己可以随意重命名,只有path里面有最关键的bin目录就行。 $ source ~/.profile # 重新加载配置文件 $ mips-openwrt-linux-gcc # 测试是否可用,具体的程序名由你的 toolchain 目标架构决定。 |
三、开始编译
1 2 3 4 |
$ cd ~/openwrt/ppp-2.4.7 $ ./configure $ make CC=mips-openwrt-linux-gcc LD=mips-openwrt-linux-ld # 为路由器进行交叉编译。 |
如果不加参数,直接运行make,将会根据本机架构编译,之后还可以使用make install安装到当前系统中 。
四、最后的工作
1 2 3 4 5 6 |
$ mips-openwrt-linux-strip ~/openwrt/ppp-2.4.7/pppd/pppd $ mips-openwrt-linux-strip ~/openwrt/ppp-2.4.7/pppd/plugins/rp-pppoe/rp-pppoe # 上面两个步骤是在移除可执行程序中的符号表,减小体积。 $ scp ppp-2.4.7/pppd root@[IP_addr]:/root/pppd_new $ scp ppp-2.4.7/pppd/plugins/rp-pppoe/rp-pppoe.so root@[IP_addr]:/root/rp-pppoe.so_new |
下面需要登陆进入路由器配置:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
$ ssh root@[IP_addr] OpenWRT:~# cp /usr/sbin/pppd ./pppd_bak OpenWRT:~# cp /usr/lib/pppd/2.4.5/rp-pppoe.so ./rp-pppoe.so_bak OpenWRT:~# mkdir /usr/lib/pppd/2.4.7 && cp ./rp-pppoe.so /usr/lib/pppd/2.4.7/ (最新更新于20150830) OpenWRT:~# mkdir /usr/local && mkdir /usr/local/lib && mkdir /usr/local/lib/pppd && mkdir /usr/local/lib/pppd/2.4.7 OpenWRT:~# cp ./rp-pppoe.so /usr/local/lib/pppd/2.4.7/ # 因为之前采用建立软连接的方式,导致wan口无法拨号。 # 新建wan口时日志里报错daemon.notice netifd: wan0 (8734): sh: /usr/lib/pppd/2.4.7/rp-pppoe.so: unknown operand # 原因在于不同程序对软连接目标的相对、绝对位置处理不同,所以干脆直接建立新的目录。 (旧的方法,不建议使用,因为软连接的目标定位依赖于程序的当前工作目录,会出各种意想不到的问题) OpenWRT:~# mkdir /usr/local || ln -s /usr/lib /usr/local/lib # 因为编译的时候,默认安装位置是/usr/local,懒得重新编译了,所以就直接建了个软连接 |
然后就可以在Luci界面(web界面)配置ppoe拨号了。
需要注意的是,用户名前需要添加 ^#03 ,比如手机号为 18912345678 ,那么用户名请填写 ^#0318912345678@njxy
五、其他说明
1、上面没有给出桌面系统中ppp的安装,其实不用安装到特定目录就可以直接运行。
Debian系的发行版推荐使用pppoeconf配置拨号脚本,具体过程如下
1 2 3 4 5 6 7 8 9 10 |
$ sudo ln -s /usr/lib/pppd /usr/local/lib/pppd $ sudo mkdir /usr/local/lib/pppd/2.4.7/ $ sudo cp ~/openwrt/ppp-2.4.7/pppd/plugins/rp-pppoe/rp-pppoe.so /usr/local/lib/pppd/2.4.7/ # 准备好动态链接库文件 $ sudo pppoeconf # 自动生成DSL拨号配置 $ sudo ~/openwrt/ppp-2.4.7/pppd/pppd call dsl-provider # 进行拨号 |
如果安装到了指定目录并替换了原来的pppd,那么NetworkManager之类的程序应该都OK了。
2、这里展示一下strip的效果:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
##### stip之前 ##### $ ls -hl ppp-2.4.7/ppps/pppd ppp-2.4.7/pppd/plugins/rp-pppoe/rp-pppoe.so -rwxrwxr-x 1 king king 67K 7月 6 01:12 plugins/rp-pppoe/rp-pppoe.so -rwxrwxr-x 1 king king 895K 7月 6 01:13 pppd ##### 进行strip操作 ##### $ mips-openwrt-linux-strip ppp-2.4.7/pppd/pppd $ mips-openwrt-linux-strip ppp-2.4.7/pppd/plugins/rp-pppoe/rp-pppoe.so ##### strip之后 ##### $ ls -hl ppp-2.4.7/pppd/pppd ppp-2.4.7/pppd/plugins/rp-pppoe/rp-pppoe.so -rwxrwxr-x 1 king king 24K 7月 6 01:14 plugins/rp-pppoe/rp-pppoe.so -rwxrwxr-x 1 king king 305K 7月 6 01:14 pppd |
如果需要进一步压缩可执行程序,(我在另一篇博文中会介绍我遇到的情况),可以选择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
你好,我按照你说的操作,在编译时出问题了,显示mips-openwrt-linux-uclibc-gcc.bin: cannot execute binary file: Exec format error.请问应该怎么处理?
不清楚你是怎么安装的交叉编译环境。我有个疑问:
这里面的gcc编译器程序最后怎么会有“ .bin ”呢?希望能够提供你准备交叉编译环境的具体细节。
设置好环境变量后,用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
然后编译也是出现这个结果。
感谢反馈,问题应该是这样的:
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位系统运行去吧。(这个其实仅仅是我的猜测,猜对了到话记得告诉我哈)
恩,我运行的是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
请你继续帮忙解决下,谢谢啦!
第一个error是结构体的重复定义,因为两个头文件里面都有对它的定义,是uclibc库的问题,如果为本地架构编译的话,就不会有这个问题。解决方法就是打补丁:132-fix_linux_includes.patch。另外,140-pppoe_compile_fix.patch这个补丁好像也能解决问题,未亲测。
第二个error大概是有关ipv6地址的问题,我也不懂。。。
你先打上132那个补丁,然后再试试。如果还不行,请确认一下之前的一个ipv6的补丁有没有打。
期待你的好消息!
打了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
我已经看到希望了!
首先,之前的两个error明明不在了。。。。
这次只有一个error,是有关ppp_defs.h头文件里面time_t结构体未定义的问题。
打下这个补丁:133-fix_sha1_include.patch,另外可能的话也需要打下这个补丁:130-no_cdefs_h.patch。
其实这些error信息把问题暴露的很明显,然后到openwrt的官方代码库里去找patch即可,根据patch名字基本上都能找到的。
恩,我按照错误提示打上相应的补丁,成功编译了!谢谢你这几天的热心帮助!!!
小白一个,不喜欢上淘宝买破解版的路由器,喜欢自己折腾。
学校的宽带是先在系统的宽带连接拨号,然后会自动跳转到http://125.88.59.131:10001/?wlanuserip=192.168.242.54&wlanacip=183.57.32.32这样一个登陆页面,请问我们学校是哪一种认证方式,能否使用你的方法。
看起来好复杂。。。
你们是不是先连接的ChinaNET的wifi,然后再系统宽带连接,最后跳转web认证?
有个问题啊,都宽带连接了,干啥还要web认证。。。。
最后,回答你的问题,很明显,你的应该用不了,我们这边的都是电信有线宽带。
为什么patch出现:
[root@PandoraBox:/openwrt]#patch -p1 < ../TianYi_DSL.patch
-ash: can't open ../TianYi_DSL.patch: no such file
-ash: patch: not found
这是怎么回事??
麻烦LZ 大家可以给我解答一下么???
我那个是在本地开发环境中打的补丁,你竟然在路由器里面做这个。。。
第一个错误就是那个文件不在,我不知道你解压的路径出了什么问题。
第二个错误,patch这个工具没有呗,路由器里面肯定没有安装开发环境。。。
谢谢!
博主您好 ,那个 电信校园客户端逆向工程的网页根本进不去。。。能否发一份网页给我参考,想要研究一下这个算法 还有patch包中的TianYi_DSL.patch是否不完整 在WINDOWS下用记事本打开文件的最后是static struct chap_digest_type md5_digest = {
花括号都没完全….
你好,那个blog确实进不去了。。。我也没办法,不过主要代码都在那个patch里面。
然后至于你说的代码不完整。。。看来你没玩过Linux。。。建议你去学习一下Linux下面代码patch的基础知识
南航那个作者把东西开源了,貌似是毕业离校不维护了。
https://github.com/Noisyfox/ty_pppd_legacy
您好博主请问,我已经再Kali 里编译了 pppd苏州这边的学校应该怎么填写用户呢?
额,不知道。。。我都很久没碰这个了,我们学校这边有点复杂。有的帐号可以用这个破解算法,有的连这个破解算法都不能用,有的普通路由器都可以用。。。反正电信很恶心。。。各种奇葩。。。
安徽地区的拨号应该加什么??
不好意思,并不清楚安徽的情况,而且这个方法在南京也早已经失效了。
为什么同样的代码,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这个编译工具就能正常编译
musl 和 uClibc是两个不同的 C 库, 不兼容的地方很多。 因为 musl 性能、体积等方面的原因, openwrt 后来全部转用 musl 编译了
多谢大神,那有什么办法能让这个代码使用musl编译工具链编译呢