且行且远
分类: 随心所记 由 ssfighter 于 2011年8月12日 发表

去年买了一年的VPS,在Burst.net上面的,整体感觉还不错,而且很便宜,不过速度实在是不敢恭维,所以经过了一年之后,果断决定换个VPS。其实本来是很喜欢Linode的,但无奈Linode的价格太高了,最后选了Diahosting,是个国人开的VPS,口碑还凑合吧。我的流量比较小,所以买了个最低端的,基本也够用了。咨询了一下好像可以支持无缝升级,这样还不错。

现在的机房在硅谷,国内的访问速度确实是要快了不少,把之前的VPS上面的东西都搬了过来。不知道别人的访问速度怎么样,反正我这里觉得快了不少,而且ping值也降低了好多。

价格来说,Diahosting还是挺有优势的,我买的最便宜的,一个月$10。不过现在刚搬过来,到底怎么样还不好说,所以只买了一个月的,先观望一下再说。

有钱的话一定要换Linode啊!哈哈


分类: 漫步九州 由 ssfighter 于 2011年7月27日 发表

之前在大众点评团上团购了至尊租车的券,每天88元,所以一直在筹划出游的路线,终于在两周前的周末,也就是7月16日和牙开车去了趟河北易县,对,就是“风萧萧兮易水寒”的那个易水所在地,狼牙山也在这里,这一趟玩的很爽,唯一遗憾的是时间和里程有点不够用,易水湖没有去,清西陵也只是简单的转了转,没有进去。

本次出游的相册见:http://photo.ssfighter.com/index.php?album=2011-07-16yixian

自驾游出行线路(如果无法显示,则Google Map被墙了,请翻墙看):

View 2011-07-16 易县自驾游 in a larger map

7月15号周五晚上提的车,长安悦翔,车还挺新的,刚跑了一万多公里。第二天早晨出发,这次出发准备的比较匆忙,没带什么吃的,而且连车载充电器都忘了带,很郁闷。本来想从林翠路上五环,结果发现五环上车特别多,果断往回走,从学院路上四环。北四环、西四环上面车都不多,很顺利地到了岳各庄桥,从这里上京港澳高速。

京港澳高速在修路,所以从五环到良乡一段路开的异常的缓慢,几乎就是蜗牛一样往前爬,磨了一个多小时终于通畅了,据说走这条路的人主要都是去野三坡和十渡玩的。在杜家坎收费站改走廊涿高速,从易县的出口出来,沿着路开就能到易县了。

易县是个小县城,城区很小,但马路还不错,不知道是不是现在中国哪儿哪儿都在搞建设,我在各个县城总能看见许多的大翻斗车,运的慢慢的货,然后国道两旁总有警察在查超载,几乎一查一个准。在易县也不例外,城区里被这些大车弄得尘土飞扬,空气都是灰蒙蒙的。

先开车来到荆轲塔,荆轲塔在城区内,不收门票,但也没有游客。这个始建于元代的塔就那么孤零零地矗立在那儿,似乎已经有些歪了。
阅读完整文章 »


分类: 其他类别 由 ssfighter 于 2011年7月25日 发表

其实这个相册程序已经用了安装在我的VPS上很久了,但是一直都没有正经用过。最近正好在捣腾一些旅游的照片,就正式开始用这个相册程序了,捣鼓了一下,觉得还是挺方便的,就在这里推荐一下。在网上搜索了一下,好像目前国内用这个相册的用户还比较少,但我觉得这个相册的功能还是十分强的。

当时刚买VPS的时候,就在找开源的相册程序,打算在自己的VPS上放自己的相册,找了几个开源的相册程序,最后选定了这个。它的官方网址是:http://www.zenphoto.org/。安装的过程非常简单,只需要参照官方网站的安装步骤就可以轻松完成安装,像我是用nginx的,不需要设置任何其他的伪静态规则,很方便,安装步骤看这里:http://www.zenphoto.org/news/installation-and-upgrading

安装完之后,在后台设置好管理员的密码之后,就可以使用了。Zenphoto自带中文语言支持,不过简体中文似乎很久很久没有更新过了,不但很多地方的翻译不太符合国内的说话习惯,而且由于现在版本升级了,很多地方都没有翻译了。不过,基本上不影响使用吧。

Zenphoto提供了很多插件(简体中文的翻译里面叫“外挂”,我个人觉得这个翻译很别扭),这些插件很多默认都是未启用的,但有些插件我觉得还是挺方便的,在此推荐一下。由于Zenphoto本身已经不是一个简单的图床程序了,而是一个CMS系统,所以在启用了这些插件之后,整个系统的功能还是能得到较大的完善的。

  • Colorbox。启用Colorbox JS,可以在当前页面弹出一个窗口,显示原图。这个效果挺炫的,就是要这个JS挺大的,会影响页面的载入速度。
  • Flowplayer3。启用了这个插件之后可以用Flowplayer来播放在线视频(FLV、3GP之类的),这样,Zenphoto就不仅是个图床了,还是个在线视频的库。
  • Comment_form。可以让访问者留言。
  • Rating。可以让访问者给照片打分。

需要注意的是,Zenphoto的这些插件基本上都需要主题的支持,有些主题没有支持该插件的功能,那么这个插件就不能用。我目前使用的主题是zpArdoise,我挺喜欢这个主题的,需要的各种功能基本都有。

我的相册地址是:http://photo.ssfighter.com/。欢迎访问。另外,如果我有时间的话,会做一个更好的简体中文的翻译版本,把一些新版本没有翻译的地方加上翻译。


分类: 岁月流光 由 ssfighter 于 2011年6月7日 发表

高中三年,虽然有着辛苦,但也有许许多多的快乐。在这三年中,我努力过,也堕落过;欣喜过,也失落过;爱过,也恨过……想起李笑来在《把时间当做朋友》里面说过的话,人总是容易忘记痛苦。在高中三年里,其实我每天都在掰着手指算还要多长时间才能毕业。可是在离开高中以后,每每回想起高中的岁月,总是不自觉地微笑,这也许就跟当年的返城知青都愿意聚在一块儿回忆上山下乡的经历一样吧。

就像所有的重点高中一样,“考考考,老师的法宝;分分分,学生的命根”真是一点都不假。在我高中的几年中,考试就如同幽灵一样形影不离,随时会有考试,而且每个月都有所谓的月考,还会把各科成绩加起来,计算排名,每个月班主任都还会有月考的总结,谁谁谁这个月要是考的不理想,就会被单独叫出去聊天,问问最近的学习如何。

不知道别的学校如何,反正在育明,班主任似乎是会经常叫班里某位学生出去聊天,大概也就是聊聊最近班里的情况和学习、思想状况什么的吧,基本上一到自习课,班主任就会过来,敲敲某人的桌子,然后就和这个人到走廊上聊一会儿。那个时候由于在班主任不在的情况下,谁谁不守纪律都会被班主任从各个角度了解到,所以我们一直相信班里的某人就是班主任的耳目,在跟班主任聊天的时候就会向班主任透露班里的情况。要知道,那个时候的学生都是对这样的告密者恨之入骨的,所以即便某人真的是耳目,也不敢承认,无间道啊,哈哈。

高中时候,上午五节课,上完三节课之后是早操时间。在夏天,这个时候是做操的,好像一共是三套操吧,其中还包括太极拳,反正这个玩意儿我是一向打不好的,每次都被班主任骂,当然至今我都不知道打太极拳有啥用,明明是有强身健体和御敌的功能的,却只教你表面上的几个动作,毫无意义。这就跟中国的现行教育一样,其实教你的许多东西都是可以用在实际生活中的,可惜却从来没有人跟你说这个东西要怎么用,唯一的联系实际的场合就是数学的应用题,但却是一些根本没有实际意义的题目,弄得学了几十年的科学知识,遇到明显的谣言和伪科学依然无力判断。

扯远了,夏天的这个时间是做操,冬天的这个时间是跑操,就是各个班级在操场上跑步。各个班的班主任都跟打了鸡血似的,生怕本班的精神风貌不如别班,各个班都喊“一、二、三、四”,大家都生怕自己班喊的声音小了,被别的班盖过去。那个时候谁要是不大声喊,就会被班主任批评,现在想来还是挺有趣的。

夏天的时候,虽然是做操,但是一到周五,大家就不做操了,不做操干什么呢?发动群众在操场上捡沙砾和废纸。那个时候我们学校刚刚修好塑胶的操场,校领导为了保持操场的干净和整洁,每到周五就让我们蹲在地上开始捡操场上的脏物,班主任也会盯着,看看有没有人故意偷懒……我每每想到小学、中学时候,都觉得学校的值日、打扫卫生的制度给学校省了一大笔钱,直到后来读研、工作坐进了办公室,才知道原来办公室是可以聘请保洁员来打扫卫生的,相比之下,学校只需要用“德智体美劳”全面发展这样的口号,就可以把保洁员的工作给省去,而且学生还生怕自己干的不好而被批评,哈哈。

其实我在高一和高二时候的成绩并不那么好,后来只是因为运气好一些,才侥幸得到了保送上THU的机会,这恐怕也是为什么每次我梦到回到高中时代,总会吓醒的原因吧,因为我知道自己如果再回一次高中,就再也不会有机会上THU了,呵呵。得知保送的消息是2003年的3月份,3月底校领导就把我们这些保送生都给撵回家了,怕我们在学校会影响其他同学的心态。我记得我得知保送的消息后,有一天晚课,我还举手向老师提问题,被全班同学鄙视,哈哈。

保送后在家呆着的日子,是我长这么大来最轻松的时光吧,没有压力,无所事事地在家休息了四个半月的时间,一直到8月中旬去北京报道,上大学。大学四年是最幸福的四年,接触了很多,成长了很多,要是想好好写大学四年的生活的话,恐怕写上几天几夜都写不完。我在大学刚毕业的时候动笔写过《关于大学那些事》,只是后来生活经历了些变动,就停笔不写了。我想我还是会争取把那个系列写完的,因为过了这么多年,再写大学生活可能和大学刚毕业的时候的感触有很大的不同吧。《再见了,十九年的寒窗》不想用太多的篇幅写大学时光了,就草草的以流水帐的形式带过吧。


分类: 逆向手札 由 ssfighter 于 2011年4月14日 发表

最近在做RNDIS设备的开发,这方面的资料网上都比较少,周围也找不到人可以问,只好自己对着MSDN的文档硬啃,不过却在起跑线上栽了个大跟头,经过分析之后,基本确定是一个Windows RNDIS驱动的小bug,在此写下来以作记录,同时也希望能帮到遇到同样诡异问题的人。

现象:
我们的USB设备是复合设备,除RNDIS功能之外还有其他的功能,我用IAD来将RNDIS的两个Interface聚合,同时,RNDIS的两个Interface紧接在已有的Interface之后,其接口编号是02、03。在按照MSDN上的inf文件修改过之后,插入设备后可以正确地找到驱动,但安装完驱动之后立刻蓝屏重启,估计是驱动程序初始化时候出现的错误。

分析:
RNDIS的驱动分为两层,一个是rndismpx.sys,一个是usb8023x.sys,前者实现RNDIS协议栈的功能,后者实现USB-RNDIS的枚举、通信等功能。这是因为RNDIS设备本身是总线无关的,只是目前只有USB-RNDIS的功能,但驱动仍然是分层设计的。用WinDBG打开死机后DUMP出来的log文件,可以看到系统崩溃在以下位置:

eax=00000000 ebx=893461b8 ecx=870da99b edx=870da99b esi=870da958 edi=86dd3870
eip=a6c39216 esp=ba507684 ebp=ba507698 iopl=0         nv up ei pl zr na pe nc
cs=0008  ss=0010  ds=0023  es=0023  fs=0030  gs=0000             efl=00010246
usb8023x!SelectConfiguration+0x9a:
a6c39216 8a4805          mov     cl,byte ptr [eax+5]        ds:0023:00000005=??
Resetting default scope

DEFAULT_BUCKET_ID:  DRIVER_FAULT

BUGCHECK_STR:  0x7E

LAST_CONTROL_TRANSFER:  from a6c39472 to a6c39216

STACK_TEXT:
ba507698 a6c39472 00000000 86dd3870 00000000 usb8023x!SelectConfiguration+0x9a
ba5076b0 a6c39aad 86dd3870 896c8de4 86d57738 usb8023x!InitUSB+0x32
ba5076c4 ba3e115b 86e22ecc 86e22efc 86e22cf8 usb8023x!RndisInitializeHandler+0x2d
ba507724 b9dd4dea ba507760 ba507768 b9dd0200 RNDISMPX!RndismpInitialize+0x2eb
ba5078dc b9dd49cc 8a0d9d88 ba507900 ba5079a8 NDIS!ndisMInitializeAdapter+0x3b7
ba5079b0 b9dd48ba 8a0d9d88 00000000 896dc648 NDIS!ndisInitializeAdapter+0xb9
ba5079e4 b9dd5daf 86ddb698 86ddb7bc 86ddb698 NDIS!ndisPnPStartDevice+0xd6
ba507a14 ba3e5ed6 86d57638 86ddb698 86ddb7e0 NDIS!ndisPnPDispatch+0x306
ba507a30 804ef19f 86d57638 00000000 ba507aac RNDISMPX!PnPDispatch+0x4c

可以看到,是在USB初始化检查配置描述符的时候出错的,于是赶紧检查自己的USB配置描述符,并未发现问题,只好用IDA打开usb8023x.sys,进行逆向分析,定位在系统崩溃的位置:

.text:00011210 call ds:__imp__USBD_ParseConfigurationDescriptor@12 ; USBD_ParseConfigurationDescriptor(x,x,x)
.text:00011216 mov cl, [eax+5] ; 系统崩溃处!
.text:00011216 ; 返回值eax为零,造成内存访问错误,导致系统崩溃。

可以发现,usb8023x.sys在调用完解析配置描述符的函数之后,并没有判断是否解析成功。查询WDK文档可知,USBD_ParseConfigurationDescriptor的返回值是一个指针,指向要查询的接口描述符的首字节。如果找不到该接口的编号,则返回NULL。在这里,驱动没有找到我们的接口描述符,又没有进行失败检验,因此造成了内存访问错误,系统崩溃。可是我的接口描述符明明是有的啊,继续往上看:

.text:000111FA and [ebp+arg_0], 0 ; Interface number从0开始
.text:000111FE add ebx, 18h
.text:00011201 cmp byte ptr [esi+4], 0 ; 有几个Interface?
.text:00011205 mov [ebp+var_8], ebx
.text:00011208 jbe short loc_11233
.text:0001120A
.text:0001120A loc_1120A: ; CODE XREF: SelectConfiguration(x)+B5j
.text:0001120A push 0 ; AlternateSetting
.text:0001120C push [ebp+arg_0] ; Interface number
.text:0001120F push esi ; Configuration Descriptors
.text:00011210 call ds:__imp__USBD_ParseConfigurationDescriptor@12 ; USBD_ParseConfigurationDescriptor(x,x,x)
.text:00011216 mov cl, [eax+5] ; 系统崩溃处!
.text:00011216 ; 返回值eax为零,造成内存访问错误,导致系统崩溃。

可以知道,esi=870da958处保存着配置描述符。[ebp+arg_0]是接口的编号,usb8023x.sys将从接口0开始查找,可是我的RNDIS设备是接口2、3开始的,在WinDBG中看看esi处的数据:

0: kd> db 870da958
870da958  09 02 43 00 02 01 04 c0-00 09 04 02 00 01 02 02  ..C.............
870da968  ff 00 05 24 00 20 01 05-24 01 00 01 04 24 02 00  ...$. ..$....$..
870da978  05 24 06 02 03 07 05 83-03 08 00 01 09 04 03 00  .$..............
870da988  02 0a 00 00 00 07 05 84-02 40 00 00 07 05 04 02  .........@......
870da998  40 00 00 00 00 00 00 00-0a 00 05 0a 46 53 66 6d  @...........FSfm

其中前9个字节的配置描述符并不是从我的设备上传上来的,应该是Windows驱动在对复合设备进行描述符分析的时候自动生成的,可是后面的具体的接口、CDC、端点描述符确是直接memcpy过来的,而usb8023x.sys首先从接口0开始解析,然而接口0是不存在的,自然造成系统的崩溃。

解决:
这个问题主要是usb8023x.sys认定RNDIS的接口必须从0开始,而且驱动没有进行函数返回值的判断,造成的系统崩溃。解决方法也很简单,只需要把自己的设备的RNDIS的接口放到最前面即可。当然,如果USB设备不是复合设备,只有RNDIS一个功能,那么这些问题应该都不会遇到。

转载请注明出处,谢谢。