posts - 94, comments - 250, trackbacks - 0, articles - 0
  C++博客 :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理

int RussianMul(int n, int m)
{
int remain = 0;
while(n != 1)
{
// odd
if (n % 2 != 0)
{
n = (n-1)/2;
remain += m;
m *= 2;
}
// even
else
{
n /= 2;
m *= 2;
}
}
return m + remain;
}

posted @ 2008-09-13 22:00 Condor 阅读(439) | 评论 (0)编辑 收藏

上周,“番茄花园”作者洪磊被警方带走,传出的罪名是涉嫌侵犯微软著作权,也就是俗称的“盗版”。(8月24日北京晨报)

  从番茄花园的站长被拘捕、番茄花园网站改版开始,“番茄门”开始成为网络间仅次于奥运会的热门话题。与当初人们对“珊瑚虫事件”的反应有些类似,有一部分网民开始为番茄花园叫屈,“支持番茄花园”式的呼吁此起彼伏。

  对于部分网民的这种反应,我理解他们的苦衷,但从更长远的方向看,笔者又反对这种支持番茄花园的举动。我想对他们说:为了我们自己的利益,请不要支持番茄花园。

  支持番茄花园就意味着支持盗版、支持盗版就将我们置于被动的地位,这是一个很浅显很直白的道理。网民们并非不懂这些,只是因为弱者的激愤才有了前面那些不正常的支持。盗版产生并且泛滥的主要原因是消费者的经济条件与正版软件的销售价格难以匹配,如果我们普通人的财力足以接受售价上千元的微软系统并且不拿它当回事、如果微软的系统免费或者价格低的与盗版别无二致,那盗版不大可能会有源头也不大可能会有市场。但在垄断和经济条件面前我们普通消费者是弱者,所以支持廉价甚至免费的盗版这个错误的选择成了部分网民在番茄花园站长被抓后第一反应。

  实际上,网民们支持番茄支持盗版的想法有些天真,他们也许认为只要我们用盗版支持盗版的话微软就无可奈何、微软就有可能因此蒙受巨大的损失。但是,部分网民的支持盗版能改变微软独霸天下的垄断地位吗?只能是加强这种地位;部分网民的支持盗版能够使微软的“天价”降低吗?这近乎于天方夜谭。支持盗版只能让微软有足够的理由在知识产权方面对中国指手画脚、支持盗版只能让微软的垄断地位毫发无损、支持盗版只能让微软的天价居高不下、支持盗版只能让国产软件业继续没落,支持盗版,对我们有什么好处?一点好处也没有。

  我们普通百姓希望自己使用的软件有低廉的价格(最好是免费)、简便的操作、能够得到保障的质量,但很难实现,所以才会退而求次选择盗版。可如果正版具有远胜于盗版的优点的话你还会用盗版吗?很明显,我们当然会去用正版。那么,如果我们的政府能凭借法律的力量强迫微软实现上述目标的话,我们的目的不就达到了吗?所以,我们不应该寄希望于用盗版去打击微软,这违反了法律;我们应该推动政府用法律去制裁微软,因为已经有了微软在欧洲和美国被起诉的先例。

  如果我们某些人还在为番茄花园的倒掉惋惜的话,那说明我们很短视;如果我们还在为支持番茄花园摇旗呐喊的话,那我们是在拖《反垄断法》的后腿。这对我们毫无益处。我原来以为“番茄门”是微软拖延时间的一个手段,后来我反过来一想,这何尝不是我们《反垄断法》解决微软垄断问题的一个良好契机呢?

  廉价或者免费不是我们的终极目标,从长远看我们应该有更远大的理想。我想劝那些支持番茄的人们几句:你不愿意花钱,你可以去用Linux,如果使用不习惯,你可以学习或者等待,但为了我们自己的利益,请不要去支持番茄花园。

posted @ 2008-09-08 21:33 Condor 阅读(1138) | 评论 (9)编辑 收藏

村民石章云3年前患了食道癌,现病重不起

刘长月老人在发臭的黑水河上,吃力的挪动着渡船

王子清已记不清自己主持过多少次葬礼了。

自打他48岁那年起,癌症患者便在村子里多了起来,死亡接踵而至。每遇死亡,王子清必会到场,或主持,或与亡魂告别。多数情况下,他是主持者。

本来,作为子字辈的他,是没有资格主持这种仪式的。子字辈之上,还有祖父辈的玉字辈和父辈的德字辈。在村里,这种告别亡魂的庄严仪式,通常是由年岁较大且德高望重的老人主持。但如今村子里玉子辈的人已所存无几,而德字辈的人,或因癌症相继去世,或已“逃离”了这个村子。因此他这个小子辈,就责无旁贷地担当起了这个任务。岁岁月月,“送走一茬又一茬”。

“每死一个人,我的心就像刀割一样。”现年65岁的王子清步履蹒跚地走在村中,神情黯淡。有时,他还会停住脚步,摆摆手,不去追忆往事,“都是大好的年龄,死的太可惜了。真不知道啥时才是个头啊!”


死人就像家常便饭一样

位于河南省沈丘县城东约10公里处的东孙楼村,共有1200多人。原先孙姓为望族,后王姓成了大姓。现全村王姓约有800多人。

自上世纪90年代以来,村里的人出现了密集的反常现象:有些人腹泻不止,有些人内脏出现了各种不适。此外,偏瘫、智障、畸形和妇科疾病也频频出现。患者相继死去,少则一年内五六人,多则达20多人。死者经诊断多为食道癌、肝癌、胃癌、直肠癌、子宫癌、乳腺癌等等。

死亡像个挥之不去的幽灵,笼罩着这个村子。新起的坟茔、白对联、哀乐,一年四季绵延不绝。

王子清的族人便是这个不幸村庄的不幸家族。

1991年,小他5岁的弟弟食道出现问题,吞咽困难。次年,大他两岁的哥哥也出现同样病症。俩人的病后来都转化为食道癌。2004年6月,王子清的哥哥病逝。28天后,他的弟弟也撒手人寰。这边丧事还没料理完,3天后,他的一位叔叔也死于食道癌。短短一个月,王子清相继失去3位亲人。

而这仅仅是幽灵掀开的序幕一角。事实是,这些年,仅王姓德字辈的族人中,25对夫妇,便有19人死于癌症。而子字辈中不到80人,便有16人死于癌症。死者大都正值壮年,最大的70岁出头,最小的只有30岁。

“死人就像家常便饭一样。”王子清抽泣着,任由眼泪淌满褶皱的脸上,“我不知道村里到底死了多少人,只知道一个接一个地死。”

王子清本人虽然没有患上癌症,但胃穿孔也让他遭了不少罪。2004年,他花了5000元做了胃部手术,至今天气转凉,伤口就会隐隐作痛。为“转移痛苦”,他染上了抽烟的毛病,一支接一支,一会儿功夫,一包烟就空了。

在大多数地区,通常每个村里有一名医师就不错了,但在沈丘县东孙楼村却增加到了4名医师。刘德亮是村里最老资格的医师。他记得最忙碌时自己每天要跑三四家,“抗生素药供不应求”。村里的人口一度竟出现了负增长。

一位正在病床上输液的腹泻患者挣扎着坐了起来,插话说,就是现在,村里患腹泻的病人至少也不下100人。

不仅是东孙楼村,自上世纪90年代以来,沈丘县的黄孟营村、孟寨村、孙营村等,癌症患者的比例均大幅度上升。据该县政协常委、民间环保组织“淮河卫士”会长霍岱珊提供的资料显示:1990年~2005年间,2470人的黄孟营村,有116人死于癌症;2366人的孟寨村,有103人死于癌症;1697人的孙营村,有37人死于癌症;1300人的陈口村,有116人死于癌症;2015人的大衤者庄,有145人死于癌症;1687人的杜营村,有187人死于癌症。而据沈丘县医院记载,1972年当地120万人中,只发现癌症患者12人,发病率仅为十万分之一。

由于癌症爆发的密度大、频率高,故上述村庄被当地人称作“癌症村”。3年前,河南省周口市有关部门,曾联手在沈丘县的“癌症村”做过一次癌症患者的入户统计,但该数据一直没有公开,沈丘县卫生局的一位副局长表示,不能向记者提供。

谁得病谁家就败

在王子清隔壁的一条小巷子里,原先住着16户人家,现在只剩下3户了。其中,有两户全家死于癌症,其余的因害怕也搬走了。

恰逢雨后,巷子里一片泥泞。在这条约100米深的小巷子里,已有很长时间没人出入了,显得分外寂静。有一户人家的房子是两层预制板楼,在这个人均年收入不到1000元的村子里,这栋小楼显得十分气派。但如今铁门上的锁头已经生锈,门口杂草丛生。显然,这里早已人去楼空了。

“死的死,走的走。”王子清趿着拖鞋,在泥水中“啪嗒啪嗒”地走着,不时发出重重的叹息,“以前这里可热闹了,现在一点生气都没啦。”

这个东西长约1公里、南北宽约半公里的村子,上世纪90年代以前,曾和许多村一样,过着自给自足的闲适生活。农忙时,男人女人热火朝天地干活,换取一年的口粮。收成好的时候,兴许还会落些余钱,添几件衣服,买两件电器,乐呵一番。不忙的时候,男人们出外找些活计,或在本地打打零工。空闲时,招呼几个人喝上几盅,或搓一阵麻将。

可眼下,疾病和死亡像恶魔一样几乎缠扰着村里的每一户人家。街上偶尔遇到几个人,脸上也大都带着悲伤、无奈或茫然。有时能看到三五个人聚在一起,谈论的话题往往都和癌症有关。

一位癌症患者盖着一床厚被子躺在床上呻吟。经过化疗和放疗,她的头发已经稀稀疏疏,头皮清晰可见。裸露在外的胳膊和腿,瘦得皮包骨头。她紧闭双眼,嘴里不时嘟囔着什么。守在她身边的丈夫,愁眉不展,目光呆滞,偶尔下意识地给妻子掖掖被子。“家里有多少钱,也让病折腾穷了。”他说。

在这三间预制板结构的楼房里,大理石地板、雪白的墙壁、宽大明亮的窗户、墙上四大名楼的挂图,以及一台21英口寸的彩色电视机,多少彰显出主人的能干和富足。如果不是癌症拖垮了这个家庭,在这个举目都是低矮房屋的村子里,楼房主人的生活一定会让邻居羡慕。可现在,这间屋子里死气沉沉。

“谁得病谁家就败。”王子清说,有钱的人家,病人能多活两天,没钱的,就只能等死了。他一再表示,村子里钱都不好借,有钱也不敢借出去。“我们东孙楼穷,不是因为人懒,没能力,而是因为癌症。只要家里有病人,都得花上三两万块。”

王子清的一位叔叔患了胃癌,家里拿不出钱为他填这个无底洞,于是,在一个夜深人静的晚上,他上吊自杀了。“因没钱看病上吊自杀的,村里已有好几个。”他说。

人死了,葬礼照样得办。火化1000元,棺材1500元,孝服500~800元,灵车灵棚各100元,唢呐100元。各种费用算下来,至少需要5000元。因外出和死亡的青壮年多,棺材都没人抬,以至于吊车下葬,成了当地一个“热门”行当。

由于贫穷,村里如今盗窃成风。王子清家原来的围墙不高,人很容易翻墙进去。现在,他已把原有的围墙拆掉,准备加高。“我怕小偷。”他说。

村头墙壁上,到处是触目惊心的治疗腹泻、癌症的广告。有些患者无奈只能找江湖游医寻求安慰;有些患者则只能求助“神”的力量。

黄孟营村33岁的孔鹤琴,19岁嫁到此地,26岁得了直肠癌,4次手术,12次化疗,花了7 万多元,如今家徒四壁,外债高筑。两年前,“感到无望”的孔鹤琴皈依了基督。每周五,骨关节变形的她,都要坐在轮椅上,让丈夫推着,到两公里外的王寨村做礼拜。王寨村基督教堂的信徒芦美英则表示,七八十名教友中,基本都是身体有病的人。

孙营村的村民孙振雨,不忍看着自己的乡亲们忍受癌症的折磨,于1999年,筹钱2500元,修复了村里的华佗庙,“初一十五,香火很旺”。但华佗庙重修后4年,孙的爱人得了偏瘫,至今卧病在床。可叹的是,连塑华佗像的匠人也因癌症而去世了。

与周边“癌症村”一样,东孙楼村能参军的人很少。有几年,竟没有一个体检合格的。

“人活得都没有希望了。”王子清说,“村里的人总担心,下一个死的会不会是自己。”


又黑又臭的卫河在村口流过

都是污染造的孽

王子清家正对着一个大水塘,塘边有几棵树,几只白色的鸭子在水塘内戏水。如果不与癌症发生联系,塘边树下,静坐垂钓,本该是件惬意的事。

像这样的水塘,几乎每个村子都有几处,只是有些已经变成了倾倒生活垃圾的地方。在这个西北高、东南低的县域内,因河流冲刷,坑塘较多。加之,上世纪50年代后期,当地人鼓足干劲,大修水利。干渠、支渠、斗渠、毛渠,通向每一个角落。四通八达的灌溉系统,造就了这个曾经的鱼米之乡。

东孙楼村也有一个发达的灌溉系统。东南西北四条水渠,将村南两公里外的沙颍河水,输送到地里田间。这个处于沈丘县“锅底”的村子,即使在非灌溉季节,沟渠里也会积下不少的水。因此,这里几乎一年四季浸淫在水中。

在王子清的记忆中,沙颍河和渠塘里的水曾经清澈透明。上世纪50年代,这里的人上地,“从来不带水”。渴了,随便在渠塘中掬一捧水就喝。“甜着呢,比现在的自来水都好喝”。

可是,随着上世纪80年代末、90年代初,沿河一些污染工业项目纷纷上马,沙颍河水逐年开始变坏变臭,致使源自沙颍河的灌溉沟渠的水也变得腐臭难闻。在王子清的带领下,记者沿着村里的沟渠水塘走了一遍。水面上覆盖着一层绿油油的浮萍,树叶、秸秆散落其中,蚊虫猖獗,臭不可闻。

据沈丘县水文站站长李斌提供的一份资料:沙颍河槐店(沈丘县城所在地)段,1990年、 1994年、2000年均属劣V类水质,已失去各种水体功能。中国环境监测总站公布的水质监测周报显示:2005年和2006年,此段水质分别有两次是Ⅳ 类水,其余时间皆为V类或劣V类;2007年第20周和21周的水质也均为劣V类。水体中高锰酸钾和氨氮含量均超Ⅲ类水标准的数倍。

1994年7月中旬,淮河发生特大污染事故,在黑色污染团过后,水质有所好转的情况下,安徽省蚌埠市自来水公司取3000公升淮河水送到上海化验,结果对比美国环境保护机构公布的129种“首要控制污染物”,蚌埠三水厂和一水厂的源水分别查出90种和95种,其中,致癌物高达67种。

淮河60%的来水量源自沙颍河,而沙颍河贯穿沈丘全境。今年4月,中国环境监测总站对沙颍河的监测报告显示,其水质全部为劣V类。

“作为淮河最大支流,沙颍河的水质污染可想而知。”淮河卫士会长霍岱珊痛心地说。

有研究显示,这些高污染、富含各种致癌物的水,通过发达的沟渠逐渐渗透到地下水系统,破坏了当地的地下水水质。据当地人反映,自1990年代以来,压水井里压出的水混浊不清,能看到明显的杂质;有些地方的水,粘性特别大,能像油一样流成细线状;水烧开后,水壶上会留有厚厚的一层水垢;即使开水也苦涩难咽,喝下去后喉咙会发麻。有媒体称,“地下50米以上的浅层地下水已不能饮用”。而在沈丘,农户自家的压水井一般都在20米以上。

据阜阳市疾病预防控制中心2004年7月13日做出的一份水质检测报告显示:沈丘县黄孟营村一家的压井水送检样本中,有10多项指标超标,其中锰、硝酸盐氮严重超标。科学实验证明,过量摄入高硝酸盐氮的水或食物会引发消化道癌症或者肝癌,而高锰的暴露会对大脑产生危害,使一些大脑皮层坏死,对人的智力发育甚至大脑神经活动产生危害。

“都是污染造的孽。”王子清说,虽然他本人不能从科学上证明沙颍河水污染和癌症之间的因果关系,但生活经验和直觉告诉他,严重污染的沙颍河是癌症高发的直接元凶。

2005年,国家疾控中心曾对淮河流域癌症高发地进行全面普查,其中包括沈丘县全境,最终结论是:一、淮河流域沿河、近水区域癌症高发;二、癌症高发与劣Ⅴ类淮河水密切相关。

而沈丘县卫生局一位副局长表示,虽然河水污染与癌症之间一定有关联,但关联究竟有多大,专家还在研究实验之中。

希望政府搭建一个公众可以参与的平台

沙颍河由沙河、颍河于周口汇流而成,自西向东流经河南中东部,全长600余公里,是淮河最大的支流。沈丘,是沙颍河入安徽的最后一站。

“你们得利,俺们得病;你们升迁,俺们升天。”这是流传在沈丘县民间的一则顺口溜。主要针对的是坐落在沙颍河流域大大小小的企业,其中不少为高污染企业,比如造纸、皮革、塑料、酒类等等。这些企业中比较知名的有:项城市莲花味精股份有限公司(下称“莲花味精”)、扶沟县的扶沟味精厂、漯河的银鸽实业集团以及丁集皮革业等。过去这些企业的工业污水基本上都排放在了沙颍河中。据当地人反映,前些年,沙颍河水色如墨汁、臭气熏天,曾发生过呛死人事件。

驸马沟是项城市污水入沙颍河的一条人工河道。其污水源主要是城市生活污水和莲花味精集团的工业废水。

“以前这里臭气熏天,活像一个化肥窖,人人都得捂着鼻子走。”76岁的老船工连德财说。据老人描述,在没有污染之前,这里的水清澈见底,如果有什么东西掉到水里,岸上看得一清二楚。水里的鱼又多又大,经常能够捕到十几斤重的大鱼。而现在,这里的鱼几乎绝迹。即使偶尔能捕捞上一两条,也没人敢吃。在污染最严重的时候,“水里的鱼给什么喂,什么就死”。

据说,前几年,水面上到处漂着白沫。有一次,不知何故,驸马沟的水面竟然着火了,把泄水闸烧坏了。

“以前河里洗澡的人很多,每年都要淹死好几个人。”连德财说,“不过,水污染后也有好处,不会淹死人了。因为没人去游泳了。”

仅这条小小的驸马沟,污水一流就是十几年,迟迟得不到治理。而早在1994年国家就启动了治淮工程,历经10年,投资600亿,但至今未能实现“水体还清”的目标。淮河干流支流的治污任务,依然十分严峻。

“环保局是属地管理。很多污水都是从别处流到沈丘的,我们一点办法也没有。”9月5日,沈丘县环保局副局长徐启亮对记者说。沈丘县水文站站长也表达了水文站的无能为力。他说,水文站的权限只限于取样监测,并没有管理职能,因此,对治理帮不上真正的忙。他透露,有时地方政府出于利益保护,还会在一定程度上干涉水文站取水样。

不过,在治污形成共识的今天,特别是在上级环保部门的重拳出击下,一些企业已经被迫加入治污的行列。比如位于项城市的莲花味精,这个昔日沙颍河的排污大户,曾屡被媒体曝光并被罚款,10多年被迫为环保交了7亿多元学费。项城市环保局前局长还因此“下课”,该市分管环

保工作的副市长,也因此被责令深刻检查。

“做好环保是首先对企业的效益负责。”莲花味精环保事业部负责人王飞对记者说,“我们企业曾经为环保付出过很惨痛的代价,几次差点被关闭,因此绝不能再走老路了。”

“淮河卫士”会长霍岱珊,在沙颍河治污问题上曾屡次和莲花味精交涉,可谓“老对头”。今天他也认为,莲花味精“的确下了功夫改造自己”。

“企业在主观上对自己负责了,在客观上就对社会负责了。”霍岱珊说,希望企业能够意识到,做好环保是分内的事,是真正对企业发展负责的事。

少了莲花味精的污水排放,驸马沟的水质,在当地人看来,已经稍有好转,臭味也不像以前那么明显了。远远望去,几个老人坐在树荫下乘凉,卖冷饮的小贩在吆喝生意,更远处的沙颍河大桥下,几个孩子正在水中攀登桥墩。

今天,最让霍岱珊头疼的不再是像莲花味精这样的大企业,而是许多名头不响的小企业。这些小企业经常和政府职能部门玩“猫捉老鼠”的游戏。如果仅仅依靠政府职能部门的人手,根本无法发现不达标的排放,更不用说治理了。“更何况,有些地方政府还会刻意保护本地的企业”。

“政策宣传就像文工团。”霍岱珊说,“光有文工团不行,解决问题还要靠步兵,要打阵地战。”

“公众就是步兵,就是打阵地战的基础。”霍岱珊说,“组织公众参与,可以形成对排污口的实时监控。”他一再呼吁,希望政府搭建一个公众可以参与的平台,让污染源无处隐身。

命都没了,经济发展了又能怎样

王子清家先后打过4口井,依次是4米、15米、28米、40米。

井一次比一次打得深,但水的口感并没有明显变好。他自己也不知道这些水到底安全不安全,会不会让自家人远离癌症。每逢周末,在外工作的儿子和在城里上学的孙女,总会带些纯净水回来,这样的水,全家人才敢放心地饮用。

3年前,在霍岱珊的联络下,亚洲博爱救助基金会为东孙楼村的全部村民安装了水过滤器。尽管“ 这些设备并不能根本改变水质”,但村民们还是松了口气。此后河南省财政每年安排4000万元专项资金,用于解决重污染地区群众饮水安全问题。沈丘县也在这一年修建了污水处理厂。同年,有关部门还为东孙楼村打了一口200米的深水井,并提供了主管道、潜水泵和无塔供水装置。入户管道需各家自行购买,为此,王子清花了800多元。

2006年1月26日,即春节前三天,村里人第一次吃上了深井水。王子清把所有盛水的家伙都接得满满的,痛痛快快享受了一番。然而16天后,水停了,王子清获知的消息是试运行。4个月后,深井水正式供应。不过,“经常是三天两头没水”。

今年8月初,深井水又停供。王子清只能重新饮用40米的压水井的水。可是,几天后,他的胃开始不适,“一天到晚折腾个没完”。其间,他的老伴过生日,因为没水,他只得用摩托车载着老伴,到沈丘县城过生日。

“潜水泵的功率太小,负荷太大。周边几个村的水,都是接东孙楼的水,电机超负荷运转,烧坏了。”深井水管理员说,“潜水泵是水利局提供的,我到水利局找过,可水利局说没有配件。”

这位管理员表示,自己曾和厂家联系过,但总也联系不上。“电机坏了,潜水泵就不能用了,得换新的”。

然而换潜水泵又产生一个问题:“水利局不给换”,村里又没有钱,他不知道到哪儿去弄钱。“我也想过集资,但又怕集资违法。”管理员说,他只得挨家挨户做工作,一家收三五元,先把大功率的潜水泵买回来,以便尽早让村里人喝上“比较放心”的深井水。

另一个让他头痛的问题是,1元/吨的水费,还不够付电费和管理费用。“实在没钱,那就只好断水了。”管理员摇了摇头。

“以前,我最大的心愿就是村子里能打上一口深井。”王子清俯身望着井底,“可是三天两头断水,成本又那么高,以后我们该怎么办呢?”

虽然深井水供得断断续续,可毕竟隔三岔五有了水吃。然而,有了深井水,并不意味着癌症病魔从此就远离了这个村庄。霍岱珊以前联系过的一些癌症患者,相继都离开人世,现在不断仍有新的患者的名字传入他的耳朵。

王子清也常常担心,活着的人会有各种隐疾。他希望有关部门能为村里的人做一些专项检查,建立村民医疗档案,并派专人检验一下深井水的水质,是否真正得到了改善。

虽然新农村建设的口号,在东孙楼村喊的与外面的世界一样响,但老王真诚希望“不要仅仅是一阵风,仅仅是应付检查”,而是能确实给村里改善一下环境,比如道路硬化,渠塘净化,等等。

“命都没了,经济发展了又能怎样?”王子清质问。

对于东孙楼村出现的新问题及群众呼声,沈丘县卫生局一位副局长称,有关部门曾做出过应对措施,但这些应对措施还没有公开,不便透露。

不过,霍岱珊倒是带来一条好消息:一位日籍华裔将为村里提供生物过滤技术,据说应用此技术,届时就可喝上“达标”的水。

“莲花味精总经理高君也说了,他们公司将积极对待沙颍河的污染问题,要为历史的欠债填坑(埋单)。”霍岱珊说。

尽管东孙楼村治污的脚步在加快,可村子外的污染仍在继续。途经纸店镇一带,依然可闻到刺鼻的气味。司机介绍说,那一带的皮革厂很多,污染特别严重,许多树都死了。记者沿途看到,沟渠里的水黑乎乎的,像是粘稠的发酵物,沟渠边的几行树,叶子已经完全脱落,毫无生机。

一只野鸭子在不远处的水塘里游弋,司机放慢车速,瞟了一眼。

“这年头,能看到野鸭子可不是一件容易的事。”他说。

posted @ 2008-09-04 20:53 Condor 阅读(614) | 评论 (5)编辑 收藏

就在SIGGRAPH大会刚结束之后,AMD和暴雪在AMD官方网站上放出了《星际争霸II》的官方技术文档,通过游戏引擎技术的展示让星际迷们感受到越来越多的惊喜。

画面优化给CPU带来考验
着色方面,在使用原型的基础上利用3D Studio MAX让程序员对整体效果做最大的优化,反复的提炼使得整个作品就像被艺术家精心雕琢一样,配合上8000个独特的、不重复的线性着色渲染代码,使得Starcraft II与早期的游戏代码相比增加了N倍。

        在游戏制作初期,暴雪就认识到GPU的强大性能,因此在设计的时候就采用了以GPU为主的优化和大幅度图像质量增加。

        由于使用大量像素渲染操作,如果在游戏中当你选择了控制成百上千的zerglings或者marines等作战单位集体行动,势必造成CPU超负荷,即便是强大的GPU这也是一个考验。
大量的视觉特效(Based Effects)
        包括FP16 HDR、光线散射/反射效果(Diffuse and specular for lighting)、景深效果(depth of field)、体积雾(fog volumes)、动态环境遮蔽(dynamic ambient occlusion)、智能贴图置换(smart displacement)等等,这些都是Starcraft II的“BT”之处。

        然而,作为一个即时战略游戏,暴雪依然在“故事情节”的设定上下足了功夫,在游戏引擎的影响下,延迟缓冲器的深度和平均值,包括着色组建都完全为了效果而服务。而照明管道和阴影的利用也让深景效果等一些特效表现得淋漓尽致。不过,这些特效都还在讨论中。
在早期的开发过程中,图形引擎也作为一个重点中的重点进行设计:
可扩展性第一
        对于游戏引擎来说,一个主要的设计目标是扩展的引擎。暴雪的游戏质量是人所共知的,不光是他们的能力,更重要的是经验,从以前的一系列游戏开发经验来说,整个游戏各种族之间能力的平衡问题非常重要,而且图像效果之间的兼容性也必须考虑到,这样也是为了各种不同平台硬件之间搭配的玩家都能体验这个游戏的魅力所在,以确保游戏有足够的竞争力,因而从ATI Radeon 9800/NVIDIA GeForce FXs系列到ATI Radeon HD 4800s和NVIDIA GeForce G200s都可以轻松的进行游戏。
        相比之下,GPU的负载才是重点,像素着色单元往往会因为大量的单位同时出现而使得GPU难以承受,顶点着色单元的运用也必须合理,而先进的GPU才能体验到最大限度的特效,而对于普通的GPU只能尽量减少使用率来保证游戏的流畅度。
一个引擎,两个“世界”(Dual Nature of the Engine)

        这个双重性质的引擎使得整个游戏有更完美的体验,其实就是说SC2具有两个视角模式,一个是普通的RTS视角、一个是单人模式的RPG视角,当然在这两个模式下呈现的画面效果是有所不同的。具备两个视觉模式的原因正是我们之前提到的故事模式,当切换到单人模式的RPG视角时,玩家将会体验到暴雪对于整个游戏设定的精妙之处,通过一系列互动,包括对话等手段,其实从某种感觉上来说更像是第一人称射击游戏(FPS)。
    暴雪还将对这些不同的设定做更为细致的讨论,这样才能让玩家体验到不同的技术效果的运用。
屏幕基础效果
        作为Starcraft II的另一个设计目标,照明环境模式让游戏的互动更多,之前在魔兽争霸三中,每个单位有一个硬性限制,有多少亮度,可能会影响它在任何特定时间。出于这个原因,使用动态照明是相当微不足道的,但是在Starcraft II中每个单位有一个照明设备,当其中一个开启之后其他也会开启,这样效果非常好,但是由此带来的地图的设计和绘制,包括地图地形切片就成了相当复杂的问题。而即便是解决了这些,给GPU带来的负荷也是巨大的。
        针对于此,暴雪也做了很多限定 :
        ◆ 颜色组成部分,并不受当地照明,如发射、环境地图和点燃前期的彩色组成部分;
        ◆ 深度;
        ◆ 每像素正常;
        ◆ 如果使用静止环境闭塞,出口的环境闭塞的纹理被忽略,如果屏幕空间环境闭塞启用;
        ◆ 亮灯的弥漫物质的颜色;
        ◆ 亮灯的镜面材料的颜色。

解码缓冲器
        所有的缓冲器应该都使用相同的深度,不幸的是似乎这些缓冲器远远不能满足暴雪的需要,这些缓冲器以24字节每像素推动输出带宽,这样使得整个带宽明显不足,因此在安置光源的时候必须牺牲一些。
        为了向MRTs提供每像素值以保证用于各种的效果,因而以下必不可少:
        ◆ 深度值为照明、雾卷、动态环境闭塞和智能景深,预测,边缘检测和厚度测量;
        ◆ 平均值为动态环境闭塞;
        ◆ 弥漫性及镜面照明。
延迟渲染
        在Starcraft II中延迟渲染只适用与当前的渲染,包括灯光的点和散射出去的面都要再渲染,但是由于游戏中会出现很多的照明设备,如果都使用这样的方法渲染的话一定会造成画面过于缓慢,因此延迟缓冲器的出现也解决了这一难题。在延迟渲染和着色方程式的帮助下计算机能很快的绘制出不同形式或者更为复杂的光源,这样也为其他的计算提供了一个后处理的过程。
像素坐标重建

        受益于早期的样板,暴雪在设计新的形状和色彩的时候轻松了不少,而且同时还释放了CPU。

        相机原理我们都知道了,就通过这样的模式使得暴雪在视觉上更了解该如何设计。

屏幕空间环境光遮蔽
        屏幕空间环境光遮蔽(Space Ambient Occlusion,简称SSAO)。如果对这个名词感到陌生,那提及到让大家记忆犹深的《Crysis》逼真的光照效果时,一切就很简单了,这就是SSAO技术的独到之处。
        暴雪在这使用这方案的时候考虑到了整个空间的效果和质感,也许从某写方面上来看,没这个必要,但是基于暴雪的理念,一点点瑕疵都是不被允许的。

        在任何可见的点和表面在屏幕上,采取多个样本(8至32),这些样本,表现了在三维空间中从目前的点计算,到预计回屏幕空间所需的时间和深度。

        现在的目的是检查是否深入采样点,如果接近这个更远的采样点本身能获取信息的话就这么做下去,这是一个函数问题,因此需要复杂的计算。


        不过在对地图的计算时不会采用这样的方法,这仅仅是为了形成一个空间的效果而已。
模糊效果

        前面的一切都是为了更加细致的描绘出所有的场景,但是,有时候游戏还是需要一些模糊的图形图像,如果一直使用SSAO技术的话,必然导致不真实。
        对于SSAO来说,虽然是一种优势,但是高智能的判断在这时也显得尤为重要,何时需要高精度的细致图像,何时需要动态模糊效果,无论是着色还是渲染都需要大量的资源的计算才能显现这些复杂的效果。
自我闭塞

        这也是一个相当复杂的效果,就像一个围绕着一个半球体产生偏移向量,这一点上在屏幕上(这意味着需要使用大量的延迟缓冲器),由一个矩阵转化每个偏移向量和正常向量来抵销矢量。
边缘处理
        偏移向量在空间中并不像在屏幕空间中一样,由于镜头的不断移动使得SSAO不断变化,这样就需要在移动的过程中对镜头的边缘进行处理,以保证完美的视觉效果,但是纹处理包装上并不是一件简单的事。
SSAO的表现
        SSAO提供的效果是让人相当满意的,视觉图像质量的处理近乎完美,但是成本过高,而且大量使用还是会造成系统性能瓶颈,这样得不偿失,因此合理的使用这个技术也是讨论的问题之一。
SSAO和整体光线效果
        从图中很明显的发现了SSAO的精妙之处,如此逼真的效果让人赞叹不已,其实更多的还是其后面的技术支撑。



    我们可以把一切制约因素一起使用以下过程表示:
        ◆为每个像素在源的形象和存储执行一个全屏幕通过计算混乱循环结果,在Alpha通道的每边缩减一个CoC图像缓冲区的四分之一大小;
        ◆产生中等模糊图像通过应用的RGB高斯模糊与每个样本对源图像加权CoC;
        ◆产生的最大模糊图像只有缩小的RGB的图像缓冲区源图像的四分之一,每一个CoC和大型模糊缓冲器可以同时使用不同的通道;
        ◆最高模糊图像与RGB样本加权由缩减CoC执行,Alpha通道中载有CoC,也有模糊,但其样本不加权本身;
        ◆缩小和模糊一张深度地图成为一个缩减深度图像,重用深入SSAO缩减(SSAO不模糊深度 );
        ◆然后开始最后的景深着色,有一定的形象来源,中等和大型模糊、模糊CoC的形象,非模糊深入地图和缩减深入形象的渲染。



        景深渲染包括:
        ◇计算小模糊价值,直接使用小样本着色四近邻像素;
        ◇计算CoC的像素(缩减CoC将不匹配);
        ◇样本非模糊,使用模糊的深入比较——计算机CoC,如果是模糊的深入,比非模糊的深入更远,否则使用CoC价值样本,模糊CoC的形象;
        ◇计算贡献,从每一个可能的模糊图象,计算小模糊的颜色,中型和大型的图像模糊的基础上,CoC的因素;
        ◇小型,中型和大型模糊;
        ◇输出Alpha包括的源(无模糊)形象。
处理透明物体渲染
        透明度是一个值得深入研究的问题,当涉及到开发时暴雪的董事会认为延迟渲染技术不支持透明度的话就应该在其他地方加上这个功能,而事实证明这是一个正确的选择。
        作为是典型的就是延迟绘制技术,透明度的问题还设计到树荫等一系列问题,因此必须选择一些有代表性的物体来标记之后再做探讨。光线的问题在透明度的谈论中再一次被提及,因为这是个相辅相成的东西,因此暴雪在制作这一切的时候都努力的寻找解决方案。
半透明阴影(Translucent Shadows)
        这种技术能令烟雾、爆炸也能投射出阴影效果。

        早期在建模的时候影子系统都是成功地利用屏幕空间信息解决跟踪问题,否则将会困难很多,但这次暴雪将显示如何延长阴影地图的每像素信息与一些额外的信息通道,可以用来容易的充实阴影,地图上实现半透明的阴影支持。
        阴影地图算法是延长与第二地图的阴影信息形成半透明的阴影,大部分地图的影子仍然会包含不透明信息的阴影,此外还需要做到在颜色的缓冲区发现颜色半透明的阴影。不过,这一切都需要硬件的支持,如果硬件不支持将会有一个空的颜色,因此在考虑到深景等特效的时候暴雪依然在处理阴影效果。
        首先是清理,以白色调和,然后填补渲染透明物体的阴影,就这样形成一个透明的阴影色彩缓冲区,再加上测试,处理这些透明光过滤器,最后形成需要的效果。
光过滤处理器

总结:
        从上面简短的一份官方技术文档(因为AMD只放出这一部分),我们已经可以了解到暴雪在SC2这个游戏上所付出的努力和贡献了,其效果之华丽恐怕也是惊人的。作为暴雪十多年磨一剑的大作,《星际争霸II》可是包含了现在最尖端的技术和效果,无论是暴雪的质量还是技术相信都是世界顶级的水平,这样的游戏公司确实在为自己的的作品留芳百世而努力!不过,至于还要等多久,至今仍是一个谜。

posted @ 2008-09-02 17:25 Condor 阅读(3204) | 评论 (8)编辑 收藏

---INLINE HOOK实现NDIS HOOK
前面讲述了如何通过获取NDIS_PROTOCOL_BLOCK来实现NDIS HOOK,这里讲述第二种方法,那就是inline hook方法。说起inline hook,也不是什么新鲜玩意,无非是在一个函数的首部嵌入一个jmp机器指令,在该函数执行有效代码前就跳到我们的代理函数,在我们的代理函数里做了必要的处理以后,再跳回原来的函数,接着执行原函数的指令。
既然tcpip.sys是标准的NDIS协议驱动,那么收包函数显然应该是在tcpip.sys内部实现的,我们直接找到这两个收包函数,然后对其inline hook不就可以了吗?经过逆向分析,我找到了这两个函数,本人安装了两个XP系统,其中一个导出了这两个函数,另一个系统却没导出,所以我们仍然需要用特征码搜索这两个函数,这两个函数声明如下:
NDIS_STATUS
ARPRcv (NDIS_HANDLE BindContext,
NDIS_HANDLE MacContext,
UCHAR* HeadBuffer,
ULONG HeadSize,
UCHAR* Buffer,
ULONG BufferSize,
ULONG PacketSize);
INT
ARPRcvPacket (NDIS_HANDLE BindContext,
PNDIS_PACKET Packet);
搜索这两个函数地址的代码如下:
//以下全局变量保存两个函数的地址
void* ARPRcv=NULL;
void* ARPRcvPacket=NULL;
void SearchProtocolRoutine()
{
//以下分别为两个收包函数的特征码
UCHAR ARPRcvBytes[] ={0x8b,0xff,0x55,0x8b,0xec,0x56,0x8b,0x75,0x08,0x33};
UCHAR ARPRcvPacketBytes[]={0x8b,0xff,0x55,0x8b,0xec,0x51,0x53,0x56,0x57,0x8b};
//获取tcpip.sys模块的基地址,该函数在前一节已经提供给大家
char* base=FindModule("tcpip.sys");
while(ARPRcv==NULL||ARPRcvPacket==NULL)
{
if(ARPRcv==NULL&&
RtlCompareMemory(ARPRcvBytes,base,10)==10)
{
ARPRcv=base;
}
else if(ARPRcvPacket==NULL&&
RtlCompareMemory(ARPRcvPacketBytes,base,10)==10)
{
ARPRcvPacket=base;
}
base++;
}
}
各种编译器所编译的函数,前几个指令都是几乎一样的,用来建立堆栈帧,这些指令叫函数的序言。
在win2000上是三字节
push ebp
mov ebp, esp
到了winxp以及后续系统上,则变成了五字节
mov edi, edi
push ebp
mov ebp, esp
而一个近跳转指令刚好是五字节,在xp上刚好覆盖了函数的序言,所以在XP上挂钩也相对容易一点,这里着重说明如何对ARPRcv进行挂钩,我们在ARPRcv内部插入一个jmp指令,将跳到ARPRcvProx函数,该函数是个裸函数,函数实现如下:
_declspec(naked) ARPRcvProx()//跳板函数
{
_asm
{
mov edi, edi
push ebp
mov ebp ,esp
//七个参数开始压栈
push [ebp+20h]
push [ebp+1ch]
push [ebp+18h]
push [ebp+14h]
push [ebp+10h]
push [ebp+0ch]
push [ebp+8]
call NewARPRcv //调用NewARPRcv函数
cmp eax,0x10003 //判断函数返回值是否NDIS_STATUS_NOT_ACCEPTED
jz end //如果是NDIS_STATUS_NOT_ACCEPTED,直接结束本函数
//而不跳回到ARPRcv函数
mov eax,ARPRcv //如果返回的不是NDIS_STATUS_NOT_ACCEPTED,将会
//执行到这条指令,该指令将 ARPRcv函数的地址装入eax
add eax,5 //将ARPRcv地址值加上5,存入eax,表示即将跳转的//地址
jmp eax //开始跳回ARPRcv体内
end:
pop ebp
retn 1ch
}
}
在该函数内部,又调用了NewARPRcv函数,原型和ARPRcv保持一致,也必须由我们自己实现:
NDIS_STATUS
NewARPRcv(
IN NDIS_HANDLE ProtocolBindingContext,
IN NDIS_HANDLE MacReceiveContext,
IN PVOID HeaderBuffer,
IN UINT HeaderBufferSize,
IN PVOID LookAheadBuffer,
IN UINT LookaheadBufferSize,
IN UINT PacketSize
)
{
/*
在这里加入你的判断逻辑代码,是否拦截该数据
如果要拦截,则返回 NDIS_STATUS_NOT_ACCEPTED
否则返回NDIS_STATUS_SUCCESS,把数据交给ARPRcv处理
*/
return NDIS_STATUS_SUCCESS;
}
同样的原理,我们在ARPRcvPacket里面插入jmp指令,将跳转到ARPRcvPacketProx裸函数,该函数实现如下:
_declspec(naked) ARPRcvPacketProx()
{
_asm
{
mov edi, edi
push ebp
mov ebp ,esp
//两个参数开始压栈
push [ebp+0ch]
push [ebp+8]
call NewARPRcvPacket//调用NewARPRcvPacket
cmp eax,0 //如果返回0则表示拒绝该数据包
jz end //直接返回本函数
mov eax ,ARPRcvPacket
add eax ,5
jmp eax //跳回ARPRcvPacket函数第六个字节
end: pop ebp
retn 8
}
}
在该函数内部,将会调用NewARPRcvPacket,函数实现如下:
INT
NewARPRcvPacket(NDIS_HANDLE BindContext,
PNDIS_PACKET ndisPacket)
{
/*
在这里加入你的判断逻辑,是否拦截该数据,如果要拦截,则返回0,
否则返回非0
*/
DbgPrint("RcvPacket");
return 1;
}
请仔细阅读以上代码的注释,接下来,我们还必须提供一个函数实现安装和卸载挂钩功能
void PatchARPRcv(BOOLEAN isPatch)//isPatch为TRUE表示安装挂钩,为FALSE表示卸载挂钩。
{
/*即将用以下五个字节覆盖ARPRcv函数前五个字节
这5个字节就是jmp XXXX指令的机器码,因为跳转的相对地址还需要
进一步计算,所以暂时用零填充
*/
UCHAR patchBytes[5]={0xe9,0x00,0x00,0x00,0x00};
//即将用以下五个字节覆盖ARPRcvPacket函数前五个字节
UCHAR patchBytes2[5]={0xe9,0x00,0x00,0x00,0x00};
//保存原始函数的前五个字节,方便以后恢复挂钩
UCHAR restoreBytes[5]={0x8b,0xff,0x55,0x8b,0xec};
/*
以下两行代码计算跳转的偏移量
*/
int offset=(char*)ARPRcvProx-(char*)ARPRcv-5;
int offset2=(char*)ARPRcvPacketProx-(char*)ARPRcvPacket-5;
//修正patchBytes和patchBytes2中的相对地址
memcpy(patchBytes+1,&offset,4);
memcpy(patchBytes2+1,&offset2,4);
if(isPatch)
{
DisableWriteProtect();//禁止写保护
memcpy(ARPRcv,patchBytes,5);
memcpy(ARPRcvPacket,patchBytes2,5);
EnableWriteProtect(); //开启写保护
}
else
{
DisableWriteProtect();
memcpy(ARPRcv,restoreBytes,5);
memcpy(ARPRcvPacket,restoreBytes,5);
EnableWriteProtect();
}
}
因为ARPRcv和ARPRcvPacket函数处于只读页,所以必须先禁用写保护才能向其中插入代码,禁用写保护和开启写保护代码如下:
void
DisableWriteProtect()
{
_asm{
cli
mov eax, cr0
and eax, 0FFFEFFFFh
mov cr0, eax
}
}
void
EnableWriteProtect()
{
_asm{
mov eax, cr0
or eax, not 0FFFEFFFFh
mov cr0, eax
sti
}
}
注意这些代码暂时只适用XP系统,在win2000和win2003上都需要少许改动。

posted @ 2008-08-30 23:43 Condor 阅读(1778) | 评论 (0)编辑 收藏

NDIS HOOK是专业级防火墙使用的一种拦截技术,NDIS HOOK的重点是如何获得特定协议对应NDIS_PROTOCOL_BLOCK指针,获得了该指针,接下来就可以替换该协议所注册的收发函数,而达到拦截网络数据的目的。
     获 得NDIS_PROTOCOL_BLOCK指针的方法一般是用NdisRegisterProtocol注册一个新的协议,所获得的协议句柄实际上就是一 个NDIS_PROTOCOL_BLOCK指针,顺着该指针遍历NDIS_PROTOCOL_BLOCK链表,就可以找到你所要挂钩的协议所对应的 NDIS_PROTOCOL_BLOCK.之所以可以这样做,是因为每注册一个协议,系统都会把该协议对应的NDIS_PROTOCOL_BLOCK放置 在协议链表的开头,该协议链表每个元素都是NDIS_PROTOCOL_BLOCK类型,代表一个已经注册的协议。
     事 实上我们需要的只是TCPIP协议族的NDIS_PROTOCOL_BLOCK指针,毕竟TCP,IP,ARP,ICMP等等几乎所有我们感兴趣的协议, 都是在tcpip.sys协议驱动里面实现的。如果我们只需要TCPIP协议所对应的NDIS_PROTOCOL_BLOCK,那么上面的方法就有点繁琐 了。我们可以试着寻找更简便的方法来获得TCPIP协议的NDIS_PROTOCOL_BLOCK.
于 是我对tcpip.sys驱动进行了反汇编,发现NDIS_PROTOCOL_BLOCK指针存放在一个名为_ARPHandle的全局变量里面,所以如 果能找到_ARPHandle的地址,我们就成功了,我们完全可以把该全局变量的偏移量作为一个常量来使用,但这里纯粹为了拓宽思路,我介绍另一种找到该 全局变量的方法。
     Tcpip.sys有个导出函数叫IPDelayedNdisReEnumerateBindings,该函数内部曾经出现过_ARPHandle 的地址,为什么会出现它的地址呢,因为该函数内部调用过NdisReEnumerateProtocolBindings函数,懂得反汇编的应该知道,在 用call指令调用函数之前,必然会用到push指令将函数的参数压到栈里面去,不巧的是, NdisReEnumerateProtocolBindings函数只有一个参数,而该参数恰恰是一个NDIS_PROTOCOL_BLOCK指针类 型,在这里,实际上就是把_ARPHandle当作参数传给了
NdisReEnumerateProtocolBindings,所以_ARPHandle的地址必然会出现在push指令的后面,说具体一点,紧跟push指令的四个字节就是_ARPHandle的地址。
      所以具体的思路就是这样,先找到IPDelayedNdisReEnumerateBindings函数的地址,然后从该函数的地址开始搜索push指令的特征码,搜到了以后,把紧跟push指令的四个字节作为指向NDIS_PROTOCOL_BLOCK指针的指针返回。
     也许有的人会问,如果IPDelayedNdisReEnumerateBindings函数体内部出现过多次push指令,岂不是会搜出不正确的地址,事实上,虽然都叫push指令,然而在机器码级别是不同的,push指令的机器码表示有十几种之多,用来区别不同的寻址方式,调用NdisReEnumerateProtocolBindings 时用的push指令字节序列是0xff35,这个push指令表示后面紧跟的四个字节是一个内存地址,而不是一个立即数或者寄存器之类的。知道了这些,我 们就可以清楚,在一个有限的地址范围,0xff35的唯一性是可以得到满足的。根据我的观察,在win2000,winxp,win2003上面,IPDelayedNdisReEnumerateBindings本身是一个很短的函数,0xff35指令确实只出现过一次,所以该方法是很可靠的。
思路已经出来了,下面我把详细的代码给大家贴出来,理解这些代码需要对windows Pe格式有所了解,如果你不想理解也行,代码可以直接拿来用。
       以下是我写的一个 获取内核模块某个导出函数地址的 通用例程。这里主要是为了获取tcpip.sys模块的导出函数IPDelayedNdisReEnumerateBindings
   void* GetRoutineAddress(char* ModuleName,char* RoutineName)
{
       PIMAGE_DOS_HEADER dos_hdr;
    PIMAGE_NT_HEADERS nt_hdr;
    PIMAGE_EXPORT_DIRECTORY export_dir;
    ULONG *fn_name, *fn_addr, i;
      char* base;
      base=(char*)FindModule(ModuleName);//该函数用来获得内核模块的基地址
    if(!base)
        return NULL;
    DbgPrint("tcpip address:%p",base);
    dos_hdr = (PIMAGE_DOS_HEADER)base;
    if (dos_hdr->e_magic != IMAGE_DOS_SIGNATURE)
        return NULL;
    nt_hdr = (PIMAGE_NT_HEADERS)(base + dos_hdr->e_lfanew);
    export_dir = (PIMAGE_EXPORT_DIRECTORY)(base + nt_hdr->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT].VirtualAddress);
    fn_name = (ULONG *)(base + export_dir->AddressOfNames);
    fn_addr = (ULONG *)(base + export_dir->AddressOfFunctions);
    for (i = 0; i < export_dir->NumberOfNames; i++, fn_name++, fn_addr++)
    {
        if (strcmp(RoutineName, base + *fn_name) == 0)
        {
            return base + *fn_addr;
        }
    }
    return NULL;
}
以下是FindModule函数的实现:
void *
FindModule(char *name)
{
    ULONG i, n, *q;
    PSYSTEM_MODULE_INFORMATION p;
    void *base;
    ZwQuerySystemInformation(SystemModuleInformation, &n, 0, &n);
    q = (ULONG *)ExAllocatePool(PagedPool, n);
    ZwQuerySystemInformation(SystemModuleInformation, q, n * sizeof (*q), 0);
    p = (PSYSTEM_MODULE_INFORMATION)(q + 1);
    base = NULL;
    for (i = 0; i < *q; i++) {
        if (_stricmp(p.ImageName + p.ModuleNameOffset, name) == 0) {
            base = p.Base;
            break;
        }
    }
    ExFreePool(q);
    return base;
}
以下是获取tcpip协议的NDIS_PROTOCOL_BLOCK指针的函数
   void* GetProtocolBlock()
{
    char* base;
    char bytes[]={0xff,0x35};
    base=GetRoutineAddress("tcpip.sys","IPDelayedNdisReEnumerateBindings");
     while(RtlCompareMemory(base,bytes,2)!=2)
    {
       base++;
    }
    return **((void***)(base+2));
}

posted @ 2008-08-30 23:42 Condor 阅读(1578) | 评论 (0)编辑 收藏

作者:小马丁·路德·金
  今天,我高兴地同大家一起,参加这次将成为我国历史上为了争取自由而举行的最伟大的示威集会。
  100年前,一位伟大的美国人——今天我们就站在他象征性的身影下——签署了《解放宣言》。这项重要法令的颁布,对于千百万灼烤于非正义残焰中的黑奴,犹如带来希望之光的硕大灯塔,恰似结束漫漫长夜禁锢的欢畅黎明。
  然而,100年后,黑人依然没有获得自由。100年后,黑人依然悲惨地蹒跚于种族隔离和种族歧视的枷锁之下。100年后,黑人依然生活在物质繁荣翰海的贫困孤岛上。100年后,黑人依然在美国社会中间向隅而泣,依然感到自己在国土家园中流离漂泊。所以,我们今天来到这里,要把这骇人听闻的情况公诸于众。
  从某种意义上说,我们来到国家的首都是为了兑现一张支票。我们共和国的缔造者在拟写宪法和独立宣言的辉煌篇章时,就签署了一张每一个美国人都能继承的期票。这张期票向所有人承诺——不论白人还是黑人——都享有不可让渡的生存权、自由权和追求幸福权。
  然而,今天美国显然对她的有色公民拖欠着这张期票。美国没有承兑这笔神圣的债务,而是开始给黑人一张空头支票——一张盖着“资金不足”的印戳被退回的支票。但是,我们决不相信正义的银行会破产。我们决不相信这个国家巨大的机会宝库会资金不足。
  因此,我们来兑现这张支票。这张支票将给我们以宝贵的自由和正义的保障。
  我们来到这块圣地还为了提醒美国:现在正是万分紧急的时刻。现在不是从容不迫悠然行事或服用渐进主义镇静剂的时候。现在是实现民主诺言的时候。现在是走出幽暗荒凉的种族隔离深谷,踏上种族平等的阳关大道的时候。现在是使我们国家走出种族不平等的流沙,踏上充满手足之情的磐石的时候。现在是使上帝所有孩子真正享有公正的时候。
  忽视这一时刻的紧迫性,对于国家将会是致命的。自由平等的朗朗秋日不到来,黑人顺情合理哀怨的酷暑就不会过去。1963年不是一个结束,而是一个开端。
  如果国家依然我行我素,那些希望黑人只需出出气就会心满意足的人将大失所望。在黑人得到公民权之前,美国既不会安宁,也不会平静。反抗的旋风将继续震撼我们国家的基石,直至光辉灿烂的正义之日来临。
  但是,对于站在通向正义之宫艰险门槛上的人们,有一些话我必须要说。在我们争取合法地位的过程中,切不要错误行事导致犯罪。我们切不要吞饮仇恨辛酸的苦酒,来解除对于自由的饮渴。
  我们应该永远得体地、纪律严明地进行斗争。我们不能容许我们富有创造性的抗议沦为暴力行动。我们应该不断升华到用灵魂力量对付肉体力量的崇高境界。
  席卷黑人社会的新的奇迹般的战斗精神,不应导致我们对所有白人的不信任——因为许多白人兄弟已经认识到:他们的命运同我们的命运紧密相连,他们的自由同我们的自由休戚相关。他们今天来到这里参加集会就是明证。
  我们不能单独行动。当我们行动时,我们必须保证勇往直前。我们不能后退。有人问热心民权运动的人:“你们什么时候会感到满意?”只要黑人依然是不堪形容的警察暴行恐怖的牺牲品,我们就决不会满意。只要我们在旅途劳顿后,却被公路旁汽车游客旅社和城市旅馆拒之门外,我们就决不会满意。只要黑人的基本活动范围只限于从狭小的黑人居住区到较大的黑人居住区,我们就决不会满意。只要我们的孩子被“仅供白人”的牌子剥夺个性,损毁尊严,我们就决不会满意。只要密西西比州的黑人不能参加选举,纽约州的黑人认为他们与选举毫不相干,我们就决不会满意。不,不,我们不会满意,直至公正似水奔流,正义如泉喷涌。
  我并非没有注意到你们有些人历尽艰难困苦来到这里。你们有些人刚刚走出狭小的牢房。有些人来自因追求自由而遭受迫害风暴袭击和警察暴虐狂飙摧残的地区。你们饱经风霜,历尽苦难。继续努力吧,要相信:无辜受苦终得拯救。
  回到密西西比去吧;回到亚拉巴马去吧;回到南卡罗来纳去吧;回到佐治亚去吧;回到路易斯安那去吧;回到我们北方城市中的贫民窟和黑人居住区去吧。要知道,这种情况能够而且将会改变。我们切不要在绝望的深渊里沉沦。
  朋友们,今天我要对你们说,尽管眼下困难重重,但我依然怀有一个梦。这个梦深深植根于美国梦之中。
  我梦想有一天,这个国家将会奋起,实现其立国信条的真谛:“我们认为这些真理不言而喻:人人生而平等。”
  我梦想有一天,在佐治亚州的红色山岗上,昔日奴隶的儿子能够同昔日奴隶主的儿子同席而坐,亲如手足。
  我梦想有一天,甚至连密西西比州——一个非正义和压迫的热浪逼人的荒漠之州,也会改造成为自由和公正的青青绿洲。
  我梦想有一天,我的四个小女儿将生活在一个不是以皮肤的颜色,而是以品格的优劣作为评判标准的国家里。
  我今天怀有一个梦。
  我梦想有一天,亚拉巴马州会有所改变——尽管该州州长现在仍滔滔不绝地说什么要对联邦法令提出异议和拒绝执行——在那里,黑人儿童能够和白人儿童兄弟姐妹般地携手并行。
  我今天怀有一个梦。
  我梦想有一天,深谷弥合,高山夷平,歧路化坦途,曲径成通衢,上帝的光华再现,普天下生灵共谒。
  这是我们的希望。这是我将带回南方去的信念。有了这个信念,我们就能从绝望之山开采出希望之石。有了这个信念,我们就能把这个国家的嘈杂刺耳的争吵声,变为充满手足之情的悦耳交响曲。有了这个信念,我们就能一同工作,一同祈祷,一同斗争,一同入狱,一同维护自由,因为我们知道,我们终有一天会获得自由。
  到了这一天,上帝的所有孩子都能以新的含义高唱这首歌:
  我的祖国,可爱的自由之邦,我为您歌唱。这是我祖先终老的地方,这是早期移民自豪的地方,让自由之声,响彻每一座山岗。
  如果美国要成为伟大的国家,这一点必须实现。因此,让自由之声响彻新罕布什尔州的巍峨高峰!
  让自由之声响彻纽约州的崇山峻岭!
  让自由之声响彻宾夕法尼亚州的阿勒格尼高峰!
  让自由之声响彻科罗拉多州冰雪皑皑的洛基山!
  让自由之声响彻加利福尼亚州的婀娜群峰!
  不,不仅如此;让自由之声响彻佐治亚州的石山!
  让自由之声响彻田纳西州的望山!
  让自由之声响彻密西西比州的一座座山峰,一个个土丘!
  让自由之声响彻每一个山岗!
  当我们让自由之声轰响,当我们让自由之声响彻每一个大村小庄,每一个州府城镇,我们就能加速这一天的到来。那时,上帝的所有孩子,黑人和白人,犹太教徒和非犹太教徒,耶稣教徒和天主教徒,将能携手同唱那首古老的黑人灵歌:“终于自由了!终于自由了!感谢全能的上帝,我们终于自由了!”
  □□
  马丁·路德·金(公元1929—1968年),美国黑人律师,著名黑人民权运动领袖。一生曾三次被捕,三次被行刺,1964年获诺贝尔和平奖。1968年被种族主义分子枪杀。他被誉为近百年来八大最具有说服力的演说家之一。1963年他领导25万人向华盛顿进军“大游行”,为黑人争取自由平等和就业。马丁·路德·金在游行集会上发表了这篇著名演说。
  (bob录自中国文史出版社《世纪档案》)----------------------------
  附:英文原文----------------------------i have a dreamby martin luther king, jr.delivered on the steps at the lincoln memorial in washingtond.c. on august 28, 1963five score years ago, a great american, in whose symbolic shadowwe stand signed the emancipation proclamation. this momentousdecree came as a great beacon light of hope to millions of negroslaves who had been seared in the flames of withering injustice.it came as a joyous daybreak to end the long night ofcaptivity.but one hundred years later, we must face the tragic fact thatthe negro is still not free. one hundred years later, the lifeof the negro is still sadly crippled by the manacles ofsegregation and the chains of discrimination. one hundred yearslater, the negro lives on a lonely island of poverty in themidst of a vast ocean of material prosperity. one hundred yearslater, the negro is still languishing in the corners of americansociety and finds himself an exile in his own land. so we havecome here today to dramatize an appalling condition.in a sense we have come to our nation's capital to cash a check.when the architects of our republic wrote the magnificent wordsof the constitution and the declaration of independence, theywere signing a promissory note to which every american was tofall heir. this note was a promise that all men would beguarranteed the inalienable rights of life, liberty, and thepursuit of happiness.it is obvious today that america has defaulted on thispromissory note insofar as her citizens of color are concerned.instead of honoring this sacred obligation, america has giventhe negro people a bad check which has come back markedinsufficient funds.justice is bankrupt. we refuse to believe that there areinsufficient funds in the great vaults of opportunity of thisnation. so we have come to cash this check -- a check that willgive us upon demand the riches of freedom and the security ofjustice. we have also come to this hallowed spot to remindamerica of the fierce urgency of now. this is no time to engagein the luxury of cooling off or to take the tranquilizing drugof gradualism. now is the time to rise from the dark anddesolate valley of segregation to the sunlit path of racialjustice. now is the time to open the doors of opportunity to allof god's children. now is the time to lift our nation from thequicksands of racial injustice to the solid rock ofbrotherhood.it would be fatal for the nation to overlook the urgency of themoment and to underestimate the determination of the negro. thissweltering summer of the negro's legitimate discontent will notpass until there is an invigorating autumn of freedom andequality. nineteen sixty-three is not an end, but a beginning.those who hope that the negro needed to blow off steam and willnow be content will have a rude awakening if the nation returnsto business as usual. there will be neither rest nor tranquilityin america until the negro is granted his citizenship rights.the whirlwinds of revolt will continue to shake the foundationsof our nation until the bright day of justice emerges.but there is something that i must say to my people who stand onthe warm threshold which leads into the palace of justice. inthe process of gaining our rightful place we must not be guiltyof wrongful deeds. let us not seek to satisfy our thirst forfreedom by drinking from the cup of bitterness and hatred.we must forever conduct our struggle on the high plane ofdignity and discipline. we must not allow our creative protestto degenerate into physical violence. again and again we mustrise to the majestic heights of meeting physical force with soulforce. the marvelous new militancy which has engulfed the negrocommunity must not lead us to distrust of all white people, formany of our white brothers, as evidenced by their presence heretoday, have come to realize that their destiny is tied up withour destiny and their freedom is inextricably bound to ourfreedom. we cannot walk alone.and as we walk, we must make the pledge that we shall marchahead. we cannot turn back. there are those who are asking thedevotees of civil rights, "when will you be satisfied?" we cannever be satisfied as long as our bodies, heavy with the fatigueof travel, cannot gain lodging in the motels of the highways andthe hotels of the cities. we cannot be satisfied as long as thenegro's basic mobility is from a smaller ghetto to a larger one.we can never be satisfied as long as a negro in mississippicannot vote and a negro in new york believes he has nothing forwhich to vote. no, no, we are not satisfied, and we will not besatisfied until justice rolls down like waters and righteousnesslike a mighty stream.i am not unmindful that some of you have come here out of greattrials and tribulations. some of you have come fresh from narrowcells. some of you have come from areas where your quest forfreedom left you battered by the storms of persecution andstaggered by the winds of police brutality. you have been theveterans of creative suffering. continue to work with the faiththat unearned suffering is redemptive.go back to mississippi, go back to alabama, go back to georgia,go back to louisiana, go back to the slums and ghettos of ournorthern cities, knowing that somehow this situation can andwill be changed. let us not wallow in the valley of despair.i say to you today, my friends, that in spite of thedifficulties and frustrations of the moment, i still have adream. it is a dream deeply rooted in the american dream.i have a dream that one day this nation will rise up and liveout the true meaning of its creed: "we hold these truths to beself-evident: that all men are created equal."i have a dream that one day on the red hills of georgia the sonsof former slaves and the sons of former slaveowners will be ableto sit down together at a table of brotherhood.i have a dream that one day even the state of mississippi, adesert state, sweltering with the heat of injustice andoppression, will be transformed into an oasis of freedom andjustice.i have a dream that my four children will one day live in anation where they will not be judged by the color of their skinbut by the content of their character.i have a dream today.i have a dream that one day the state of alabama, whosegovernor's lips are presently dripping with the words ofinterposition and nullification, will be transformed into asituation where little black boys and black girls will be ableto join hands with little white boys and white girls and walktogether as sisters and brothers.i have a dream today.i have a dream that one day every valley shall be exalted, everyhill and mountain shall be made low, the rough places will bemade plain, and the crooked places will be made straight, andthe glory of the lord shall be revealed, and all flesh shall seeit together.this is our hope. this is the faith with which i return to thesouth. with this faith we will be able to hew out of themountain of despair a stone of hope. with this faith we will beable to transform the jangling discords of our nation into abeautiful symphony of brotherhood. with this faith we will beable to work together, to pray together, to struggle together,to go to jail together, to stand up for freedom together,knowing that we will be free one day.this will be the day when all of god's children will be able tosing with a new meaning, "my country, 'tis of thee, sweet landof liberty, of thee i sing. land where my fathers died, land ofthe pilgrim's pride, from every mountainside, let freedom ring."and if america is to be a great nation this must become true. solet freedom ring from the prodigious hilltops of new hampshire.let freedom ring from the mighty mountains of new york. letfreedom ring from the heightening alleghenies of pennsylvania!let freedom ring from the snowcapped rockies of colorado!let freedom ring from the curvaceous peaks of california!but not only that; let freedom ring from stone mountain ofgeorgia!let freedom ring from lookout mountain of tennessee!let freedom ring from every hill and every molehill ofmississippi. from every mountainside, let freedom ring.when we let freedom ring, whem we let it ring from every villageand every hamlet, from every state and every city, we will beable to speed up that day when all of god's children, black menand white men, jews and gentiles, protestants and catholics,will be able to join hands and sing in the words of the oldnegro spiritual, "free at last! free at last! thank godalmighty, we are free at last!"

posted @ 2008-08-29 10:19 Condor 阅读(338) | 评论 (0)编辑 收藏

 

I'm not sure what it is, but there continues to be some sort of "competition" for "who can find the biggest bug" -- as if attackers had to choose, and more importantly, as if any bug was so big that it could not be made even better by combined use with its "competition".  Before my DNS talk, my old friend FX from Recurity Labs was comparing DNS issues to the Debian Non-Random Number Generator issue that caused all sorts of SSL certificates to offer no security value, and the SNMPv3 flaws that allowed infrastructure devices to be remotely administered by people who happened not to know the password.

Of course, after the talk, it became clear that the DNS hack and the Debian NRNG combined rather destructively -- DNS allowed you to finally play MITM with all the SSL private keys you could trivially compute, and as Ben Laurie found, this included the keys for Sun's OpenID authentication provider.  And, since the DNS hack turns Java back into a universal UDP and TCP gateway, we end up being able to log into SNMPv3 devices that would otherwise be protected behind firewalls.

So there's no sense making a competition out of it.  There's just an ever growing toolchest, growing from a single emerging theme:

Weaknesses in authentication and encryption, some which have been known to at least some degree for quite some time and many of which are sourced in the core design of the system, continue to pose a threat to the Internet infrastructure at large, both by corrupting routing, and making those corrupted routes problematic.

Back in July, the genuinely brilliant Halvar Flake posted the following regarding the entire DNS issue:

"I fail to understand the seriousness with which this bug is handled though. Anybody who uses the Internet has to assume that his gateway is owned."

And thus, why 75% of my Black Hat talk was on the real-world effectiveness of Man-In-The-Middle attacks: Most people aren't as smart as Halvar.  I'm certainly not :)  Almost nobody assumes that their gateway is owned -- and even those that do, and try to engineer around it, deploy ineffective protections that are only "secure unless there's an attacker".

I say this is a theme, because it is the unifying element between some of the year's most high profile flaws.  There are two subclasses -- some involve weak authentication migrating traffic from one location to another, while others involve weak authentication allowing an attacker to read or modify traffic migrated to him -- but you'd have to have some pretty serious blinders to not see the unifying theme of weak authentication leads to pwnage.

Consider:

Luciano Bello's Debian NRNG: This involves a core design requiring the generation of random numbers, but the random number generator required a random seed, but alas, the seed was made insufficiently random.  It's an implementation flaw, but barely -- and the effect was catastrophic failure against members of the X.509 PKI authentication system that had used the Debian NRNG, and thus by extension SSL's encryption logic and OpenID (for Sun's) authentication gateway.

Wes Hardakar's SNMPv3 Bug: Here, we have an authentication protocol that allows an attacker to declare how many bytes he wants to have to correctly provide.  Now, the attacker can claim "just 1 please" -- and he gets into any router suffering this bug within seconds.  That, by extension, allows control over all traffic traversing that router.

Mike Zusman's Insecure SSL-VPN's: SSL is supposed to protect us, but there's no sense creating a secure session to someone if you don't actually know who they are.  Don't worry though, by design anything that isn't a web browser is terrifyingly likely to only to skip authentication entirely and just create an encrypted link to whoever's responding.  One would think that SSL-VPN's, whose sole purpose is to prevent attackers from accessing network traffic, would be immune.  But with 42% of certificates on the Internet being self-signed, and a lot of them being for SSL-VPN's, one would be wrong.  By extension this auth failure exposes all traffic routed over these SSL-VPN's.

Mike Perry's Insecure Cookies: This gets interesting.  Here we have two different authentication protocols in place -- one, from server to client, based on X.509.  The other, from client to server, based on a plaintext password (delivered, at least, over an encrypted session authenticated by the server-to-client cert).  But to prevent the user from needing to repeatedly type in their plaintext password, a password-equivalent token (or cookie) is handed to the user's browser, which will be attached to every request within the securely encrypted channel.  Unfortunately, it'll also be attached to every request which does not traverse the securely encrypted channel, because the cookies aren't marked for secure-only.  Once the cookie leaks, of course, it'll authenticate a bad guy who creates an encrypted session to that server.  So by extension bad guys get to play in any number of interesting sites.

My DNS flaw: Here we have a protocol that directly controls routing decisions, ultimately designed to authenticate its messages via a random number between 0 and 65535.  Guess the number, and change routing.  This was supposed to be OK, because you could only guess a certain number of times per day.  There was even an RFC entirely based around this time limit.  It turns out there's a good dozen ways around that limit, allowing anonymous and even almost 100% packet spoofed compromise of routing decisions.  This, by extension, allowed exploitation of all traffic that was weakly authenticating.

It's the same story, again and again.  And now, everyone talking about BGP.  So lets do the same sort of analysis on BGP:

Kapela and Pilosov's BGP flaw: In BGP, only the nearest neighbor is authenticated.  The concept is that all "members of the club" authenticate all other members, while the actual data they provide and distribute is trusted.  If it's not actually trusted, anyone can hijack traffic from anyone else's routes.

Pilosov's done some cool work here.  It's not the sort of devastating surprise some people seem to want it to be.  Indeed, that's what makes it so interesting.  BGP was actually supposed to be broken, in this precise manner. Literally, in every day use, any BGP administrator has always had the ability to hijack anyone else's traffic.  Pilosov has a new, even beautiful MITM attack, but as mine was not the first DNS attack, his is not the first BGP MITM.  Tales of using BGP to force traffic through a compromised router (possibly compromised through SNMPv3) are legion, and Javascript and the browser DOM blur things pretty fiercely in terms of the relevance of being able to pass through to the legitimate endpoint anyway.

That's not to take away from the work.  It's an interesting trick.  But we need to level set here:

First, if you're not part of the BGP club, you're just not running this attack.  Pakistan took out YouTube with BGP -- but some random kid with the ability to spoof IP packets couldn't.  In other words, we're just not going to see a Metasploit module anyone can run to complete these sorts of attacks.  Now, there are some entertaining combinatorics that could be played -- DNS to enable Java's SNMPv3 access to internal routers at an ISP, and then from that internal router running the sort of BGP tricks Pilosov's talking about.  This goes back to the utter folly of trying to rank these bugs independently from one another.  But these sort of combinatorics are at a fundamentally different level than the fire-and-forget antics that DNS allowed, and on a fundamental level, the number of potential attackers (and the number of involved defenders) on BGP is a lot lower.

Second, we have far better logging -- and thus accountability -- in the BGP realm than we do perhaps for any other protocol on the Internet.  Consider the archives at APNIC -- yes, that's route history going back to 1999 -- and Renesys has even more.  That sort of forensic data is unimaginable for anything else, least of all DNS.  BGP may have its fair share of bad actors -- consider spammers who advertise temporary ranges in unused space for mail delivery purposes, thus getting around blackholes -- but any of the really nasty stuff leaves a paper trail unmatched by any other attack.

Third, BGP is something of a sledgehammer.  Yes, you're grabbing traffic -- but your control over exactly what traffic you grab is fairly limited.  Contrast that with DNS, which allows astonishingly fine grained targeting over exactly what you grab -- indeed, you don't even need to know in advance what traffic you want.  The victim network will simply offer you interesting names, and you get to choose on the fly which ones you'll take.  These names may even be internal names, offering the impossible-with-BGP attack of hijacking traffic between two hosts on the exact same network segment.

Finally, BGP suffers some limitations in visibility.  Simply grabbing traffic is nice, but bidirectional flows are better than unidirectional flows, and when you pull something off via DNS, you're pretty much guaranteed to grab all the traffic from that TCP session even if you stop any further poisoning attempts.  Contrast that with BGP, which operates at Layer 3 and thus may cause the IP packets to reroute at any point when the TCP socket is still active.

So, does that mean its always better to attack DNS than BGP?  Oh, you competitive people would like things to be so simple, wouldn't you :)Pilosov and I talked for about a half hour at Defcon, and I've got nothing but respect for his work.  Lets look at the other side of things for a moment.   First, BGP controls how you route to your name server -- if not your recursive server, which may be inside your organization and thus immune to ext

posted @ 2008-08-29 10:17 Condor 阅读(6438) | 评论 (2)编辑 收藏

钥匙,
被遗忘在19楼;
慢慢的消沉,
有限的生命.
80楼的门,
还要多久才能开启.
太多的幻像,
被遗忘的钥匙;
还在爬的楼梯,
什么时间可以拾起,
那被遗忘的钥匙.
重正,
那昔日的雄风;
蔚蓝的天空,
在等待着我们.

posted @ 2008-08-24 23:02 Condor 阅读(351) | 评论 (0)编辑 收藏

李国栋床上堆着书,每天晚上睡在榻榻米上,读书读到凌晨一两点,读到两眼充血,像针扎一样痛苦,才把书放开。蜷缩到榻榻米上,用绳子把左腿跟一只桌脚绑在一起,熄了灯睡觉。
    “这样一来,我一翻身,扯不动腿,就会醒过来。醒过来就马上爬起来继续看书——今年是第三年了,再考不上,就要当兵去了!”
    高考前,李国栋很平静地这样解释他的生活方式。他消瘦的脸颊上浮着一层暗暗的青气,眼白里满是一条条细细的血丝。讲话的时候,眼神涣散,不知道他在看哪里。
    “为什么不换个读书方法?这种煎熬式读书不是效果很差吗?”
    他摇摇头:“我不知道还有什么别的方法。”
    “为什么不找其他出路?不上大学,去读职校或学技术?”
    他开始咬指甲,每一片指甲都咬得烂烂毛毛的:“不行,我非读大学不可。”
    李国栋后来仍旧落了榜,但是也没去当兵。他在精神病院里住了两个星期之后,有个晚上,偷偷吞了五枚大铁钉,从七楼的阳台上跳下来,刚好掉在垃圾车旁边。
    麦尔教授对老鼠很有兴趣,曾经做过这样的实验。
    他把老鼠聚集在一个平台上,让它们一个个往下面两个门上跳。跳向左门,它会碰得鼻青脸肿;跳向右门,门就会打开,门后是甜美的乳酪。小老鼠当然不笨,训练几次后,就快快乐乐地往右门跳去,不再摔得一鼻子灰。
    可是,就在小老鼠的选择方式固定了的时候,麦尔把乳酪从右门移到左门。本来以为可以饱食一顿的老鼠现在又碰得鼻青脸肿,它不知道客观情势已经改变了。幸好,摔了几次后,它又渐渐熟悉了新的情况,原来乳酪在左边!
    问题是,麦尔又有了新花样。他把门的颜色重新漆过,把乳酪一会儿放左,一会儿放右。老鼠在新的习惯形成之后,发觉原来的方式又行不通了,它必须不断地适应新情况,不断地修正自己的习惯行为……
    终于,老鼠变不过来了,它的下一个反应就是“以不变应万变”。麦尔发觉,在应变不过来的时候,老鼠“拧”了,开始固执起来,根本就拒绝改变方式。譬如说,如果它已经习惯于跳向左门,你就是把乳酪明明白白地放在右门上,让它看见,它仍旧狠狠地往左门去碰肿鼻子,愈碰就愈紧张。如果实验者在这个关口继续强迫它去作跳左或跳右的抉择,老鼠就往往会抽筋、狂奔、东撞西跌或咬伤自己,然后全身颤抖直到昏迷为止。换句话说,这只老鼠已经“精神崩溃”了。
    于是,麦尔教授归纳出导致老鼠“精神崩溃”的五个阶段:
    首先,对某一个难题(左门或右门),让老鼠逐渐培养出一种应对的习惯来(选择右门:右门有乳酪)。
    第二个阶段,客观环境改变,老鼠发觉惯有的方式已经不能解决问题,因此感到恐惧。
    第三个阶段,不断的焦虑与挫折、失败之后,它就固执地以旧有的方式面对新的情况,不计后果(就是看见乳酪出现在右边,仍旧往左边闯)。
    第四个阶段,根本放弃努力(乳酪也不吃了,干脆饿死)。
    最后,如果外力迫使它非解决问题不可,它就又回到它所习惯的旧方式(左门就是左门,非左门不可)。当然又碰得鼻青脸肿,饿得头昏眼花。明明只要换个途径就可解决一切,它却固执地在习惯行为中饱受挫折与失败的煎熬,最后以崩溃结束。
    在垃圾车边被清洁工人发现的李国栋是一只弄“拧”了的老鼠,我们的社会环境与教育制度是控制乳酪、制造难题的科学家。从前,大学之门是通往乳酪的门,所有的人都往那个门上跳。“士大夫”观念深深地植入人们心中,因为我们发觉成了“士大夫”之后就有甜美的乳酪可吃。但是,在大家都习惯了这个方式之后,客观情况却变了,乳酪换了门。往“士大夫”那个门撞去,就会撞个鼻青脸肿,而且得不到乳酪。
    可是孩子们继续去撞那一扇门。做父母的也继续鼓励孩子们去撞那扇没有乳酪的门。他们说“有志者,事竟成”;说“精诚所至,金石为开”;说“老天不负苦心人”。门的颜色变了,乳酪的位置换了,可是弄“拧”了的人固执地守着旧有的方式“以不变应万变”。
    一个人,也只不过是只有可能精神崩溃的老鼠。人生的每个阶段里都有看似不可解的难题时时强迫他作出抉择:考试失败了、爱人变心了、婚姻破裂了、工作失去了,每一个难题都需要一个解决的办法。究竟乳酪在左边还是右边?不管左右,当一个人不再能以“新”的方式来应付“新”的情况,当他不计后果,根本拒绝改变自己的时候,他就是一只弄“拧”了的老鼠,精神的解体只是自然的结局。如何能不受制于旧习惯、旧观念、旧方法,如何不因搞“拧”了老去撞一扇没有乳酪的门,需要的是弹性与智慧。
    智慧,不正是人之所以为人,鼠之所以为鼠的差别吗?

posted @ 2008-08-21 19:17 Condor 阅读(442) | 评论 (0)编辑 收藏

仅列出标题
共10页: First 2 3 4 5 6 7 8 9 10