UCWeb翻墙不完全报告

来源:http://qixinglu.com/archives/ucweb_change_server?utm_source=rss&utm_medium=rss&utm_campaign=ucweb_change_server

注:
从Google Document转回来的,写于2010-2-5,仅适用于7.3之前的版本,不再更新,仅归档供参考,明天放7.3之后的暴力破解方法。

不久前无聊蛋疼就去研究一下ucweb的翻墙方法,搞定了Java版和PPC版,引得不少人来问来这个那个版本怎么翻墙,一来老回答重复问题;二来 ucweb版本众多,我实在再没精力和环境去研究它们了。但我觉得原理应该都是差不多的,那就将心得写出来,让有兴趣的同学继续研究。

注意:这篇文章有点技术流,我只研究过Java和PPC版本,所以都是下面所说都是基于这两个版本的经验来写的,各位同学举一反三吧,也不保证生效时间。另外S60版本也可参考coshim的几篇文章

服务器获取过程

要让你的ucweb能翻墙,这是必须了解一下的。跟operamini不同,operamini的服务器地址是直接硬编码到程序文件里去的,而且只有java版,所以直接修改java的class文件就能替换服务器地址了,但ucweb则不同。

  1. 在初始化时,收集手机的信息,以POST方式发送到"uc.ucweb.com:80"
  2. 然后那边就根据信息返回相应的IP,比如"58.211.21.75:8087"。
  3. 本地的ucweb收到"58.211.21.75:8087"这个IP后,保存下来。
  4. 以后ucweb就读取保存过的IP,浏览网页的信息都是和这个IP通信。

目前ucweb还不算是彻底自宫干净,operamini是直接拒绝中国大陆IP的,ucweb的外国服务器目前还不拒绝,所以我们要做的是怎么让ucweb和直接跟国外的服务器IP通信。

可以在上面几个步骤中加以干扰,所以方法也有好几个,有简单有复杂,有折腾能力的都去试试,以找到最适合的方法。

方法一 伪装手机信息

上面说过"uc.ucweb.com:80"是根据发送过去的信息来返回不同IP的,经研究,满足两个条件可以返回国外IP

  • ucweb版本的语言标识
  • 必须为英文,参数名为"m_bid",中文版的值为"999",英文版为"300"或"352",所以如果是要用中文版,那就得改成英文版的值。

    • java版可以用"grep m_bid ./*.class"包含"m_bid"这个字符串的class文件,用十六进制编辑器打开,找到"999",改成"300",符合的只有一个。
    • ppc和m8版是在ucweb的执行目录下建立一个"config.ini"文件,内容就一行"m_bid=300"。
    • s60版的也是需要修改执行文件,网上有流传方法,就是解包并脱壳,也是十六进制编辑器来修改。

    至于其它版本就不清楚了,或许可以试一下ppc的方法。查看是否成功可以浏览"ext:page:sysinfo",这个神秘的地址列出了一堆信息,看看"m_bid"是否改变了。

  • 请求源地址IP
  • 上面改语言标识后能翻墙曾经有一段时间成功过,后来又失效的,最可能的原因是官方已经把来自网络营运商的IP都设置黑名单,不管语言标识如何,一律返回国内IP。应对方法有两个。

    • 采用非GPRS上网的方式初始化一次,也就是采用wifi或者用蓝牙/数据线通过电脑来上网。目前好像一般上网方式(如ADSL)的IP还没有入黑名单。
    • 对于没有其它上网方式的手机,就要像operamini一样,建立一个中转地址,然后修改执行程序里的"uc.ucweb.com:80"为中转地址。

    对于第二个方法,我只实现过Java版,代码都在opm-server-mirror项目上,方法可看这个wiki页,其它版本的执行文件的二进制格式不熟悉,试过手动改ppc版,不过可耻地失败鸟,不过我想有汉化经验的同学应该能做到。

方法二 使用调试页面

网上流传神秘地址,也是上面提到的"ext:page:sysinfo",ppc和m8都有着个页面,但是s60的则没有。这个我当时搜了一下,未公开过

  1. 在第一行"Dispatcher"填"localhost",点"修改"。
  2. 第二行"中间件"填一个外国IP,如"74.86.222.73:8989/",然后点"保存"。
  3. 然后点左下角菜单"返回"。
  4. 回到主界面,翻墙。

这个测试过ppc和m8都有效,不足就是重启ucweb后就恢复原来的地址了,看来这个就是供开发人员调试用的功能。如果想下次启动还有效,参考下面的方法。

方法三 修改保存配置

上面说过ucweb收到IP后会保存下来的,所以的初始化后才有配置可修改。

  • 对于java版,确实会保存到临时文件里,但是临时文件好几个,不同虚拟机又会产生不同的临时文件名,很难找出保存服务器IP的临时文件,所以用改服的方法更好。
  • 对于ppc版,经研究它是保存在注册表里的,键值地址为"HKLM\Software\UCWEB6\DB\MID:0",是十六进制数据,类似内容如下
  • XX XX XX 00 00 00 00 00 
    XX 00 00 00 XX 00 00 00
    XX 00 00 00 XX XX XX XX
    37 00 34 00 2E 00 38 00
    36 00 2E 00 32 00 32 00
    32 00 2E 00 37 00 33 00
    3A 00 38 00 39 00 38 00
    39 00 2F 00
  • 从第三行开始就是服务器地址了,因为这里两个字节保存,对于ASCII字符,后面的字节总是0,把后面的"00"全部去掉,变成
  • 3734 2E38 362E 3232 322E 3733 3A38 3938 392F

    以ASCII字符显示,就是"74.86.222.73:8989/"。把这里的数据改成外国的IP就行了,当然你要自己换算成十六进制。改好后用其它软件把它导出来,以后万一自动换成的国内服务器,重新导入它即可。

    其它版本也参考ppc版,我不清楚。

方法总结

写了这么多我也有点混乱了,各方法也可以交叉用的,这里总结一下

  • 最简单的方法是改语言标识,然后以非GPRS的方式上网,把注册表保存起来,到时把配置覆盖回去。
  • 对于想临时翻一一下的话,就用那个调试页面的方法吧。
  • Java版修改就比较简单,直接改服,wiki页上有详细说明了。
  • 还有s60的host大法,我没测试过。

没有评论: