2010年2月8日星期一

[GFW BLOG] 【终结篇】ucweb mod研究及uc的联网协议

作者:land   来源:http://landon.v70.us//././show-103-1.html

有很多网友问我怎么架设uc的代理 我想说的是你们理解错了 我做的代理只是一个UC的mod 为了方便自己 如果想要穿墙直接下载 我改好的专用穿墙版好了 HTTP://WWW.COSHIM.COM 签名 安装就能用了 我可以服务到今年6月

 ps 是共存版的 用英文版修改而成

如果你只想穿墙不想知道原理那么你直接忽略下面的文字好了~

内容仅供开发mod使用。。。。。

 


由于本人的s60手机n82进水了,干了以后不能用了。s60系列的uc就打算研究到这里了,下面给出实时切换uc服务器的源代码,以及如何修改uc的方法。
在讲解一下uc的原理好了。
下次的题目应该是Android平台的uc了。正在查找入手n1的方法。 canada能在google网店买到刻字无锁版的n1吗?

好了先上一张uc的流程图
大小: 41.17 K 尺寸: 500 x 374 浏览: 7 次 点击打开新窗口浏览全图
分析
ps 流程图忘画cookie了  懒得重新画了  还有服务器地址写错了应该是ucs5.tj.ucweb.com 少了个s
先说前3步吧 就是截止到uc返回服务器的那步。
抓包获得:
===================code begin==================
POST / HTTP/1.1
Host: uc.ucweb.com
User-Agent: UCWEB7.0.2.37/28/999
Accept: application/xml;text/vnd.wap.wml;text/*,image/jpeg;q=0.5,image/png;q=0.5,image/gif;q=0.5,image/*;q=0.6,video/*,audio/*,*/*;q=0.6
Accept-Charset: windows-1252;q=1.0,utf-8;q=1.0,utf-16;q=1.0,iso-8859-1;q=0.6,*;q=0.1
Connection: close
Content-Length: 272

<assign sn="37-959266***-480f5***" version="7.0.2.37" platform="sis" m_bid="999" m_pfid="28" m_bseq="09113011" m_ss="240x320" m_imei="3589840*****642" m_dn="95926****-37d***ca" useragent="UCWEB7.0.2.37/28/999" newserver="1" last_server="" reassign="false" netname="wifi"/>
==================code end=================================
一点点介绍提交数据包的信息吧。
post模式
user-agent 不同的uc版本是不同的 某些版本的uc user-agent是手机型号+uc版本 而有的干脆就是空。
assign这段是重点 uc靠这个来返回服务器的。
sn 不知道如何获得的,好像是开uc随机生成的。 查询sn 的方法 地址栏输入http://command/command=echo.sn 或者打开 !/privete/2001f848/ucalwaysuseuserdata.dat
m_imei就是手机的串码  *#06#
m_dn 就是dn了 一个非常重要的信息,获取cookie全靠他  ,具体如何重要后面会说  查看方法 打开 !/privete/2001f848/ucalwaysuseuserdata.dat
newserver="1" last_server="" reassign="false"  都不清楚。。。。
netname="wifi"只有用wifi的时候会提交。 这个键值也会导致国外ip访问uc服务器不返回国外服务器。

下面直接copy以前写的文章的了 是关于后面几步的。
在地址栏输入一个链接=>请求代理服务器去载入这个链接=>代理服务器接到消息去查询数据库查找这个链接是否对应cookie=>合并 cookie后请求该链接=>得到该链接的页面 如果需要的话修改数据库中的cookie=> 对得到的页面做一些处理 like 出去javascript什么的=>压缩页面=>返回给uc页面=>我们就看到这个页面了。

但是有2点需要注意就是关于wap页面。
wap页面最近我没抓包 以前抓过 我就按以前的写吧  大概是我高三的时候11个月前。
如果请求的页面是wap(wml),uc是不会知道的除非有EXT:A:链接  (EXT:A:这个的意思是直接连不经过uc代理)uc服务器依然回去请求这个页面,按照上面的流程,不过服务器会多返回一个信息,大概就是告诉uc 这个页面是wml的 你需要自己链接不用请求我了。
如果没猜错的话uc可以处理wml页面 对xhtml 我觉得不能完全处理
,因为校内是xhtml的他前面没EXT:A:。我曾经自己写过一个xhtml的手机blog页面 发现返回的ip是代理的。 这个也是1年前的事情了  不知道uc改了没有。

