2013年9月27日星期五

装逼犯,犯装逼

昨天在知乎上发现了一个话题,关于夏俊峰为什么被判死刑。看过之后,我把这个网页的URL贴到了Google+上,然后评论说这简直就是装逼犯大集合。
今天早上,发现有人尖锐地表示了反对意见,说屁股决定脑袋,还说容不下反对的声音。那么我就来谈谈,为什么说“装逼犯”三个字。

人都是有感情又有理性的。有的人感情超过理性,有的人理性超过感情,这是常态。fifty-fifty的不能算是病,但个人觉得叫一声“奇葩”还是配得上的。面对一件事情,到底是感性占上风还是理性占上风,各有各的情况,不一而足。但是要彻底否认掉自己的感情部分,作出一副理中客的样子,要么是没人性的冷血动物,要么就是在装。我特鄙视这种爱装的人,所以加上一个“逼”字,简称“装逼”。这种人,英语里面一般被唤作jerk。

关键这种人还特别喜欢否认别人的理性。民意汹涌,那都是脑残,缺乏独立思考能力,愚蠢的草民,被洗脑洗坏了,被媒体利用了,脑子里都是屎……。为什么会这样?我目前理解为好让人觉得他们与众不同。一般爱装逼的人都想与众不同、出水芙蓉、卓尔不群、鹤立鸡群,好(去声)清高,不屑于与大众为伍。“草根?呸,我看是民粹!”他们大概都是这样想的。

其实装逼和闷骚一样,都是别影响别人就还算不错。话憋在心里还好,谁管你怎么想,我又不是共产党。可惜之所以装就是要给人看的。自己“胸怀远大”不要紧,跑去揪着别人谈理想,那就是在犯贱,所以简称“装逼犯”。其实根源还是那句话:别把自己太当回事。谁也不是傻子。

我写东西呢,比较散,比较懒,也比较绕,有时候不太容易理解。唉,都是以前当钓鱼党落下的坏毛病。那么,为了帮助理解,我就来打个比较通俗一点的比方。
你和一群朋友去唱卡拉OK,点了几扎啤酒,本打算唱得高兴喝得High。偏偏有个家伙,拉着每个人说,喝酒唱歌对嗓子不好,喝酒损害肝脏细胞,憋尿对身体不好,光线一闪一闪容易诱发癫痫……
他说得不可谓不对,可其实这些道理你也都知道。但是你对这个家伙有什么感觉?讨厌,对吧。管你屁事啊?还有,你觉得不好,你自个儿回去好了。在这里装什么装啊?What a JERK!
最后再简单地总结一下:你怎么想,是你的事。要说出来,就要准备面对别人的喷。你说的这些老子眼下很不爱听,骂你装逼是活该。不是每个人都得学你,边吃面条边拉屎

2013年9月26日星期四

小贩之死,司法之死

夏俊峰案,昨天中午终于以当事人夏俊峰被处死而告一段落。毫不独立的司法,作出了毫无考虑的判决和毫无人性的执行,毫不意外。

我想告诉所有以为这事情跟自己无关,自己只是看个热闹,评论上两三句,过两天就会忘了这事的人:司法要是不独立,不能体现公平与正义,你们所有人都会有这个下场。
早先人们去打官司,是相信站在法庭之上,一定会有一个相对公正的说法。但后来,人们渐渐不相信法律了。“法律是有钱人的游戏”、“你能告得过政府?”这种话,相信各位都听得不爱听了。
不信就不信吧,但是法律并不会就此放过你。既然你选择了离一个你不喜欢的东西远一点,那么你的仇家就会来把你往那边去挤——这个道理是必然的。有的官司,你不得不打,不想打也得打,比如夏俊峰。
你能怎么样呢?提交证据,质疑对方的证据,然后法官那边或冷冷或笑嘻嘻地来一句:“辩护方的意见不予采纳”。

小时候我看港片,警匪片或律政剧中常常有这样的场景:带着假发的律师正在振振有词、咄咄逼人的时候,对方律师站起来一句“我反对”,有的时候都不需要说出理由,法官就会说一句“反对有效”或“反对无效”,然后要不前者可能就不得不换一种方式提问,要不后者就只能郁闷地坐下。
我一直觉得很不能接受:拿锤子那老头子凭什么这么独裁?直到我看过了一些介绍英美法系的文章,才有一点明白。然而,我还有一个疑问:那个老头,以及那十二个陪审员,凭什么有掌管别人生杀的权利?
答案很简单:你把这个权利交给了他们。就算你就是被告本人,既然你站在法庭上,接受审判,就是愿意玩这个游戏,这个大家约定规则的游戏。我们每个人都同意,在必要的时候,按照这个规则来玩这个游戏。那是因为我们觉得,只有按照这样的规则,无论将来那一天我是原告还是被告,都是公平的。谁要想打破这个游戏规则,让规则有利于其中的某一方,大伙儿都不答应。谁能保证自己永远不站错位置?我错了,它们有枪,还有坦克,它们一定会站原告席的,是我太天真!

上海电视台,曾经放过一个很鸡巴操蛋(我不是粗鄙之人,但是在这里我完全不希望掩饰自己的情绪)的“公益广告”。一个傻女人依次问一群小朋友“谁愿意当法官/律师/证人”,小朋友很踊跃。然后傻女人问“谁愿意当坏人”,没有人举手。
第一次看这狗屁玩意儿的时候,我一口饭差点唾屏幕上!法庭之上如果有所谓的“坏人”,那这个游戏大家还是不要玩了。都他妈的帮人定好性了,还走这过场干屁?!过家家?!!共产党的司法家们不是都一群酒精考验过了的老家伙吗?!!!

这样子司法,是一件很鸡巴操蛋(原谅我再粗鄙一次)的事情。(以下第二人称所指与上面有所变化)你若是一个人玩,没有问题。想让大家陪你一起玩,就不能这样任性瞎胡闹。现在大家都有意见了,你不赶紧收敛收敛,还摆出一副“挡我者死”的态度,这才是真正的作死。你以为处死了小贩,这事就算结了?同样死去的,还有司法,还有你定下的这些游戏规则。
这些规则我们本来就没同意过,你有枪有坦克,好吧,你说了算。但这事儿除了同意和不同意,还有别的路子可走。你非要我同意你的规则,可以,没有问题。但是老子可以不陪你玩了。公平和正义,不仅仅只有在法庭上才能实现。可以实现的方式有很多。法庭也不是自盘古开天以来就有。

你不给我一个说法,我就给你一个说法。这话好像听起来很耳熟吧?

2013年9月22日星期日

GoAgent证书问题一例

昨天准备在老婆的电脑上用一下GoAgent,结果发现很多网站都不能用。很奇怪的是,Twitter页面能打开,但CSS/JS看起来基本上都不对。而在我自己的电脑(LAN内部)上却是好的。所以很明显是Local而不是Network的问题。
看GoAgent控制台上的日志,问题似乎跟SSL的连接建立有关系。再把Chrome的“审查元素”功能打开,Console里面一堆错误。随便挑了个页面试图打开,好了,这下清楚了,证书有问题。
看了看GoAgent的官方Q&A,基本上只提到说证书需要导入。很多在网上问这类问题的人,得到的也是类似回答。但问题在于,证书的导入是没有问题的,重新导入也没有效果。而且并不是所有网站都不能通过GoAgent代理。

其实问题很简单:GoAgent仿冒的证书被占用啦。
官方其实也提到过这个事情:
因为GAE平台限制,没法支持真正的ssl加密,goagent只能通过伪造证书的方式做到代理ssl加密的网站,这个证书就是用来欺骗浏览器的。
GoAgent实际上相当于一个“中间人”。当访问HTTPS站点时,就得采用SSL中间人攻击的类似方式,才能完成代理的工作。SSL中间人攻击怎么弄?导入受信任的根证书,然后利用这个根证书签发的证书把内容拆开后重新组装、加密、封包,骗完甲方骗乙方,欺骗通讯双方。否则两端任何一方觉得这内容不对劲,SSL传输就会失败。这其实也就是为什么必须要干掉CNNIC相关的根证书的原因

所以,对于每一个HTTPS站点,GoAgent都会生成一份用自己根证书签发的数字证书。看看GoAgent的local目录下,如果访问过HTTPS站点,则一定会有一个certs目录。这生成的证书,就放在这个certs目录下。其实一看这个目录里面都有些什么文件,就很明白了:
这次的问题在于,GoAgent有不同的版本,其携带的根证书也是变化过的。至少我机器上随便打开CertMgr就见到了五个不同的版本:
如果升级的时候不把certs目录清空,就有可能会有部分站点对应的证书还是以前的老的、用旧的根证书签发出来的。GoAgent客户端一看,噢,证书已经有了,就不再重新生成了。但Chrome觉得证书不对,于是SSL握手就被挡了。

解决办法很简单,每次升级GoAgent的时候,把local/certs目录删掉。或者干脆每次用新目录来升级好了。

2013年9月21日星期六

自己给iOS7升级下载加速

通知出来了好几天了,今天准备给老婆的手机升iOS7。于是先把iTunes升到11.1(下载速度还不错),然后连上手机。一检查,嗬,1.19G,告诉我下载要18个小时。
按照惯例,打开IE设上代理,准备用GoAgent加速。现在估计用时只要不到一个小时,完全可以接受。
但是担心的事情来了,免费GAE的每个AppID有1G/天的流量限制,而我的GoAgent没能及时切换到下一个可用的AppID,结果iTunes这边报了个错,然后下载又重新开始了。没想到这iOS升级包的下载居然不支持断点续传。我又试了下,哪怕是手动点“暂停”,也没法进行续传,每次下载都会重头开始。看来这乔布斯死了之后,苹果真是要没落了。

接下来的时间,我考虑了以下解决方案:
1. 开VPN:可手头上的VPN速度都跟直接下载差不多。何况有些VPN还有流量限制。不肯花钱的后果就出来了。
2. 找代理:手头上没现成的。不管是去搜Google还是开ProxyHunter都得花时间。懒得去找了。
3. SSH Tunnel:目前手头上访问起来快一点的只有台H3C的交换机,大概是深圳的地址。不过SSH没开,要想架隧道还得要我去帮它开。由于担心被抓去集中营活摘器官,并且从这台交换机到appldnld.apple.com的ping值并不好,所以最后还是放弃了。

最终,还是自己找了组appldnld.apple.com比较快的地址,解决了这个问题。100ms左右的ping值,偶尔丢包。放在hosts里用上去之后,显示的估计用时也是不到一小时,跟开GoAgent加速的效果相当。那就先这样用吧。话说这苹果的DNS设置咋自己就解析不到这组地址上去呢?是我RP问题?

2013年9月10日星期二

写了个批量测试服务器Ping值的小工具

不时有人问我要hosts,但是很多时候也不敢贸然的给。担心泄漏是一方面。另外一方面,我这边可以用的hosts,在别人那边可能用不了。我这边用起来很快的hosts,在人家那边可能像乌龟爬。叫别人ping一下当然不是什么太麻烦的事情,但如果连试好几个IP都不行,有时候也是很头大的事。效率也很低下。

因此想,要是有个能批量Ping,并且能很容易看到输出结果的工具,就好了。用批处理做个批量Ping是很容易的,但结果并不是特别一目了然。于是干脆自己动手做了一个。
启动时会加载当前目录下的server.list文件,文件中每行写一个地址(这几个地址有些人可能一看就知道是什么东西了)就可以了。写域名也是可以的,但我这里输出结果中并不包含域名解析的结果。
目前只打算简单做成这样,反正只当小工具用用。如果觉得网络不顺的时候,就启动起来跑一跑看看。然后也可以把一堆IP丢给别人自己校验去。

有需求的朋友可以去拿来用下。工具的下载地址:Dropbox镜像 Mega下载页面
为了减少CRT依赖性,上面的发布版本是静态链接的。如果想用动态链接版本,或者担心木马、病毒什么的,就下载下面的源代码自己编译吧。VC6就可以。反正自己也没写多少代码,许可证什么的就懒得去弄了。
源代码下载地址:Dropbox镜像 Mega下载页面

2013年9月9日星期一

斯诺登关于NSA解密能力爆料的解读

斯诺登最近大概向媒体爆了些料,有不少人被吓着了。比如这篇文章一开头就这样写道:
美英三家媒体联合报道称,美国情报机构通过向企业产品注入漏洞等手段,破解HTTPS、SSL、VPN等全球互联网主要加密技术,实施监听;美国国家情报总监克拉珀回应称此事“不是新闻”
看起来很吓人对吧?HTTPS、SSL、VPN,这些几乎是我们日常用得最多的翻墙技术手段。如果NSA能搞定,那么墙国要山寨过来也就只是时间问题。很多看到的人就是这样推理的。
那么,到底是不是真的有那么吓人呢?

个人觉得,财新网这篇文章的摘要,写得相当的不严谨。不过国内的媒体一贯习惯博人眼球,这样写也很正常。其实如果能认真读完全文,大概不至于被吓得不敢上网。相比之下,《纽约时报》的一篇报道就要更为准确一些:
最新披露的文件显示,美国国家安全局(National Security Agency,简称NSA)在长期的加密技术秘密战争中占了上风,它利用超级计算机、技术花招、法院指令和幕后劝说,对互联网时代保护日常通讯隐私的主要工具造成了损害。
这段话里面,明确提到了这么几个手段,我觉得基本上可以比较准确地概括全文的内容:

  • 超级计算机:也就是硬来,霸王硬上弓,利用超级计算机+分布式计算的强大计算能力,暴力破解猜密码。这个没啥好怕的。你要是能让政府动用举国之力来对付你,你大概也不会因为这些事情而害怕了,多少会是个英雄/领袖什么的吧?换句话说,要是在中国,找几个人把你关起来拷问,大概成本会低很多,估计也更合领导的意。不小心弄死了参照李旺阳处理就行。
  • 技术花招:也就是第一篇文章所提到的,利用(甚至主动引入)产品、协议、服务的漏洞,或者植入软件/硬件木马,试图在加密前或解密后获取到信息。既然是叫做“花招”,那么就是一些旁门左道的东西,有用是有用,但并不是说整个Internet的安全体系就此崩塌了,防漏堵缺就可以了。
  • 法院指令:要求企业交出密钥或解密后的明文,或者获得访问权限。在美国这算事儿,在天朝大伙儿应该都习惯了吧?没什么好害怕的。
  • 幕后劝说:相对于“法院指令”,其实也就是红脸和白脸的区别而已。我觉得在天朝根本不需要什么“幕后”劝说。所以也一样,没什么好怕的。

所以,看吧。NSA也不是说真的拥有了什么颠覆性的力量。现有的Internet安全体系还在,强如NSA也只能绕着边儿想办法。谍报机关嘛,真逼急了啥办法不会想?真没必要自个儿吓自个儿。

2013年9月6日星期五

一例C000001D错误的分析

公司客服收到用户反映,说我们的软件使用到某个功能的时候,报了一个错误。错误信息只有“External exception C000001D”这么一段文字。

搜一下C000001D,很容易就能知道对应的含义是STATUS_ILLEGAL_INSTRUCTION,也就是说程序使用了当前CPU所不支持的指令集。我们自己的程序并没有使用太新的指令集,但有一些第三方的接口库可就未必了。由于功能基本上是计算密集型的,所以这些第三方的库如果没注意编译开关,完全有可能造成这种情况。

让客服电话采集了一下用户的硬件信息,果不出所料:AMD Athlon XP 3000+。根据维基百科的资料显示,2003年面市,这是一款可以称得上老旧的CPU。支持的指令集:MMX、SSE、3DNow,并不算多,关键是没有SSE2

为什么会怀疑到SSE2上面呢?因为前不久刚看了一篇博文,说Win8需要CPU支持SSE2才能安装。这说明SSE2所能提供的,已经几乎是现在开发的新软件所必需的基本能力了。另外很多编译器已经默认把SSE2优化给打开了。也难怪——这年头,还有谁在用Pentium III吗?

总之,合理怀疑之后,先来看看是不是这么一回事。这种事情如果要通过正常途径去沟通,不见得效果好。说不定那个当初负责编译出这个库的程序员早换工作了。就算人还在,编译选项和指令集之间的关系搞不清的程序员大有人在。问还不如自己动手看。以下是用dumpbin对其中一个第三方DLL库反汇编出来的某个函数的部分代码:
1001314E: 66 0F 6F 06        movdqa      xmm0,xmmword ptr [esi]
10013152: 66 0F 6F 4E 10     movdqa      xmm1,xmmword ptr [esi+10h]
10013157: 66 0F 6F 56 20     movdqa      xmm2,xmmword ptr [esi+20h]
1001315C: 66 0F 6F 5E 30     movdqa      xmm3,xmmword ptr [esi+30h]
10013161: 66 0F 7F 07        movdqa      xmmword ptr [edi],xmm0
10013165: 66 0F 7F 4F 10     movdqa      xmmword ptr [edi+10h],xmm1
1001316A: 66 0F 7F 57 20     movdqa      xmmword ptr [edi+20h],xmm2
1001316F: 66 0F 7F 5F 30     movdqa      xmmword ptr [edi+30h],xmm3
10013174: 66 0F 6F 66 40     movdqa      xmm4,xmmword ptr [esi+40h]
10013179: 66 0F 6F 6E 50     movdqa      xmm5,xmmword ptr [esi+50h]
1001317E: 66 0F 6F 76 60     movdqa      xmm6,xmmword ptr [esi+60h]
10013183: 66 0F 6F 7E 70     movdqa      xmm7,xmmword ptr [esi+70h]
10013188: 66 0F 7F 67 40     movdqa      xmmword ptr [edi+40h],xmm4
1001318D: 66 0F 7F 6F 50     movdqa      xmmword ptr [edi+50h],xmm5
10013192: 66 0F 7F 77 60     movdqa      xmmword ptr [edi+60h],xmm6
10013197: 66 0F 7F 7F 70     movdqa      xmmword ptr [edi+70h],xmm7
1001319C: 8D B6 80 00 00 00  lea         esi,[esi+00000080h]
100131A2: 8D BF 80 00 00 00  lea         edi,[edi+00000080h]
100131A8: 49                 dec         ecx
100131A9: 75 A3              jne         1001314E
SSE2的指令集可以参见这里。其实看到movdqa就已经很明白了。这个DLL库的确用了SSE2,那么,报错就是很正常的事情。

在分析这个问题的时候,我花了一点时间,希望能找到一个能够列出程序所使用的指令集的静态分析工具,但没有找到答案。当然,就这次的情况而言,我能通过XMM寄存器很容易地找到并筛选出SSE2的指令。但要是能有一个自动化工具,就更好了。也许还是有这种工具的,只是我目前还不知道吧。如果有谁知道,还望不吝告知。

2013年9月5日星期四

GAE升级Python27折腾手记

Google把GAE的Python运行环境从2.5升级到2.7,已经有好一些日子了。因为只扔了自己的两个小小的应用在上面,所以一直没去处理。最近总算有些时间,于是把这个折腾完了,还很花了一些工夫,特记录一下。

去看了GAE的在线文档。中文的文档是只有2.5的部分,繁体中文也只是对2.7给出了一个链接而已。技术方面的东西还是直接参考英文资料来得好。

具体的做法,官方文档上写得很清楚,就不在这里说了。但是我的升级过程并不是很顺利。最后总结一下有这么几个问题,供大家参考:
  • 按照文档,app.yaml里面的handle script要从.py改成.app,但千万别手贱去把.py文件真的改名成.app。其实只是app.yaml里面要改而已,文件还得是.py为后缀名。
  • app.yaml中还要引入webapp2这个library,这个在官方文档中没有明确地指出。具体写法是:
libraries:
- name: webapp2
  version: "2.5.1"
其实version可以写latest,但要承担最新库无法向下兼容的风险。
  • 要更新就索性别留旧版(Python 2.5)的程序在GAE上,否则页面顶部的警告一直会有。
其余过程还算顺利,至少升级到2.7算是成功了。