关于免(和谐)流的调查研究

所谓免流就是指使用运营商(移动/联通/电信)的数据链接但产生的数据流量不计入收费流量,这主要通过利用运营商的计费漏洞来实现。

就目前的实现方法来看,模式主要如下

1. 在终端设备(Android/iPhone)中搭建php运行环境。

2. 后台运行php脚本来搭建一个proxy server,并构建Web UI以便于调试与设置。

PS:目前已出现可直接实现proxy功能的android app(samp/samProxy)或binary(nginx/3proxy/transproxy/u2nl…),不需构建php环境及php脚本即可实现proxy server功能。

3.将应用程序联网请求导向本地proxy server,proxy server对数据流进行特定封装以实现免流。

由于撸主没有iOS设备,下面以Android为例作详细说明。

一、php运行环境

目前貌似已有两种,即almp(Android Lighttpd Mysql PHP)、anmpp(Android Nginx MySQL PHP-FPM PostgreSQL和samp(具体是啥未知,姑且算作运行环境加proxy server,但貌似不是php)

almp以Lighttpd作为Web Server。PS:奇怪的是我大谷歌却搜不到它的相关信息(无论以almp还是Android Lighttpd Mysql PHP作为keywords),难道是“中国特色”?

anmpp以NGINX作为Web Server,PHP-FPM与之搭配,提供了常用的MYSQL数据库支持,更是对强大的POSTGRESQL作了支持[1]。官网 http://anmpp.net/,貌似也是国人所为,真是逆天啊(PS:好像是国人重新编译并整合了arm下的集成环境,各个组件早就出现在x86平台了,所以也不是特别逆天)。哦,找到这两个php环境的关系了:

ANMPP与ALMP是二个完全免费的基于ARM ANDROID的PHP集成环境,其中ANMPP有一个专属的官方主页,ALMP的下载也可以在ANMPP的主页被提供,ALMP是早期制作的。

月光博客——基于安卓的网站服务器

至于samp,网上说almp原本不是为了免流而开发的,而且需要root,而samp是圣子专门为了免流开发的而且好像可以不用root,而且samp免流听说可以在线看电影[2]。不同于其它两种,samp是一个android app,解测试版的apk包能看到proxydroid这个二进制可执行文件以及一些lib,而看不到php脚本。而解1.0版本以后的包则看不到proxydroid这个binary。所以推测samp是具有代理功能的android 原生app,应该不是通过给具有proxy功能的binary传参实现的(事实也的确如此)。

二、proxy server及其对数据的定向与封装

这里撸主不甚清楚,故直接引用刀云免流论坛的一个帖子以供参考,算是基本背景吧。

在这里感谢 菊花 老虎 盗版 圣子 惜笔 扫地僧
1、为什么会有免流漏洞
运营商为了给客户提供方便,提供了一些优惠政策,如:接收彩信、登陆掌厅免除流量费以及免收取流量费的其他业务。
运营商的计费系统为了区分用户使用的是免流量业务还是正常访问互联网会把这些免流服务的网址加入到白名单,这些白名单中的网址就是我们平常所说的免流IP了,当计费系统检测到用户访问的是白名单中的网址或接收彩信时就不会进行扣费。
问题就出在检测上了,各运营商、各地区的检测方式都不尽相同,而且并不完善,这就形成了免流的出现和不同的免流模式以及地区的限制。那么计费系统是如何检测的呢?当用户访问互联网时,会向服务器发送一条请求信息(请求头),这个请求头中包含了网络服务器与用户的所有交互信息如:访问的网址、UA、网络协议、主机(host)、Cookie、来源地址、文件类型等很多信息。计费系统通过检测请求头来分辨用户访问的是不是白名单中的网址或者是接收彩信。但是计费系统检测的是用户发来的请求信息,这条信息是来自于用户的,也就是说通过自定义该信息可以达到欺骗计费检测以达到免流上网的目的。
2、如何欺骗
菊花点穴手:
一些手机软件大神直接修改软件的请求信息,最早的就是菊花大神了。他编写了一个java的网络请求类(http.class),它负责发送能欺骗计费系统的网络请求头。菊花在请求头中把请求的网址(host)换成了免流的网址‘host:免流IP’,并在该信息后面添加了一条另一种表示网址的信息‘x-online-host:实际网址’。这样计费系统会检测到用户访问的是免流网址,但是网络服务器返回给用户的却是实际网址的网页,这是因为计费系统和网络服务器的不一致导致的。
菊花把http.class放到UC浏览器中,然后通过修改代码调用它,从此世界上就诞生了一个伟大的软件——菊花UC,后来人们把http.class提取出来,放到其他软件中并修改代码,这样其他Java软件也能免流了。安卓软件免流与这个类似。到2013年,运营商调整计费系统当出现这种情况时以x-online-host为准,从此世界上第一次出现了‘菊花和谐’这个词。
老虎会游泳:
老虎是一个PHP程序员,他用PHP开发了一个免流代理服务器系统,后来被别人修改并命名为XX免流系统。
PHP无法直接在安卓手机上运行,安装almp或anmpp后会把手机配置成一个PHP网站服务器。免流系统运行在网站的根目录(www文件夹)中,通过修改anmpp设置将网站接收的所有请求传给Proxy.php,这样就实现了把网站服务器变成代理服务器。这个代理服务器的IP就是127.0.0.1。我把它称之为本地代理。
通过修改APN把10.0.0.172改成127.0.0.1即可使数据走免流系统。但有些程序并不会去走这个代理,所以就出现了我们常说的跳点。
当用户通过本地代理上网时,用户发送的请求头会发给免流系统,免流系统接收到请求头后调用设置好的模式进行修改,之后再由免流系统把修改后的请求头发送给网络服务器达到免流上网的目的,俗称全局免流。
其他:
可以直接修改安卓系统,让安卓系统去修改网络请求信息。为什么老虎不这么做呢?因为他只会PHP。目前还没有民间的开发者能做得到。可能是未来免流的发展方向。
3、各免流模式的欺骗原理
菊花模式:
已和谐,这个的原理在上面讲过了,我这里想说的是在老虎开发的免流系统中,菊花模式的php文件后来被一些人修改成了好多种模式并以他网名来命名这种模式。
川免模式:
已和谐,在四川移动掌厅有一个免流下载的链接前缀,系统将请求头中的网址前面加上这个免流前缀实现免流量的目的,这种模式是前缀模式的一种,后来被修改成了华纳模式、错导模式等。
前缀免流比菊花免流出现的早,最初是用来免流下载。之后小毅(也是PHP程序员)的玖玩浏览器(压流网站)开创了通过前缀免流上网的时代。玖玩网是比较早的讨论免流的论坛了,现在听一个站长说已经被他网站合并了。现在玖玩浏览器扔然有人在用。
后缀模式:
已和谐,这个应该是联通的模式,某些地区的联通计费系统只要在请求的网址中检测到了wap.10010.com就认定为免流,所以免流系统在请求的网址后面加了个?wap.10010.com或&wap.10010.com达到免流目的。
伪彩模式:
上文中讲过的,接收彩信是不花流量的,计费系统是通过判断请求头中的文件类型信息来判断彩信的,免流系统把文件类型信息改成application/vnd.wap.mms-message,这就把所有流量都伪装成了彩信,所以会免流。
其他:
我没有看过其他模式的源码,所以这里就不再多讲了,都是和菊花类似。
4、防跳原理
禁网:
安全软件利用安卓系统内置的防火墙模块实现禁止应用连接互联网,因为跳点是不经过本地代理的,所以会连不上网。不跳点的软件是通过本地代理进行联网的,免流系统是运行于root之上,所以不会被禁网,这样免流的软件在禁网之后仍可以连接网络。
防跳脚本:
防跳脚本也是利用防火墙模块,所以会与禁网有冲突,不过防跳脚本不是单纯的禁网,它实现了智能化的防跳,脚本包含了设置防火墙的命令,它可以强制让不走本地代理的软件走代理即127.0.0.1,并且仍可以起到禁网的效果,对于那些免流系统不支持的协议如QQ,则可以进行排除以让其能够联网,实现半免。
5、WiFi托电脑免流
当全局免流的手机共享出WiFi热点,电脑连接后会与手机组成无线局域网,这时手机和电脑都会被分配一个局域网的IP,以192.168开头,手机的IP是192.168.43.1,因为手机被配置成了免流代理服务器,所以在电脑上设置代理为192.168.43.1就能走免流了,但必须开启手机防跳脚本或禁止电脑某些不走代理的软件联网,否则电脑也会跳点,手机禁网是没用的。

——刀云论坛>免流原理和各模式简介[3]

各种模式的原理:

直连模式:不对HTTP数据包进行修改,而是直接将数据转发到特定代理服务器。可能CCG只是检测destination server ip是否为某一特定服务器来判定是否计费。这种代理服务器一般为运营商的营业厅网站或其他服务的服务器,现在基本和谐。这种判定方法不需要对tcp包进行深度解析,因此效率很高,对运营商的服务器消耗不大,可谓简陋而高效。后来运营商发现了有用户用此方法来欺骗CCG后,就进行了修复。至于如何修复的,撸主猜测有以下可能:一是直接更新服务器软件,取消其代理功能;二是修改判定方法,通过进一步解析HTTP Header来判定,但代价是效率降低,服务器开销增加。

菊花模式:
有的版本修改HTTP请求头为如下格式:
GET/POST $uri HTTP/1.x\r\nHost: real.host\r\nX-Online-Host: deceptive.host\r\n……\r\n\r\n
抓包可看到如下文本:
GET/POST $uri HTTP/1.x
Host: real.host
X-Online-Host: deceptive.host
……

由GET/POST $uri 可知,该请求可以直接发给target web server,X-Online-Host字段由于web server不认识,所以不会对会话产生任何影响。如果要经过proxy server,那么这个proxy server必须是透明的。如果要经过WAP接入点的10.0.0.172代理,可能会产生奇怪的结果,因为有些172代理会将X-Online-Host指定的Host作为目标,这样的话以上请求就会都发向deceptive.host。个人认为X-Online-Host是Java时代的历史遗留问题,现在大多数172代理应该已经都废弃了这个字段了吧。

也有版本修改请求头为如下格式:
GET/POST http://deceptive.host$uri HTTP/1.x\r\nHost: deceptive.host\r\nX-Online-Host: real.host\r\n……\r\n\r\n
抓包可看到如下文本:
GET/POST http://deceptive.host$uri HTTP/1.x
Host: deceptive.host
X-Online-Host: real.host
……

圣子模式:

前缀模式:

后缀模式:

中缀模式:

伪装彩信模式:

双GET(Method)模式:

双Host模式:

CONNECT模式:

三、代理服务器本身以及数据定向与封装产生的问题 TODO

1. 30M下载限制

2. 无法登陆(cookie传递)

3. 端口置换(防跳)

4. https请求

5. 延时与脚本执行等待

四、proxy server binaries

由于php作为一种脚本语言,代码执行效率相对低下,运行环境的构建要耗用较多系统资源,对低端设备来说,运行起来是比较吃力的,而且可能会影响上网速度(此处对于网速是如何被影响的不是很了解,推测可能为并发连接数比较低或者代理脚本本身的缺陷吧)。而直接从高级语言(比如C语言)编译而来的binary可执行文件的执行效率就比较高了。

就在最近(2014年9月24日),有大神o77发帖称可以使用nginx的反向代理功能脱离php环境和php脚本直接实现全局代理。而nginx具有极高的执行效率和强大的最高并发数,想必真真是极好的。现将o77的帖子引用如下:

[标题]:nginx研发,除https再无任何限制-阅(793)
[时间]:2014-9-24 0:39:00
———-
如题啦,无聊就继续研究nginx的功能,没想到还真让自己搞出来了。
作用:透明代理,nginx无需php和www,所有代理直接又nginx处理,不再经过php,第一个效果就是,原来失效的登录,视频功能都恢复了,无论什么软件(暂时https除外)除了在连接中加密过的,nginx均可以完美代理,什么下载30MB都不存在了,如果这个nginx反向代理在2013 年就被我搞出来那么不会有什么鸟收费的samp了,从根本上来说,C程序执行效率都会比apk的samp要高,后期其他高手继续优化nginx那么nginx将更完美,目前反向代理的https也在继续研发,本人不保证https研发可行性。

nginx反向代理,和普通的anmpp是不同的。nginx反向代理只需要一个单独的nginx即可进行任何代理,目前https还不行(需要配合端口重定向脚本),优点没有下载限制(30MB),没有cookie传递问题(任何登录不受影)响),没有延时问题(浏览器到服务器只间隔了nginx),没有脚本执行等待问题(通常只需要十几毫秒,但也是时间),总之不论执行效率,代理速度都比收费的samp快(速度差别在C程序执行效率上,c程序在安卓中是真实的进程,而不是需要dalvik翻译的虚拟机代码)

[标题]:nginx反向代理补充说明-阅(686)
[时间]:2014-9-24 0:56:00
———-
还是那句话,我希望我分享出来的东西都打上我的标记,大家都能记得是谁研究出来的,当初的端口重定向脚本,能发展到现在也是我没有想到的。但是改的乱七八糟,又以我的名义发布是我不能接受的,如果大家不能尊重我的版权,我也会尊重大家的选择,今后自己一切关于免流的,都不会在该论坛分享了,https还在配置中,请求行都由www文件夹转移到nginx.conf中了,只需要一个nginx二进制程序,就可以实现无任何毛病代理,之前普通的anmpp之所以会有这么多问题,是因为php脚本没有人去完善,大家都只会改简单的,代码量稍大,相应的漏洞也多。
https大家就等等吧,看我能不能搞出来,nginx反向代理程序包明天或者后天发上来吧。

另外对瑶池圣子说一下关于脚本的私事,开发软件不关我什么事,收不收费,也不关我什么事但你之前说“防跳脚本的不可行性“ 让我觉得你有点无知,后来你又把它弄进你收费的东西里,美其名曰 端口重定向脚本,你知道吗防跳脚本当初我起这名,是为了迎合大众,它另外一个名字就是端口置换脚本 (转自某火 会后续更新)

——刀云论坛>077的nginx[4]

 

 

 

TODO

 

Reference:

[1] 月光博客——基于安卓的网站服务器。URL:http://www.williamlong.info/archives/3475.html

[2] 百度知道——samp和almp免流有什么区别。URL: http://zhidao.baidu.com/link?url=ClCHVRGyvg9rg5H4zUqHAmAwEW-d00rII4g_6xuAnyxSZJ_bsMBp0-syhGjVsqNSWCTW-L8UQprocqJO2QWSp25g-fbqGVQJwx6cpCBDbTy

[3] 刀云论坛——免流原理和各模式简介。URL: http://dyml.net/forum/topic/48635/30/4.shtml

[4] 刀云论坛>077的nginx。URL: http://dyml.net/forum/topic/51101.shtml

Leave a Reply

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