|
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; }
上周,“番茄花园”作者洪磊被警方带走,传出的罪名是涉嫌侵犯微软著作权,也就是俗称的“盗版”。(8月24日北京晨报)
从番茄花园的站长被拘捕、番茄花园网站改版开始,“番茄门”开始成为网络间仅次于奥运会的热门话题。与当初人们对“珊瑚虫事件”的反应有些类似,有一部分网民开始为番茄花园叫屈,“支持番茄花园”式的呼吁此起彼伏。
对于部分网民的这种反应,我理解他们的苦衷,但从更长远的方向看,笔者又反对这种支持番茄花园的举动。我想对他们说:为了我们自己的利益,请不要支持番茄花园。
支持番茄花园就意味着支持盗版、支持盗版就将我们置于被动的地位,这是一个很浅显很直白的道理。网民们并非不懂这些,只是因为弱者的激愤才有了前面那些不正常的支持。盗版产生并且泛滥的主要原因是消费者的经济条件与正版软件的销售价格难以匹配,如果我们普通人的财力足以接受售价上千元的微软系统并且不拿它当回事、如果微软的系统免费或者价格低的与盗版别无二致,那盗版不大可能会有源头也不大可能会有市场。但在垄断和经济条件面前我们普通消费者是弱者,所以支持廉价甚至免费的盗版这个错误的选择成了部分网民在番茄花园站长被抓后第一反应。
实际上,网民们支持番茄支持盗版的想法有些天真,他们也许认为只要我们用盗版支持盗版的话微软就无可奈何、微软就有可能因此蒙受巨大的损失。但是,部分网民的支持盗版能改变微软独霸天下的垄断地位吗?只能是加强这种地位;部分网民的支持盗版能够使微软的“天价”降低吗?这近乎于天方夜谭。支持盗版只能让微软有足够的理由在知识产权方面对中国指手画脚、支持盗版只能让微软的垄断地位毫发无损、支持盗版只能让微软的天价居高不下、支持盗版只能让国产软件业继续没落,支持盗版,对我们有什么好处?一点好处也没有。
我们普通百姓希望自己使用的软件有低廉的价格(最好是免费)、简便的操作、能够得到保障的质量,但很难实现,所以才会退而求次选择盗版。可如果正版具有远胜于盗版的优点的话你还会用盗版吗?很明显,我们当然会去用正版。那么,如果我们的政府能凭借法律的力量强迫微软实现上述目标的话,我们的目的不就达到了吗?所以,我们不应该寄希望于用盗版去打击微软,这违反了法律;我们应该推动政府用法律去制裁微软,因为已经有了微软在欧洲和美国被起诉的先例。
如果我们某些人还在为番茄花园的倒掉惋惜的话,那说明我们很短视;如果我们还在为支持番茄花园摇旗呐喊的话,那我们是在拖《反垄断法》的后腿。这对我们毫无益处。我原来以为“番茄门”是微软拖延时间的一个手段,后来我反过来一想,这何尝不是我们《反垄断法》解决微软垄断问题的一个良好契机呢?
廉价或者免费不是我们的终极目标,从长远看我们应该有更远大的理想。我想劝那些支持番茄的人们几句:你不愿意花钱,你可以去用Linux,如果使用不习惯,你可以学习或者等待,但为了我们自己的利益,请不要去支持番茄花园。
村民石章云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元/吨的水费,还不够付电费和管理费用。“实在没钱,那就只好断水了。”管理员摇了摇头。 “以前,我最大的心愿就是村子里能打上一口深井。”王子清俯身望着井底,“可是三天两头断水,成本又那么高,以后我们该怎么办呢?” 虽然深井水供得断断续续,可毕竟隔三岔五有了水吃。然而,有了深井水,并不意味着癌症病魔从此就远离了这个村庄。霍岱珊以前联系过的一些癌症患者,相继都离开人世,现在不断仍有新的患者的名字传入他的耳朵。 王子清也常常担心,活着的人会有各种隐疾。他希望有关部门能为村里的人做一些专项检查,建立村民医疗档案,并派专人检验一下深井水的水质,是否真正得到了改善。 虽然新农村建设的口号,在东孙楼村喊的与外面的世界一样响,但老王真诚希望“不要仅仅是一阵风,仅仅是应付检查”,而是能确实给村里改善一下环境,比如道路硬化,渠塘净化,等等。 “命都没了,经济发展了又能怎样?”王子清质问。 对于东孙楼村出现的新问题及群众呼声,沈丘县卫生局一位副局长称,有关部门曾做出过应对措施,但这些应对措施还没有公开,不便透露。 不过,霍岱珊倒是带来一条好消息:一位日籍华裔将为村里提供生物过滤技术,据说应用此技术,届时就可喝上“达标”的水。 “莲花味精总经理高君也说了,他们公司将积极对待沙颍河的污染问题,要为历史的欠债填坑(埋单)。”霍岱珊说。 尽管东孙楼村治污的脚步在加快,可村子外的污染仍在继续。途经纸店镇一带,依然可闻到刺鼻的气味。司机介绍说,那一带的皮革厂很多,污染特别严重,许多树都死了。记者沿途看到,沟渠里的水黑乎乎的,像是粘稠的发酵物,沟渠边的几行树,叶子已经完全脱落,毫无生机。 一只野鸭子在不远处的水塘里游弋,司机放慢车速,瞟了一眼。 “这年头,能看到野鸭子可不是一件容易的事。”他说。
---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上都需要少许改动。
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)); }
作者:小马丁·路德·金 今天,我高兴地同大家一起,参加这次将成为我国历史上为了争取自由而举行的最伟大的示威集会。 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!"
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
钥匙, 被遗忘在19楼; 慢慢的消沉, 有限的生命. 80楼的门, 还要多久才能开启. 太多的幻像, 被遗忘的钥匙; 还在爬的楼梯, 什么时间可以拾起, 那被遗忘的钥匙. 重正, 那昔日的雄风; 蔚蓝的天空, 在等待着我们.
李国栋床上堆着书,每天晚上睡在榻榻米上,读书读到凌晨一两点,读到两眼充血,像针扎一样痛苦,才把书放开。蜷缩到榻榻米上,用绳子把左腿跟一只桌脚绑在一起,熄了灯睡觉。 “这样一来,我一翻身,扯不动腿,就会醒过来。醒过来就马上爬起来继续看书——今年是第三年了,再考不上,就要当兵去了!” 高考前,李国栋很平静地这样解释他的生活方式。他消瘦的脸颊上浮着一层暗暗的青气,眼白里满是一条条细细的血丝。讲话的时候,眼神涣散,不知道他在看哪里。 “为什么不换个读书方法?这种煎熬式读书不是效果很差吗?” 他摇摇头:“我不知道还有什么别的方法。” “为什么不找其他出路?不上大学,去读职校或学技术?” 他开始咬指甲,每一片指甲都咬得烂烂毛毛的:“不行,我非读大学不可。” 李国栋后来仍旧落了榜,但是也没去当兵。他在精神病院里住了两个星期之后,有个晚上,偷偷吞了五枚大铁钉,从七楼的阳台上跳下来,刚好掉在垃圾车旁边。 麦尔教授对老鼠很有兴趣,曾经做过这样的实验。 他把老鼠聚集在一个平台上,让它们一个个往下面两个门上跳。跳向左门,它会碰得鼻青脸肿;跳向右门,门就会打开,门后是甜美的乳酪。小老鼠当然不笨,训练几次后,就快快乐乐地往右门跳去,不再摔得一鼻子灰。 可是,就在小老鼠的选择方式固定了的时候,麦尔把乳酪从右门移到左门。本来以为可以饱食一顿的老鼠现在又碰得鼻青脸肿,它不知道客观情势已经改变了。幸好,摔了几次后,它又渐渐熟悉了新的情况,原来乳酪在左边! 问题是,麦尔又有了新花样。他把门的颜色重新漆过,把乳酪一会儿放左,一会儿放右。老鼠在新的习惯形成之后,发觉原来的方式又行不通了,它必须不断地适应新情况,不断地修正自己的习惯行为…… 终于,老鼠变不过来了,它的下一个反应就是“以不变应万变”。麦尔发觉,在应变不过来的时候,老鼠“拧”了,开始固执起来,根本就拒绝改变方式。譬如说,如果它已经习惯于跳向左门,你就是把乳酪明明白白地放在右门上,让它看见,它仍旧狠狠地往左门去碰肿鼻子,愈碰就愈紧张。如果实验者在这个关口继续强迫它去作跳左或跳右的抉择,老鼠就往往会抽筋、狂奔、东撞西跌或咬伤自己,然后全身颤抖直到昏迷为止。换句话说,这只老鼠已经“精神崩溃”了。 于是,麦尔教授归纳出导致老鼠“精神崩溃”的五个阶段: 首先,对某一个难题(左门或右门),让老鼠逐渐培养出一种应对的习惯来(选择右门:右门有乳酪)。 第二个阶段,客观环境改变,老鼠发觉惯有的方式已经不能解决问题,因此感到恐惧。 第三个阶段,不断的焦虑与挫折、失败之后,它就固执地以旧有的方式面对新的情况,不计后果(就是看见乳酪出现在右边,仍旧往左边闯)。 第四个阶段,根本放弃努力(乳酪也不吃了,干脆饿死)。 最后,如果外力迫使它非解决问题不可,它就又回到它所习惯的旧方式(左门就是左门,非左门不可)。当然又碰得鼻青脸肿,饿得头昏眼花。明明只要换个途径就可解决一切,它却固执地在习惯行为中饱受挫折与失败的煎熬,最后以崩溃结束。 在垃圾车边被清洁工人发现的李国栋是一只弄“拧”了的老鼠,我们的社会环境与教育制度是控制乳酪、制造难题的科学家。从前,大学之门是通往乳酪的门,所有的人都往那个门上跳。“士大夫”观念深深地植入人们心中,因为我们发觉成了“士大夫”之后就有甜美的乳酪可吃。但是,在大家都习惯了这个方式之后,客观情况却变了,乳酪换了门。往“士大夫”那个门撞去,就会撞个鼻青脸肿,而且得不到乳酪。 可是孩子们继续去撞那一扇门。做父母的也继续鼓励孩子们去撞那扇没有乳酪的门。他们说“有志者,事竟成”;说“精诚所至,金石为开”;说“老天不负苦心人”。门的颜色变了,乳酪的位置换了,可是弄“拧”了的人固执地守着旧有的方式“以不变应万变”。 一个人,也只不过是只有可能精神崩溃的老鼠。人生的每个阶段里都有看似不可解的难题时时强迫他作出抉择:考试失败了、爱人变心了、婚姻破裂了、工作失去了,每一个难题都需要一个解决的办法。究竟乳酪在左边还是右边?不管左右,当一个人不再能以“新”的方式来应付“新”的情况,当他不计后果,根本拒绝改变自己的时候,他就是一只弄“拧”了的老鼠,精神的解体只是自然的结局。如何能不受制于旧习惯、旧观念、旧方法,如何不因搞“拧”了老去撞一扇没有乳酪的门,需要的是弹性与智慧。 智慧,不正是人之所以为人,鼠之所以为鼠的差别吗?
|