天翼校园客户端逆向工程

本文转载自好友 ZLM 大神的博客 。反正几个月前离开学校的时候还能用。备个份,也许能造福后人。 如果感到正文不明觉厉请直接跳到最后的 patch

原理

逆向工程得出结果如下:

首先,电信校园客户端并不是直接修改 CHAP RESPONSE 生成函数,而是通过它自己修改的 RP-PPPoE 对数据包的截取和修改来完成的。

帐号的前缀不再是调用拨号的时候加上的,而是在拨号程序内部加上的,准确地说是拨号程序截取 CHAP RESPONSE PACKET,然后对 RESPONSE HASH 进行修改,修改过后更改包中的 NAME 字段,在帐号前加前缀,并修改包中的 LENGTH 字段,使其正确反映包的长度,然后再将修改过的包发出。

拨号程序默认内置了一份前缀和密码表。默认前缀是 ^~3,密码表长度为 0x11,即共 17 个字节。对 RESPONSE 的修改选择是基于前缀的第二位。如果第二位为#,那么就采用新的方式做 RESPONSE HASH 修改;否则采用原来的方式。

原来的方式很简单。首先对 CHALLENGE(没错,是 CHALLENGE,拨号程序也会过滤进入的 CHAP PACKET,然后如果是 CHAP 0x1,也就是 CHALLENGE 包,那么就会将 CHALLENGE 保存在内存的某一位置共后续使用)按字节进行替换。假设某字节为 a,密码表为 key [],密码表中元素个数为 n,则其替换方式为 a=a+key [a&n]。替换完后,使用原来的 RESPONSE,新的 CHALLENGE 来完成一次 MD5 HASH。用这个结果作为新的 RESPONSE 交给服务器。即完成 CHAP。

新的方式有些复杂。因为它不只一种方式…… 准确地说,它是使用一种块加密算法的变体的加密和解密,以及另一种还算有名的并且有一些缺憾的流加密算法。前一种有 4 个不同的参数,分别为加、解密 16 轮和加、解密 32 轮。它将原来的 RESPONSE 作为值,然后用上述方式将 RESPONSE 的每一个字节都走一遍,然后再发出去。采用什么参数、什么算法由 RESPONSE 第一个字节 %5 来决定……

这次电信也确实学聪明了,如果你按过去的方法去查看前缀(通过 netfilter.sys 之类),那么你应该得到的前缀是 ^~3,但实际上 5 月更新已经把前缀更改为 ^#02 了,其实这都在 pdext 的配置文件中。

Patch File

https://gist.github.com/fuyufjh/242a0ff959809e43f0c5a5f29be6cdfd

使用这个做拨号时不要忘了在号码前加 ^#03