uc的联网过程 和 请求服务器模式大体是就是这样  我觉得跟官方的出入不超过20%。


下面开始说明我对于uc服务器的mod
(注意这个只是介绍mod 的原理 如果你仅仅要穿墙请看本文开头。这里面会穿插的讲一下如何把uc修改成穿墙的uc)
开始只为了wifi翻墙,毕竟用3g太费流量,我在国外用wifi居然不能翻墙。所以我就弄了一个uc的翻墙版。
但是国外服务器的优化效果大家也是知道的,我也懒 懒得切换中英文uc,就写了个uc实时切换服务器的mod。但是一些bug+资源占用很。。。 没有推广 只是小范围测试了一下,我服务器还将将能受得了。毕竟我的内存才128m。wp。。。。。fuk的东西 还是sa好呀。

如果仅仅想翻墙 永久使用英文服务器 这么做就可以了。 目 前让uc的到国外服务器的方法只有一个 就是建立一个自己的代理服务器提供服务器来替换uc的代理服务器提供服务器。

首先更改uc的代理服务器提供服务器的地址,打开uc的源文件把uc.ucweb.com改成自己架设的服务器ucweb.v70.us 还是短域名好 ^_^ 
然后做一个php程序返回代理服务器
先看看我们提交服务器请求后uc代理服务器提供服务器如何返回信息
HTTP/1.1 200 OK
Content-length: 184
Upd_interval: 7
Upd_misc: 0
Connection: close
Server: TwistedWeb/2.2.0
Upd_svr_url: http://wap.uc.cn/ucpack/dlmobile/control/client_upgrade.php
Us_srv_url: http://ucus.tj.ucweb.com/usquery.php
Date: Mon, 25 Jan 2010 03:21:40 GMT
Content-type: text/html
Assign: ucs5.tj.ucweb.com:80

assignucs5.tj.ucweb.com:80UPD_SVR_URL;http://wap.uc.cn/ucpack/dlmobile/control/client_upgrade.phpUPD_INTERVAL7
us_srv_url$http://ucus.tj.ucweb.com/usquery.phpUPD_MISC0
其中包括大量不可见字符。应该是做分割用的。
Assign: ucs5.tj.ucweb.com:80 就是服务器地址了。光这一个uc是不认的 还得在内容中返回assignucs5.tj.ucweb.com:80 (丢失了n个不可见字符 )


一个简单的uc代理服务器提供服务器的php源码可以这么写
header("Assign: ucs5.tj.ucweb.com:80");
print "\000\006assign\000\024ucs5.tj.ucweb.com:80";
这样我们就能控制uc链接哪个服务器了。 把ucs5.tj.ucweb.com:80给成e问服务器的ip和端口就好了。

这样一个简单的翻墙代理就出来了。 只要把这个php 扔到空间上然后把 uc原文件中的代理服务器提供服务器地址改成自己的就成了。(也就是上面那个2行php文件的地址 注意塞班uc网址最多12个字符。)

下面内容为mod的 如果您只想翻墙  永久用英文服务器 请忽略


下面介绍一下我的mod的工作原理 看图:
大小: 85.62 K 尺寸: 500 x 500 浏览: 2 次 点击打开新窗口浏览全图
主要就是返回自己的php代理,然后根据自己的需求选择uc的哪个代理服务器。
在做一个代理切换页面就一切搞定了。这个mod可以多加服务器 也可以学autoproxy根据url自动选择uc的代理。
我也懒得研究了,源码放上吧。
=========================切换服务器用php程序===============

PHP代码
  1. <?php  
  2. header("Content-type: text/html; charset=utf-8");  
  3.   
  4. $serverlist = array(  
  5. '1' => array(  
  6.         'id' => '1',  
  7.         'name' => '国内服务器',  
  8.         'address' => 'ucs5.tj.ucweb.com:80',  
  9.     ),  
  10.     '2' => array(  
  11.         'id' => '2',  
  12.         'name' => '国外服务器',  
  13.         'address' => '67.228.166.109:8086',  
  14.     ),  
  15.   
  16. );  
  17.   
  18. $dn = (preg_match ("/.*dn\/(\d+-.{8}),text.*/i",$_SERVER["HTTP_ACCEPT"])) ? preg_replace("/.*dn\/(\d+-.{8}),text.*/i""\$1",$_SERVER["HTTP_ACCEPT"]) : "" ;  
  19. //echo $dn;  
  20. if($_GET['action']=='test')  
  21. {  
  22. $dn = "959266293-00000000";  
  23. }  
  24.   
  25. if(emptyempty($dn))  
  26. {  
  27. echo "NOT ALLOWED!PLEASE USE UCWEB TO BROWSE THIS PAGE.";  
  28.   
  29. }else{  
  30. $link=mysql_connect("localhost","fuk","**************");  
  31. mysql_select_db("uc"$link);   
  32.   
  33. if($_POST['post']=="fuk"&&$_POST['dn']=="$dn"){  
  34. if(emptyempty($_POST['server'])){  
  35. echo "请选择一个服务器<br>";  
  36. printhtml();  
  37. }else{  
  38. $serv = $_POST['server'];  
  39. $q = ($_POST['new']=='en') ? "INSERT INTO `uc` (`server` ,`dn` )VALUES ( '$serv' , '$dn' )" : "update `uc` set `server` = '$serv' WHERE `dn` = '$dn'";  
  40. $rs = mysql_query($q$link);  
  41. if(!$rs){die("Valid result!".mysql_errno() . ": " . mysql_error() .$q);}  
  42. echo "修改成功!<br>";  
  43. unset ($q);  
  44.   
  45. }  
  46. }  
  47. printhtml();  
  48.   
  49. }  
  50.   
  51.   
  52. function printhtml(){  
  53. global $dn,$link,$serverlist;  
  54. $q = "SELECT * FROM `uc` WHERE `dn`='$dn'";  
  55. $rs = mysql_query($q$link);  
  56. if(!$rs){die("Valid result!1".mysql_errno() . ": " . mysql_error() .$q );}  
  57. $row = mysql_fetch_row($rs);  
  58. if(emptyempty($row)){  
  59.   
  60. $other = '<input type="hidden" name="new" value="en" />';  
  61. }else{  
  62.   
  63. $server = $row[1];  
  64. }  
  65. print <<<EOT  
  66. <form action="$_SERVER[PHP_SELF]" method="post" >  
  67.   <input type="hidden" name="dn" value="$dn" />  
  68.   <input type="hidden" name="post" value="fuk" />  
  69.   $other  
  70.     
  71.     请选择服务器:<select name="server" >  
  72.           <option value="">== 请选择服务器 ==</option>  
  73.           <option value="">--------------</option>  
  74. <!--  
  75. EOT;  
  76.   
  77. foreach ($serverlist as $key => $cate)  
  78. {  
  79.      
  80.     $selected = ($cate['id'] == $server) ? "selected" : "";  
  81.     print <<< EOT  
  82. -->  
  83.           <option value="$cate[id]" $selected>$cate[name]</option>  
  84. <!--  
  85. EOT;  
  86. }  
  87. print <<< EOT  
  88. -->  
  89.         </select></p>  
  90.   
  91.    
  92.   
  93.   <p>  
  94.      
  95.     <button name="submit" id="submit" type="submit" class="formbutton">确定</button>  
  96.      
  97.   </p>  
  98.   
  99. </form>  
  100.   
  101. EOT;  
  102. mysql_free_result($rs);  
  103. exit();  
  104. }  
  105.   
  106. ?>  


==============================================================


php代理 用了curl库
==============================begin==========================

PHP代码
  1. <?php  
  2.   
  3. $serverlist = array(  
  4. '1' => array(  
  5.         'id' => '1',  
  6.         'name' => '国内服务器',  
  7.         'address' => 'ucs5.tj.ucweb.com:80',  
  8.     ),  
  9.     '2' => array(  
  10.         'id' => '2',  
  11.         'name' => '国外服务器',  
  12.         'address' => '67.228.166.109:8086',  
  13.     ),  
  14.   
  15. );  
  16.   
  17.   
  18.   
  19. if ($_SERVER['REQUEST_METHOD'] == 'GET') {  
  20. exit("fuck");  
  21.   
  22. }else{  
  23.   
  24. $dn = (preg_match ("/ucid=(\d+-.{8})/i",$_SERVER['QUERY_STRING'])) ? preg_replace("/ucid=(\d+-.{8})/i""\$1",$_SERVER['QUERY_STRING']) : "" ;  
  25. $link=mysql_connect("localhost","fuk","**************");   
  26. mysql_select_db("uc"$link);   
  27. $q = "SELECT * FROM `uc` WHERE `dn`='$dn'";  
  28. $rs = mysql_query($q$link);  
  29. if(!$rs){die("Valid result!".mysql_errno() . ": " . mysql_error() .$q );}  
  30. $row = mysql_fetch_row($rs);  
  31. if(emptyempty($row)){  
  32. $ip = "67.228.166.109:8086";  
  33. }else{  
  34.   
  35. $w = $row[1];  
  36. $ip = $serverlist[$w][address];  
  37. }  
  38.   
  39.     $curlInterface = curl_init();  
  40.     $headers[] = "Content-Type: {$_SERVER[CONTENT_TYPE]}";  
  41.     $headers[] = "Accept: {$_SERVER[HTTP_ACCEPT]}";  
  42.     $headers[] = "User-Agent : {$_SERVER[HTTP_USER_AGENT]}";  
  43.     $headers[] = 'Connection : keep-alive';  
  44.     $headers[] = 'Host: ucs5.tj.ucweb.com';  
  45.     curl_setopt_array($curlInterfacearray(  
  46.         //ucs5.tj.ucweb.com  
  47.         CURLOPT_URL => "http://$ip$_SERVER[REQUEST_URI]",  
  48.         CURLOPT_HTTPHEADER => $headers,  
  49.         CURLOPT_POST => 1,  
  50.         CURLOPT_POSTFIELDS => file_get_contents('php://input'))  
  51.     );  
  52.     $result = curl_exec($curlInterface);  
  53.     $info = curl_getinfo($curlInterface);  
  54.     curl_close($curlInterface);  
  55.     }  
  56. // file_put_contents  ('postf.txt', file_get_contents('php://input'));  
  57.  // file_put_contents  ('serv.txt',var_export ($_SERVER,TRUE));  
  58.      // file_put_contents  ('info.txt',var_export ($info,TRUE));  
  59. ?>  


==========================end================================

uc的代理服务器返回服务器我没有现成的 只用了一个if语句写了下自己手机的串号  所以就不发了。
各位高人们自己研究吧。

 

uc的一些数据包 

cap.rar


不懂的话欢迎各位留言。
请大家遵守cc协议。
本站所有作品若无单独指明均采用知识共享署名-非商业性使用-相同方式共享 2.5 中国大陆许可协议进行许可。




--
Posted By GFW Blog to GFW BLOG at 2/08/2010 04:36:00 PM

--
1、请点击www.chinagfw.org访问我们,订阅地址:http://feeds2.feedburner.com/chinagfwblog。2、需要Psiphon2注册邀请的朋友,请向english@sesawe.net发送电子邮件请求,说明 "can I have psiphon2 access" 并告诉您所在的国家。也可以使用Twitter Direct Messages或登陆Psiphon网站直接向Psiphon索取使用邀请。3、GFW Blog现提供最新翻墙工具下载(地址一、二、三),翻墙(突破网络封锁)方法介绍请见本站anti-censorship部分。4、本站热烈欢迎各位朋友投稿或推荐文章,请发邮件至chinagfwblog[at]gmail.com。5、敬请关注、支持、参与Sesawe和黑箱监管集体诉讼。
To unsubscribe from this group, send email to
gfw-blog+unsubscribe@googlegroups.com
For more options, visit this group at
http://groups.google.com/group/gfw-blog?hl=zh-CN

1 条评论: