Archive

Archive for August, 2009

ezgdi – gdi++移植到64位Windows

August 28th, 2009 24 comments

ezgdi是我最近做的一个小项目, 将用于字体美化的gdi++动态链接库移植到x64平台上. 原始想法来源于极限主题论坛的相关讨论[1][2][3].

gdi++移植到64位windows, 为什么?

gdi++替换了操作系统的gdi接口功能, 可以提供更加伤心悦目的字体渲染效果. 而gdi++的一个重要特点, 即操作系统接口替换, 是依赖于微软研究院发布的一个库, 叫detours, 现在detours版本号是2.1, express版可以免费使用, 但不支持64位程序. 而支持64位的Professional版本不免费, 要$1000, 而且有钱也不能用, 因为微软禁止你用detours开发GPL类开源软件. 据我所知, 很多很好的项目都依赖于detours, 以至于迟迟不能提供对64位的支持.

64位是未来的趋势, Linux, Windows现在发布, 都主推64位版本. 如果gdi++不支持64, 会严重影响我升级64位操作系统的决心. 所以我觉得gdi++移植到64位windows, 是一件挺有意义的事情.

怎么移植? 为什么选择easyhook?

首先, easyhook提供与detours类似的操作系统API劫持功能. 并且开源, 支持x64平台. 所以将gdi++对detours的依赖移植到easyhook上, 可以编译出64位的gdi++.dll, 用于渲染64位Windows程序.

截止到8月26日, 从detours到easyhook的移植工作基本完成雏形. 这意味着, 使用easyhook代替detours的方案是可行的.

ezgdi 怎么用?

将来64位的gdi++.dll和32位的gdi++.dll会并存, 分别负责渲染64/32位程序. 虽然目前只支持注册表加载, 但实现成gditray的支持那种也是可行的.

虽然我目前是基于freetype版做出的修改, 但其实修改的内容都和freetype没关系, 所以推广到其他版本应该也不是问题.

总的来说, 从使用来讲没什么不一样的. 想试用当前的版本, 可以参见安装说明.

移植当前是什么状态? 什么时候可以用?

目前把gdi++从detours移植到easyhook的工作已经基本完成, 32-bit和64-bit的DLL都能正确生成. 但运行不稳定. 尤其是x64的dll, 会导致IE crash. 即使这样, 如果你还是感兴趣, 可以下载试用.

现在我有两个忧虑, 一是性能, 我怕easyhook相对detours的实现会产生明显的性能瓶颈, 二是全面性, 目前已经发现有些操作系统的界面easyhook不能渲染, 不知道是不是easyhook做不到.

上述两个问题有可能是植根于easyhook本身的技术实现, 无法解决的. 所以最坏的结果是, 走了一圈, 发现此路不通.

需要帮忙么?

非常需要, 我一个人的精力能力毕竟有限. 如果觉得ezgdi有一点价值, 可以关注ezgdi项目的主页. 上面有一些文档, 和我改动之后的代码

目前的缺陷

目前的ezgdi尚有很多较为严重的问题没有解决, 大概有下面几点:
1. 只支持注册表加载, 需要将gditray这种也用easyhook改写才能支持其他加载方式
2. 有些程序中渲中文字体不能渲染(SVN中r27应该已经解决, 至少一部分)
3. x64的DLL非常不稳定, 肯定有从32位到64位移植遗留的bug没有发现. 访问中文站点会导致IE 64-bit崩溃
4. 不能正常截获开始菜单, IE等Windows主界面的内容, 怀疑和easyhook有关, 还未确认.

下步计划

完善, 不断完善. 尤其是改善x64的DLL稳定性, 因为移植到easyhook的优点就是支持x64平台.

Categories: 开源软件 Tags: , , , , ,

DNS劫持的证据

August 22nd, 2009 4 comments

昨天晚上想访问某著名视频网站, 上传一个小视频. 历经4个小时, 始终没有成功. 期间, 先后用了多种代理服务器, 及itshidden, ultravpn这种VPN程序. 本来, 按照我的理解, VPN的传输层加密加上OpenDNS, 应该可以成功穿墙.

最后发现, 穿墙失败的原因还是出在DNS解析上. 现在的GFW, 应该不仅限于篡改、劫持境内DNS服务器的主机记录. 至少, 下面的实验表明, 境内任何主机发往境外任何IP的DNS协议报文, 都会被GFW劫持(至少北京网通是这样). 并且对敏感主机记录的查询请求, GFW会伪造一个DNS的响应, 给你错误的网站IP地址.

这就使得用诸如OpenDNS, SecureDNS之类的境外DNS也不管用了, 它可能完全收不到你发的某些报文. 这也是我用itshidden和ultravpn不能访问某视频网站的原因.

事实上, GFW甚至不关心你用的境外DNS服务器是否存在, 在下面的实验里, 我分别向几个瞎编的IP发送DNS查询请求, 都能成功收到解析出的IP地址. 实验如下:

  • 就爱你一生一世

image

  • 不爱你一生一世

image

  • 不信气不死你

image

  • 就要气死你

image

如果瞎编一个DNS服务器的地址, 都能收到DNS响应的话, 说明这个响应一定是伪造的.

当然, 在实验中, 我发现了IP地址也不是随便填的. 例如设置为下面两个, 就完全收不到DNS响应. 这个结果还算正常:

  • 我要死我要死

image

  • 我不要死我就要死

image

我的推测是, 要么上面的地址段本身属于中国地区, 不走GFW, 要么GFW不屑于劫持发送到上面地址段的报文. (未经确认)

我在实验中同时发现, GFW的报文伪造能力相当粗糙. 稍微修改下DNS查询的类型, 伪造的报文就出问题了. 见下面两个例子:

  • mx记录查询

image

  • ns记录查询

image上面的出错信息表明, 如果DNS查询不是关于主机A记录的, 如MX和NS记录, GFW伪造出来的报文格式都不对.

最后, 通过实验, 我进一步确认了, GFW的这一功能, 是安装在国内到国际的出口上。发往国内的DNS的请求就没有发现劫持和伪造的痕迹.

  • 设成国内一个不存在的DNS, 如网易机房的一个不存在的IP

image那我们应该怎么办呢? 应该说, 这种劫持方法并不是没有任何空子可钻.

首先, 我们可以修改hosts文件, 让那些敏感网站的IP解析完全不走DNS协议. 这是最近很流行的做法, 这种做法的缺点是人工工作量比较大. 还有一种做法是, 让DNS协议也通过VPN的加密信道发出去. 因为同是VPN方案的Hotspot Shield就可以完美的访问youtube和其他敏感站点, 我猜测是这些VPN为了提升用户体验, 没有让DNS请求也走VPN的加密信道(未经证实), 如果DNS请求本身加密了, GFW应该无从伪造.

我想象中技术上比较优雅的方案, 应该是本地运行一个DNS服务器, 通过HTTPS的方法与境外架设的服务器同步DNS记录, 这样既不用人工维护hosts文件, 也不用依赖于某个VPN. 残念…

Categories: Censorship Tags: ,

usplash主题制作问题

August 20th, 2009 Comments off

Debian下目前有3个可以用的usplash主题包,分别是usplash-theme-debian,debian-edu-artwork-usplash,brdesktop-artwork-usplash。目前在lenny下制作出来的效果都有问题。截图:

usplash

为了解决这个问题,我先分析了usplash主题的制作原理。usplash的主题制作过程大概如下:

  • 由一个svg图,分别生成1024×876,800×600,640×480等分辨率下的背景图片。其实也可以不用svg,但非矢量图缩放效果可能不佳。也可以手动PS不同分辨率下的背景图片,也就不用借助svg的缩放了;下图是一个背景图:

background_640x480

  • 编辑生成一个进度条的png文件。图像中除进度条部分,其他应该是透明色;下图是用gimp编辑进度条的透明色效果:

progress

  • 将不同分辨率下的背景图和进度条叠加,生成2种叠加后的进度条效果,分别代表"进度为0"和"进度为100%"两种状态;

progressbg_640x480

progressfg_640x480

  • 统一所有图片的调色板。包括不同分辨率下的背景图、进度条效果图。下面是用gimp编辑图片看到的调色板:

palette

  • 将png图片转换为c文件
  • 将c文件编译链接成so文件

而产生前面截图那样的错误,是因为图片的调色板没有统一。而调色板不统一的原因,是因为usplash用的图片转换工具修改了统一调色板的方法。

本来,usplash 用的统一调色板的方法,是通过imagemagick提供的convert命令,先将png转换到gif,再转换回png的方法。(可能是因为convert对png格式的调色板支持不好)。方法如下:

convert image.png +dither -map ./cmap.gif gif:-
  | convert gif:- image.png

后来这种方法不管用了。原因是从gif转回png格式时,convert不再保留调色板。

经过网上的搜索,发现新版本的imagemagick应该用下面的命令设置调色板:

convert +dither image.png -type Palette -depth 8 -map cmap.gif image.png

修改Makefile中相关语句后,再次编译usplash主题,就会出现正确的效果了:

usplashgood

附usplash-theme-debian的patch:

--- a/Makefile	2009-08-20 00:51:49.000000000 +0800
+++ b/Makefile	2009-08-20 00:34:28.000000000 +0800
@@ -88,8 +88,8 @@
 
 %.c: %.png cmap.gif
 	$(E) "  PNGSRC  " $@
-	$(Q) convert $< +dither -map cmap.gif gif:- | \
-	     convert gif:- $<
+	$(Q) convert +dither $< -type Palette -depth 8 -map cmap.gif $<.new
+	$(Q) mv $<.new $<
 	$(Q) pngtousplash $< > $@
 
 #cmap.gif: background.svg progress.png
Categories: 开源软件 Tags: , ,

Vi veri veniversum vivus vici 的来历

August 7th, 2009 Comments off

 

Vi veri veniversum vivus vici

By the power of truth, I, whiling living, have conquered universe

凭借真相的力量,我得以在有生之年征服全世界

这句拉丁文随着电影V for Vendetta火了,成为了很多人的格言。这句话是谁说的呢?电影里,V只提了一句“from Faust”(出自浮士德)。于是,很多人(包括我)都不假思索的认为是歌德说的。仅仅通过这两个词,就判断是歌德说的,未免有些武断。

如果线索不够,那就只有继续刨根问底。V for Vendetta电影改编自同名漫画。漫画中,介绍这句话时,用了“a German gentleman named Dr. John Faust.”[1]。于是人们趋向于认为这句名言出自Christopher Marlowe版的浮士德戏剧,该剧确切的名字是:The Tragical History of Doctor Faustus(浮士德博士的悲惨历史)。而目前,根据我从gutenburg网站查到的记录,现存两个Christopher Marlowe版本的浮士德[2][3],分别是1604年版,和1616年版。

但是,在维基词条的讨论[4]中,有人声称找遍了歌德版[5]和Marlowe版的浮士德,均没有发现该名言,或者任何片段的影子,无论是英文,还是拉丁文。在wikiquote项目中的V for Vendetta电影台词的讨论中[6],和相关博客的评论[1]中,同样有人声称,在Christopher Marlowe版的浮士德中没有找到这句话。

目前维基百科相关词条[7]和yahoo answer[8]相关问题的答案中,均认为没有该名言的没有确切出处。有的网站[9]更直接,将这句话的作者标记为Alan Moore,V for Vendetta漫画的作者。

本来,搜索到这里,这个问题就该结束了。这句话不是出自浮士德,而是Alan Moore自创的。

但是,在维基百科的词条中,还提到这个名言是Aleister Crowley的座右铭。而Aleister Crowley死于1947年。这么说又不可能是Alan Moore自创的了。同时,在维基拉丁名言收录[10]中,仍然认为这句话是Christopher Marlowe说的。

我迷茫了。

[1] Cameron’s Brain: VI VERI VENIVERSUM VIVUS VICI. http://reilly.typepad.com/cameronreilly/2005/08/vi_veri_veniver/comments/page/2/

[2] Marlowe, C. The Tragical History of Doctor Faustus from the Quarto of 1604. http://www.gutenberg.org/etext/779

[3] Marlowe, C. The Tragical History of Doctor Faustus from the Quarto of 1616. http://www.gutenberg.org/etext/811

[4] Talk:Vi veri universum vivus vici – Wikipedia, the free encyclopedia. http://en.wikipedia.org/wiki/Talk:Vi_veri_universum_vivus_vici

[5] Goethe, J.W.V. Faust. http://www.gutenberg.org/etext/14591

[6] Talk:V for Vendetta (film) – Wikiquote. http://en.wikiquote.org/wiki/Talk:V_for_Vendetta_(film)

[7] Vi veri universum vivus vici – Wikipedia, the free encyclopedia. http://en.wikipedia.org/wiki/Vi_veri_universum_vivus_vici

[8] ORIGINAL origin of: Vi Veri Veniversum Vivus Vici. Help? – Yahoo! Answers. http://answers.yahoo.com/question/index?qid=20090529222606AAAqJjt

[9] Quote by Alan Moore: "VI VERI VENIVERSUM VIVUS VICI" – "By t…". http://www.goodreads.com/quotes/show/60408

[10] List of Latin phrases: V – Wikipedia, the free encyclopedia. http://en.wikipedia.org/wiki/List_of_Latin_phrases:_V

Categories: 文化生活 Tags:

Nicolas Cage 新片 Knowing: 雷声大,雨点小

August 7th, 2009 1 comment

星期天早上爬起来看的,zenger 同学之前跟我提到这部凯奇的新片,所以在 VeryCD 看到就下了。感觉有些失望,推荐度 2 星。不是凯奇的 fans 就没必要看这部片了。

其实本剧一开始还是挺抓人的:神秘的小女孩,莫名其妙的数字,保存五十年的时间罐。这些设定还是比较精彩的,至少可以把还在睡觉的老婆吸引起来一起看。

本剧有不少败笔,简单总结如下:

  • 经常从树林中冒出的神秘人完全破坏了本剧的气氛,和其他情节的风格迥异,感觉格格不入。
  • 从 CD2 的中部开始,情节进展缓慢,非常拖沓。感觉是没话找话非得拍 2 个小时,其实剪接成 1 个半小时足够。
  • 看到最后,不知道这部电影的宗旨是啥,也不知道导演或者编剧希望观众带着什么观感走出影院。说虎头蛇尾不准确,因为尾巴太长,更准确的说是雷声大,雨点小。

自从看 Next 败了兴致,对以前爆喜欢的 Nicolas Cage 就有点失望了,按理来说好的演员到了中年应该对片子比较挑剔,看样子最近凯奇比较缺钱,接了不少烂片还债。

Categories: 文化生活 Tags:

持续改进比完美的第一稿重要

August 5th, 2009 Comments off

下文是对 zenger 这篇文章的回答:http://zenger-zl.spaces.live.com/blog/cns!9670EF4B93F93D73!666.entry

我对这个课题简直是太有发言权了。不管我去做什么事情,都会发现一堆的问题。发现问题本身不是问题,没有问题才是问题。以至于有一段时间我一度认为我是世界上最倒霉的人。

还有,因为从小受到的训练,导致我们还缺乏一个品质,就是“持续改进”。什么意思?就是说,我们从小参加的考试太多了,不管做什么,都有所谓的“交卷”心态,因为卷子一交上去,就不能改了,分数就定死了。

所以,写个程序也好,交个文档也好,交上去之前,花很长时间修改,生怕第一次提交后,“分数”就定了。但事实是,工作中的进度和程序中的代码,并不是你的考试卷。你最终的分数,不决定于你第一稿的“质量”,而取决于你持续修改的决心,和修改的次数。

小时候,有多少人会把卷子上错了的题,再做一遍?把错误的解法擦掉,换成正确的解法?工作中,你没有这种习惯,你就永远不会进步。

Categories: 文化生活 Tags:

愛因斯坦和愛丁頓

August 5th, 2009 Comments off

這是 zenger 推薦了很久的一部片,很慚愧,最近才看。其實推薦電影是一件很講究的事情,首先不能靠劇瀉剝奪了別人觀影的快感,其次不能過度夸張導致別人有了錯誤的期待。我一般是先通過評分,表示我的喜好程度,再列出我覺得電影的看點。這部片,我想可以給 4.5 分,介于強烈推薦和值得一看之間。

對我來說,這部片子的亮點、看點有幾個:

  • 電影 Eddington 的演員是 Doctor Who 2005 第二季往后的主演,一個很可愛的演員,我挺喜歡的。
  • Einstein 的演員不知道哪里找的,一臉胡子還粉嫩粉嫩的,太可愛了。尤其是電影最后,有超可愛的鏡頭,會讓你覺得這TM根本就是愛因斯坦本人。
  • 本片的背景,是一戰時期英國和德國的對立。科學無國界和科學政治化兩種主張,固守牛頓理論的英國科學界和以普朗克為代表的德國科學界,在在這個電影中發生了強烈的碰撞。這其中的沖突挺值得我們現在的人反思的。
  • 把科學講的絕對通俗易懂,完全不懂廣義相對論的人,都可以通過本片速成。當然是最粗淺的理解。
Categories: 文化生活 Tags:

李绩轶事若干

August 1st, 2009 Comments off

最近关注南北朝和隋唐时期的历史,看到些好玩的,怕忘了随手记下。

李绩是谁?

李绩是岁末唐初著名将领,以名字很多而“闻名”(奇怪的逻辑)。

李绩本名徐世绩,原是瓦岗军的将领,因降唐有功被赐姓李,遂改为李世绩。李世民借玄武门之变成太子,后登基。这时李世绩这个名字突然变得很不雅,太容易让人产生不恰当的联想。对于这种情况,常用的改字改音避讳法已经不管用了(例如,改为李石绩,还会让人觉得是哥俩好,如赵匡胤和赵光义),遂减一字,改为李绩。

李绩字懋功,所以也被人叫徐懋功,李懋功。本是挺阳光的青年才俊,但在历史小说《隋唐演义》里,由于艺术的需要,被处理成装神弄鬼的牛鼻子老道,能掐会算。为了避免不必要的麻烦,作者很狡猾的把小说中的名字改成了徐茂公。

李绩在李世民拟定的《凌烟阁二十四功臣》中排名二十三,与魏征、房玄龄、杜如晦等人一同留名千古。

降唐义举

徐世绩在瓦岗做将领时,实际掌控了瓦岗名下的大片土地。徐世绩的旧主,魏公李密,在兵败王世充之后,因猜忌徐世绩可能对他不利,未回转瓦岗旧部,而降唐王李渊。

因当时李渊势头渐盛,很多瓦岗旧将纷纷带兵带城投靠,以期投桃报李,得到重用。有人也劝徐世绩这个“大地主”赶紧投靠,定能获得重用。徐世绩这人老实巴交的,觉得他老东家李密孑然一身降唐,凄惨,自己拿着老东家的地盘去拍马屁,不义。

于是徐世绩自己把资产清算了下,列了单子托李渊转给李密,让李密献上瓦岗属地。李渊知情后大喜,赞为“纯臣”。

当然,也有人认为,徐世绩此举实际获得了赏识,因此未必不是故作姿态。这种诛心论在中国很有市场,龌龊的人以此为基础论证一切都是龌龊的,进而合理化自己的龌龊行径。其实,圣人未必不是披着伪善的外衣惺惺作态,但如果能让世界美好一点点,伪善和真善都无妨。

武则天

李绩打仗一等一,曾和名将李靖合作灭东突厥,死前灭高句丽。做官也是一等一,说话做事谨慎,绝不得罪人,因此政治生涯很长。

李绩历经高祖、太宗、高宗三朝,位高权重。高宗李治登基后,要立皇后。这小子立谁不好,非得立以前做过太宗妃子的武则天为后,于情于理都说不过去。李治招李绩觐见商量,李绩怕事,躲家里托病不去。

李治不断派人来征求李绩的意见,李绩逼急,回道“此陛下家事,何必更问外人”,李治大喜,遂立武则天。从此,这句话成为历代帝王在后宫胡作非为的不二借口。

后来武则天专政,李绩的孙子李敬业看不下去了,伙同一帮人在扬州造反。其中就有个叫骆冰王(鹅鹅鹅)的文人,写了一篇《讨武檄文》。此文骂人,骂女人,骂名女人骂出了文采,因此流芳百世。

武则天平乱后,剥夺李敬业李姓,还称徐敬业,诛九族,连已经下葬的李绩(徐绩?)都要掘坟暴尸。

Categories: 文化生活 Tags: