传东's profile浩瀚空间PhotosBlogListsMore ![]() | Help |
|
May 22 产品?艺术品?商品好的产品就像是精美的艺术品:让人那么的沉醉;让人那么的流连忘返;让人那么的难以忘怀。
巧夺天工、浑然天成;那么的自然,就像生来就该如此。每一个细节也都是那么顺畅,充满着美感。 艺术与工艺的完美结合、专注、和谐、自然,让人感叹不已。
好的产品能让人有一见如故的感觉,能让人从中得到乐趣。
用户乐意为之付出,用户认可这种享受。
虽然有时,这种享受是那么的自然,就像人们需要呼吸空气那样的理所当然,甚至让人忽视它的存在,但这并不能否认它,掩盖它,它总会得到大家的认可,重视,就像那些精美的艺术品,最终都会被揭开面纱,被世人所知。
当然,那是艺术品里的精品,我们做产品开发不需要做到如此地步,但是,追求作出好的产品,完美的产品应该是我们追求的目标。重构,整合,再重构,再整合,我们应该一直在朝着这个方向前进。
但是,让我们一直困惑的就是用什么作为标准来衡量一个产品是好还是不好呢?
仁者见仁,智者见智,各有各人的想法。
以艺术家的角度、态度去创造产品应该也是其中的一个方法吧。
December 03 AutoPager是个好东西, 值得推荐欢迎大家使用autopager, 这个Firefox的插件非常实用, 为你省去了点击下一页的烦恼.平时我们经常会遇见这样的情况, 在一个页面没法找到自己要的东西, 不得不再去点击下一页,就这样一直下去,很烦. 有了这个, 一切的烦恼就没了, 在你浏览当前页面的时候, 下一页autopagerr就自动为你装载并且贴在当前页面的下面, 你所要做的就是看看,往下传滚轮, 一页页的数据会会自动的为你打开并且接在上个页面的下方. 所有你看过的页面最后都形成了一页, 这样方便你回滚查看一些资料,真是太方便了.
强烈推荐大家使用. 好东西要共享.
这个插件现在被mozilla官方推荐, 你可以在firefox里插件里面搜索autopager然后安装即可. 作者是wind. October 27 一定要拆开清洗饮水机造成饮水机需要清洗的主要因素是饮水机的二次污染问题和矿泉水中的矿物质沉淀。 那么,究竟该如何清洗呢? (2362 字) 消费者在掌握怎样清洗饮水机前,应了解为什么要清洗饮水机,造成饮水机需要清洗的主要因素是饮水机的二次污染问题和矿泉水中的矿物质沉淀。 产生饮水机二次污染主要有四个因素:1.饮水机使用时,补充进入饮水机内部空气中的有害细菌和有毒物质。 2.饮水机聪明座与5 加仑水桶相接触部位。 3.饮水机本身质量问题。 4.饮水机、饮用水标准允许的细菌数量。 饮水机在使用时,从龙头中放出多少体积的水,同时会从周围环境中补充等量体积的空气,通过饮水机进入桶装水中。细菌、病毒等微生物是极为细小的颗粒,易吸附于尘埃上。据调查,即便是清洁的环境,每立方米空气中也有4000个左右的细菌。专家指出,室内空气中充满着一氧化碳、烟雾的毒物以及灰尘、害虫和霉菌等,还有装璜材料,如油漆、乳胶漆、喷塑剂、粘合剂等散发出的甲醛、甲苯、二甲苯等有机废气在饮水机使用时,通过水、气交换进入内部不设防的饮水机后,时间一长会增加水的混浊度和有机耗氧污染,从而改变原本纯净水体的组成,使之成为细菌生长良好的培养源和迅速繁殖的“温床”,水体中的细菌数经过一定时间的积累,产生了由量变到质变的转换,便生成了危害人体健康的新的二次污染物,造成了饮用水、饮水机的二次污染。 此外,附着在五加仑水桶表面的细菌等有害物质和空气中自由漂浮藻类的孢子等,在用户更换水桶时,极易落在水桶的聪明座的接触部位,经光合作用后产生藻类污染和细菌污染。因此饮水机应放在阳光照不到的地方。 还有就是饮水机本身质量问题,环境温度较低时,一些常见昆虫如蚊子、苍蝇等开始进入了越冬期。饮水机加热器部件在工作时,附近的温度维持在20-40 ℃左右,成为这些昆虫越冬御寒的最佳场所。一些盲目追求低价而偷工减料、 制滥造的劣质饮水机的聪明座与冷水胆的衔接处缝隙较大又无密封装置,这些昆虫或产的虫卵,在饮水机使用时的水、气交换过程中被气流吸入水胆中,造成放出的水中有上述物质。 饮水机、饮用水标准规定允许的菌类总数在70/ML ,权威卫生部门测试,细菌在30℃左右的条件下,繁殖率每隔十几分钟就可翻一番,并呈几何级倍数增长 ……。据有关部门检验,从饮水机冷水龙头或常温水龙头出水水质中的细菌总数均不符合《生活饮用水标准》和上海市《饮水机》地方标准,有些饮水机的冷水龙头出水中的细菌总数有4600个/ML ,高者甚至达到29000 个/ML.以矿泉水为水源的饮水机经加热煮沸后,水中的碳酸氢根中的氢原子分解,成了碳酸根离子,它们与矿泉水中的钙、镁等矿物质结合会生成不溶于水的沉淀物,时间一长就会沉积于饮水机水胆的底部产生积垢,不仅影响水质,而且会影响饮水机的加热效果并容易产生噪音。 现在在一些大、中城市已有专门从事清洗饮水机的服务机构,如果消费者所在地区没有此类服务机构或想自行进行消毒处理,可按以下步骤进行:清洗前,首先得切断机器电源,根据消毒剂(片)的使用方法配置好消毒剂待用,开启冷水龙头,放尽冷水胆中冷水,再拆下饮水机的聪明座,使饮水机冷水胆露在外。 目前,市场上饮水机的聪明座结构主要有两种,一种是与机器的方盖连成一整体,靠螺丝与机器连接,这种饮水机的聪明座拆起来比较麻繁,消费者想自行拆卸时,可先用十字螺丝刀拆下机器后上方方盖与机器连接的两颗螺丝,略微拔起方盖约10°-15 °,再沿倾斜的10°-15 °的方向向前用力拍一下,直至方盖脱离机器;另一种是与冷水胆设计成在一起,这种饮水机拆卸起来比较简单,只需用手把住聪明座内侧,将聪明座按逆时针方向略微一转,脱离卡扣,向上提起即可。拿一块新的干净软布,用饮用水搓洗挤干后擦去冷水胆四周和底部的脏物和沉淀物(如果有的话),再擦干净聪明座内部的底端部分(使用时浸在冷水胆水中的部分)。以“上工”牌饮水机使用的消毒剂为例,可将配置好的消毒剂像桶装水一样直接插在聪明座上,开启红色龙头,放出适量的水,使消毒剂全部流入机器内,关闭红色龙头,向上拔出空瓶(桶),5 分钟后,打开红色龙头,至水放完,再隔10分钟,打开蓝色(冷水)龙头,将水放完,这个过程可对冷、热水胆、管路和龙头内部进行消毒处理。然后旋开机器背后的放水阀,将内部含有消毒剂的水全产放入一干净脸盆中,放完后旋紧放水阀,注意切莫将拆下放水阀帽内的硅橡胶密封热弄丢失,否则会漏水。 此时,机器内部的消毒过程全部完成。再将干净的软布在刚放出的消毒水中搓洗挤干,(软布上有消毒剂成分)擦洗聪明座的外部凹陷处(与水桶盖相接触部位),以及机器的水龙头、接水盘和水桶的瓶盖处,擦完后立即将水桶插在饮水机上。这样,饮水机的全部消毒步骤才算完成。 饮水机消毒剂的选择也有讲究,目前市场上的饮水机消毒剂有好几种,比较理想的是稳定性二氧化氯(CLO 2 )溶液饮水机消毒剂,它无刺激性,对人体无害,与水无限互溶并迅速释放出杀菌有效成分,能在较短时间内杀灭病毒,如大肠肝菌、沙门氏菌、绿浓肝菌、芽胞、真菌、藻类等,对肝炎病毒、霍乱和爱滋病毒也有良好的杀灭效果,此外,它与水中的无机物或有机物不生成有毒物质,它的安全被世界卫生组织列为A1级,是一种较理想的广谱型消毒剂。 一般性讲,不具备防二次污染技术的饮水机,建议2-3 个月左右清洗一次,而具备防二次污染技术的饮水机,如“上工”牌WH-B6 、WH-B3a等,由于采用了先进的防尘过滤,杀菌、吸附处理措施,可将空气中的灰尘阻挡在机器外部并能杀死进入机器空气中的细菌,在定期更换消毒过滤膜的条件下,可一年左右用消毒剂清洗一次。 October 18 百家之言:危机来临--郎咸平主持人:尊敬的各位领导、各位来宾,欢迎大家来到阳光100财富中国系列活动 财富论坛烟台站的活动现场,非常容幸今天能够和大家一起在这样一个暖暖的午后一起聆听世界顶级的经济学家给我们带来的全新思维盛宴。。。。。。 朗教授:今天很高兴,能够来到烟台谈谈让人沮丧的题目,当前经济热点透视,你只要谈到当前经济热点,都是坏消息。那么,请各位来宾想想,你面临的最大的危机是什么?我可以这样告诉你,我们中国改革开放30年,基本是成功,尤其是10余年来,我们经济高度发展的结果孕育出了在座各位一大批企业家。可是你知道吗?由于你所处的环境太顺了,我国经济增长太成功,因此你们这批企业家,只有个人的艰辛的奋斗历程,全中国的go-vern-ment官员,全体企业家没有一个人经历过马上要发生的经济危机。昨天晚上到现在,竟然有几个企业家问我一句话,朗教授你看看现在还有什么有潜力的行业我想投资的,我只想三个字我说你疯了,你什么也不懂。你把人生看得太简单,你过去怎么成功的?你过去是顺着改革的潮流成功的,我告诉你在今天这刻是每位在座的企业家反思的事。我们的未来是什么?请各位来宾看看今天提供的数据,美国股市从年初到现在,跌了?蒸发了多少亿资金?8.5万亿美元是什么概念?这就是我们中国05、06、 07三年GDP的总和全部白干了,一个国家的股市跌了这么多,它所象征的后续是极其可怕的,那就是一个持续的大萧条即将来临。 而中国的股市,虽然过去有所谓的泡沫现象,但是在这里我得很遗憾地告诉各位中国股市已经跌了超过70%,这和美国1929年股市崩盘差不多,这种股市大跌是什么意义?为什么我在去年年底的时候,我敢预言中国股市大跌,就在今年五月份我在凤凰卫视《铿锵三人行》我呼吁全国股民不要对奥运有幻想,股价一定会持续下跌,讲这句话不是一个简单的我有没有胆识、敢不敢讲的问题,我为什么这样讲,当然你们知道我这样讲是对的,中国股价一反世界潮流,什么叫做世界潮流呢?那就是任何奥运主办国的国家都在奥运前大幅攀升,奥运后大幅下跌,我为了讲中国股价会下跌呢,因为我已经看到了经济危机,很多人说朗教授你的争议性比较大,我说你们是错的,我从来没有,因为我讲的到最后都会实现的。 请各位想想,世界经济的次贷危机会对你造成什么冲击?在这刻我姑且把这个话题束之高阁,我先不告诉你,我可以告诉你更可怕的是危机没有来之前,我国已经产生了危机,那就是从前年到去年的股市泡沫和楼市泡沫现象,这种泡沫现象,各位来宾你们以为是我们中国经济发展更成功了吗?你认为是我们中国老百姓更富裕了吗?因此有更多的闲钱炒股吗?不是吧?我在去年年初又讲了一句话争议性的话,很多学者不高兴,我说股市泡沫跟楼市泡沫的本质不是经济更好了,不是我们更富裕了,而是制造业的回光返照,这是什么意思?我国制造业企业家所面临的投资环境已经开始急速恶化,因此,很多企业家把应该投资在制造业的钱不投资的,拿出来去干吗呢?炒楼炒股了因此大量的企业资金进入股市、楼市才是楼市泡沫和股市泡沫的真正原因。 按照我的说法,下一步应该是制造业的大量倒闭,为了把我当时的观点记录在案,我绝对不放马后炮,我写了一篇文章叫做《八大危机》,出来以后,点击率超过一个亿,虽然很轰动,但是像我的人生一样从来不得到重视,因为大家都喜欢专家、学者谈一万点、八千点,不喜欢听我讲实话,不幸的是今年的经济按照我去年所说的八大危机一步一步发生。 就在这个时刻,广东的媒体叫《南方人物周刊》对我做了一个专访,尤其是我写了八大危机之后,他们觉得不可思议,到现在我也记得,他说当全中国专家学者说股市泡沫、楼市泡沫、多膨胀是由于流动性过剩的时候,郎咸平不同意,郎咸平说应该是制造业的回光返照,如果郎咸平是对的,那么全国的专家、学者都是错的。因此,go-vern-ment推行的宏观调控,不但不能解决问题,反而是一个落井下石的毒药,那是10年之前。我今天我有点羞答答,不好意思告诉你们,最后证明我是全国唯一对的学者,其他的都错了。(掌声) 否则你们这么忙,干吗听我在这里演讲呢?那么各位想想,什么叫做流动性过剩?我们的学者竟然认为,楼市泡沫、股市泡沫,还有通货膨胀,就是简单的流动性过剩,什么是流动性过剩?那就是我们手上的钱太多,买股票,股市泡沫;买楼房,楼市泡沫;买产品,通货膨胀,因此用一个所谓的流动性过剩的学术名词都可以简单解释07年发生的一切现象。那么,我们go- vern-ment所推行的宏观调控政策,竟然是以收回流动性为目的。其方法是提高利率跟提高银行利率和存款准备金率,到了年底经济工作会议更进一步加大力度,实行宏观调控。那么我请各位来宾想一想,有没有可能全中国的学者都是错的?有没有可能流动性过剩就是错的?有没有可能因为流动性过剩所推行的宏观调控也是错的?在这里,很不幸的告诉各位,这都是错的。因此,我们的制造业才如此的被动。中国经济根本就不是流动性过剩,胡说八道。由此产生的政策误导让我们的go-vern-ment、让我们的企业付出了沉重的代价。而且我们的学者特别喜欢粉饰太平、取悦领导,这种方法更是让我们的经济雪上加霜。 今天我针对这一切的前提,跟各位从国内一直谈到国外,让各位清清楚楚知道我国经济出了什么问题,为什么会产生泡沫现象,其实泡沫现象只是一个表面现象,真正的原因是我们整个经济发展出现了重大危机。请各位想想,我们每年10%的经济增长是怎么来的?很多股民这么问我,朗教授你看我们经济增长这么成功,每年 10%,我们的股票市场没有反映我们的经济增长的乐观现象嘛,我说你是错的,中国的股票市场是真真实实反映着我国经济的本质问题,你每年看到的10%的经济增长本身都是有问题的。什么问题呢?那就是我们整个经济增长的模式是错的。我们是以什么方式拉动经济增长啊?我们是钢筋、水泥所拉动的,也就是说你们到各地区看,各地go-vern-ment搞的绿化也好,桥梁也好,这些东西拉动了中国的经济增长。那么这些部分是多少?这些部门占了经济总量的30%左右,也就是说和地方go-vern-ment推动GDP工程有关的部门拉动了经济增长。那么这些部门是中国经济真正过热的部门。 那么其他的民营制造业呢?基本上过冷。这些部门只占了30%左右的部门是哪些部门呢?以去年为例,包括地产、政绩工程、形象工程、大型国企,其他的融资银行和证券公司等等,这些部门你知道去年的增长率是多少呢?就以去年为例,超过30%。30%的总量,它的成本率超过百分之三十几。一平摊下来,中国全国的经济增长应该是10%左右,理解了吗?我们的民营经济对国家的贡献是非常小的。 因为我们这么多年把大量的资源投入在基础建设,基础建设也就是GDP工程建设推动了10几年来的经济发展。那么这个推动表面上看起来我国取得了光荣的 GDP,实际上我们为此付出了沉重的代价。我给你举个例子,什么叫做代价,这种发展模式使得我国GDP的组成非常的畸形、非常扭曲。我们拿我们的GDP和欧美、日本等国比较,那些国家,他们是以消费需求为主要拉动的,也就是说当我想喝矿泉水的时候你生产矿泉水,当我想弹钢琴的时候你生产钢琴,我想打手机的时候,你生产手机,很正常。因此他们的70%都是消费。我们刚好相反,我们的消费只有35%,只有别人的一半,我们的GDP是什么东西呢?都是你们在外面看到的钢筋水泥,占到50%以上,欧美各国20%不到。 各位了不了解这种经济会造成什么样的可怕的结果?那就是,由于我们国内的消费太少,因此,造成了大量的产能过剩,我们制造太多的消费不了,而且我们产能过剩是怎么造成的呢?我们牺牲了我们的环境,破坏了我们资源,剥削了我们的劳工,因此,产能大幅扩张,而且产能大幅扩张到什么地步?到了我们老百姓消费不了的地步,大量产品制造出来,我们只有30%的消费,因此能是出口创汇,把过剩产能生产出来的产品卖给外国,美其名曰是出口创汇,其实是埋下了定时BoB!!!,就在 08年爆炸了,是什么因的BoB!!!呢?你想想,我们只消费的30%,而我们这么多的产能,这么多产品不得不出口给别的国家消费,不但破坏了环境剥削了劳工,同时我们赚了大把的美元外汇,06年破的1万亿,07年破的1.5万亿,08年破了1.8万亿,现在正在破1.9万亿,讲问以后就是1.9万亿了。外汇大量积累的结果使得我们这种被动以出口创汇为主导的畸形经济付上的沉重的代价,人民币不断升值,不断升值的结果,回过头来打击到这些以出口为主导的民营经济。 所以,二元经济成型了,什么是二元经济,那就是真正拉动经济增长的与go-vern-ment推动GDP 工程有关的部门过热,而其他的民营制造业开始受到的严重的打击。汇率上升首先敲响了70%的民营制造业的警钟,面临的投资环境开始紧缩。因此,过冷的部门更冷,相对而言,过热的部门更热。就在这个时刻,又由于成本的不断上升,也就是国外的进口通货膨胀使得成本不断上升。进一步又打击到二元经济中过冷的民营制造业,它的投资环境更加恶劣。 同时又在这个时刻,go-vern-ment推出了劳动合同法,劳动合同法的本身意义是重大的,我身为弱势群体代言人,我是非常支持这个方案的,但是这个方案的推出不能以双输为代价,必须要以双赢为的代价才有意义。第一缺乏反方向的论证,第二缺乏试点,匆忙推出之后,中国过冷的民营制造业至少1/3以上造成严重打击。因此,过冷部门的民营企业家面临的投资环境进一步恶化。所以汇率,成本、劳动合同法,我还没有讲到次贷危机,第四,go-vern-ment不断加大宏观调控的力度。我不断呼吁这是错的,go-vern-ment到现在才听进去,可是去年已经是数次提高利率,宏观调控的接连推出大力度的推出,目的是什么?目的是降温,可是全国学者都搞错了,中国经济没有过热只是30%推动 GDP工程的是过热的,而宏观调控推出的结果是彻底打击了过冷的民营制造业,有的时候想想这个事情觉得很难过,很悲哀的,这么明显的事情,大家看不懂,我看懂了以后说郎咸平是有争议的人物,这就是我们学者对我的态度。 好了,就在这个艰难的时刻,go-vern- ment加大力度宏观调控是什么结果呢?通过了三个管道进一步打击了民营制造业。第一个管道,是在宏观调控的压力之下,银行从过冷的制造业部门大量收会流动性资金,去干吗呢?不是放在银行里,放在银行里还好,拿出来以后拿给过热地方go-vern-ment基础设施建设,这种做法使得社会的流动性由过冷的制造业透过银行体系转到过热的银行go-vern-ment中去的,因此过冷的部门更冷,过热部门由于吸收了大量的制造业的资金变得更热,这就是宏观调控的第一个管道。 宏观调控的第二个管道呢,不断提高利率,不断提高银行存款准备金率的做法。再加上前面讲的汇率上升、成本上升、劳动合同法推出,因此使得二元制造业中更干不下去了,他们怎么做呢?所以民营制造业的企业家就把应该投资在制造业的钱不投资了。拿出来,打到过热的部门去干吗呢?炒楼炒股去了。这就是从06年到07 年所开始的股市泡沫、楼市泡沫的真正因素,那就是二元经济当中过冷的制造业持续衰退,他所面临的因此各种因素不断恶化,他们更不想干了。更不想干的结果回去炒楼炒股。 这就是一开始,我告诉各位房价涨得最高的区域,通常是制造业最箫条的区域,这是第二条管道,第三条管道呢?简称海尔现象。什么叫做海尔现象就是处在过冷制造业的企业像海尔的家电制造业投资经商环境恶化,所以它也不想干的,因此从过冷的部门筹集大量的资金打到过热的部门干什么呢? 这三个管道,造成什么结果呢?我重复一遍第一个管道,你会发现,各地的建设是如火如荼地推行,而且代价是民营制造业的资金更缺乏,资金逆流掉,造成了过热部门修桥铺路去了,第二个管道使得大量的制造业资金炒楼炒股造成中国GDP现象的表面繁荣,这是可怕的,因为这个表面繁荣配合第三个管道大量资金流入过热部门造成整个资源的误导。第二个管道和第三个管道的配合结果使得我国表面的繁荣,因此使得大部分,我不敢说是百分之百,差不多的、几乎百分之百的地产商,在我今天讲话的这刻面临重大的危机。 我前面讲的这一切现象,综合在一起,我相信你们从事企业的来宾,应该都听过,就是这么简单的。那么这种现象和流动性过剩有什么关系呢?胡说八道。讲到今天我是那种水平的学者的话,我今天五秒钟讲完了,买股市股市泡沫,买楼楼市泡沫讲完了,不知道该讲什么了,我告诉你,我才刚开始,我还没有谈到次贷危机。 我国二元经济已经将我国的经济发展带入到了一个箫条的经济,就算美国没有次贷危机中国经济依然下滑,危机照跌,楼市照跌,注意没有谈到次贷危机我们就已经抗不住了,你去年看到的股市泡沫已经给各位敲响了警钟,可能你们问我,朗教授,二元经济都听懂了,听懂了吗?你一开始讲的我们的股市跟楼市反应的基本面是对的,我就以股市为例,为什么这么问呢,怪他自己,怪他不听我演讲,不学习,如果06年来听都发了,08年听也可以,现在来不及了,那就用我前面讲二元经济现象,回答我们主持人的问题,为什么你会这样问呢? 06年开始的股价大涨根本就不是尚福林说的股改,他胡说八道,他什么也没有搞懂,这点我都有点同情他,什么也没有搞懂,还搞这么多东西,现在我都不会生气了,还会义愤填膺地说,我无所谓,我也没有办法了。 2005 年的时候我们透过媒体我警告尚福林千万不能推行股改,它是错的。你们也知道朗教授讲话是非常具体的,我过去讲什么情况下是成功的,什么情况是失败的,这个话我不会讲,那是没有信心的学者搞的话,我很有信心,我说错一定会错,我说股改是错的,而且是百分之百错的,他不知道怎么回答了,箭在弦上,不得不发,什么回答,我给他一个回答我说箭在弦上也得撤下,他不听我的。他说,那可能怀疑说,哎呦,既然朗教授说股改失败了,为什么06年开始国家大涨呢,我怎么会错呢?我什么时候错了?我告诉你06年股价大涨的唯一原因就是二元经济已经开始生效,大量的制造业资金大量进入股市跟楼市。 那么,股价大涨的现象到07年5月30号股指跌到3千点这个时候你们就应该来听我的演讲,你们相信别人说的八千点一万点,哪个时候你们买了什么股票啊?买了二线蓝筹股是不是?所以从五月底到了11月从3千点到6千点你们买二线蓝筹的股民没有赚到钱,为什么没有赚到钱?因为当时拉动股指的都是大盘股,我们称之为2:8现象或者是3:7现象,20%多的股票拉动了股指,从3千点拉到了6千点,这个二八现象和三七现象的二或者是三是什么股票呢?是地产,钢铁,水泥,政绩工程、形象工程、大型国企,其他融资银行还有证券公司等等,没有错吧?你们是不是觉得耳熟啊?这不就是二元经济当中过热部门吗? 所以说,去年五月底到11月,股票市场已经完全反映了朗教授的二元经济,在这个时刻我是声嘶力竭地呼吁go-vern-ment一定要解决这个问题。一定要开始救助制造业,因此这是制造业的回光返照。如果go-vern-ment不出手救制造业到了,第二年制造业会大量的倒闭。 后来证明我讲的是对的,就在这个时刻我写下了中国经济的八大危机的文章。你们如果到这个时刻还不来听我的演讲的时候,11月也该来听了吧,也没有来听,11 月我在北京发言,媒体对我的发言不敢兴趣,他们情愿报导说某某学者说八千点到1万点,我在北京发言,我是股价必跌,因为二元经济。你想向到了11月股指到了6千点是20%、30%的部门拉动的,可以想想涨幅多快,这样快的涨幅一定要回调,所以二元经济中过热的部门一定要回调,而过冷民营制造业按照我当时掌控的数据是迅速箫条,而且存在迅速倒闭的危机。二元经济中过热的部门一定要回调,股指一直跌,你根本不要怀疑,我还没有讲到次贷危机,次贷危机还没有来,我只是讲国内的现状,只是告诉你们,目前全世界闹得金融海啸还没有冲击到你们,你们就已经到了这个地步了,你想想后面还有什么希望,这一切都是我们自己经济体系中孕育出来的,和国际无关。 为什么我在五月份的时候,我非常严肃地警告过全国股民,不要对奥运行情有幻想,中国根本没有奥运行情,而且在节目中,当这期节目散布得很广,很多人看到的,我讲的具体到了什么地步,我呼吁全国股民,股价在奥运之前必跌根本没有奥运行情,为什么?因为,二元经济全面箫条、崩溃的结果会使得股价大幅下跌,就像美国1929年一样,所以今天股价不断大幅下跌的现实意义,就显示着未来制造业持续箫条。今年三月份我在广州照片记者招待会,我呼吁go-vern-ment救市我要告诉大家,我们专家学者讲的都是废话,很多学者说go-vern- ment不应该救市,让市场多元化,这些都是胡说八道。没有经历过社会主义的的血的资本主义,它们是最市场化的一点,美国go-vern-ment干什么,美国go-vern-ment还不理解市场吗?他们是真正的资本主义国家,是真正的市场化国家,请你看看美国go-vern-ment在干什么?美国 go-vern-ment在救市,我们呢?市场化,让市场解决吧,胡说八道。这些学者,我一直不想想他们。现在不想他们不行了。你说作为一个学者,就算你不做研究也理解,你胡说八道讲的话,也应该是一半对一半错的,你猜的,丢一下铜板的方法,像我们的学者每次都讲错那是更难的。(掌声) 像我每次都讲对,很不容易,每次都讲错更不容易。为什么救市?美国很蠢吗?不懂市场化吗?美国人才济济为什么要救市,为什么三月份开始要救市,我告诉学者你根本不懂市场,那么在今天这个场合也是我第一次发言,谈到这个话题,我觉得对你们在座的企业家非常重要。因为,今天的中国已经进入了一个前所未有的工商链条的时代,什么叫做工商链条?也就是说10年前我们从过去5 千年积累的农耕社会走向了工商链条的社会。 工商链条有什么特性?那就是一个部门出现问题之后,一定会产生多米诺骨牌效应的连锁效应的产生。所以我就以我刚才讲的故事,给你们做一个解释就明白了,为什么我们的消费这么多,只有30%,原因是什么?我们中国社会保障体系缺乏的,包括医疗、教育、住房的问题没有得到彻底解决之前,社会保障体系是不足的。所以这个社会保障体系不足,你以为不足就不足啊,你以为不足就是看不起病啊,如果只是看不起病就好了,那就不是工商链条。农耕时代看不起病就看不起病算了,现在工商链条时代一旦看不起病的结果,必定产生农耕时代所没有的多米诺骨牌效应。 请你想在工商链条时代,当你看不起病之后你会怎么做?下一步是什么?你不敢消费了,你要存钱,万一你父母得了病怎么办?你小孩出国怎么办?你住房怎么办?有了这些问题让你不敢消费。下一步骨牌呢?不敢消费使得我国消费非常低,占了GDP35%,下一张骨牌一定是生产过剩,再下一张骨牌必定是出口创汇,再下一张是积累大量的美元外汇,再下一张是人民币汇率升值,再下一张打击了出口制造业,再下一张出口制造业倒闭,再下一张更不敢消费,再走一圈,这是无止境地恶化循环,这就是工商链条时代的特征。 我呼吁go-vern-ment应该怎样做?应该在股市泡沫楼市泡沫的时候,最大的力度救助制造业什么目的?斩断工商链条,也就是说进入股市和楼市的资金是来自制造业的季度衰退,go-vern-ment应该做的是我在制造业部门设立防火墙,斩断工商链条,直接救助制造业,只要把制造业的营销环境搞上取的话,资金自然回流回来,一旦斩断的结果就不会有股市泡沫,不会有楼市泡沫,就不会有现在一切的问题出来。各位听懂了吗?go-vern-ment应该做的是由go-vern-ment出面斩断工商链条而设立防火墙,这就是我前年开始一直呼吁go- vern-ment做的事,都听不懂。一直到事情崩溃之后,才说朗教授都说过。 美国go-vern-ment在干什么各位来宾想想?美国,是一个最资本主义的国家,没错吧?是最强调市场化的国家没错吗?而且共和party更强调,美国go-vern-ment7千亿美元救市计划的本质目的就是斩断工商链条,也就是当金融部门出现问题的时候,立刻设立防火墙来斩断工商链条,由go-vern-ment工资7千亿直接救助那些受到影响的金融机构,你只有把他们救活的以后,整个社会才会安定,否则按照我们中国这种专家、学者的水平的话,市场化不要干涉,你不要干涉结果,金融机构一旦崩溃产生大量的失业,使得美国老百姓信心丧失,下一步干什么不敢消费了,下面是什么?制造业产生危机,再下一张骨牌生产力减少,再下一张骨牌失业,再一张骨牌不敢消费。好了,开始一个恶性循环,所以说金融危机会由于美国go-vern-ment的不作为,会产生实体经济的危机,各位听懂了吗?所以美国go-vern-ment在干什么,比任何go-vern-ment都要首先斩断工商链条。就是怕金融危机波及到实体部门,而我们中国的危机来源不是金融危机而是来源于制造业的危机,我们没有斩断工商链条的结果,是使得制造业的危机波及到股市和楼市,从而造成去年的股市和楼市泡沫把各位都套牢了。主持人问的是对的,我一看你的面,我就知道差不多都被套牢了,为什么呢,就是因为我们的go-vern-ment没有斩断工商链条。为什么没有斩断呢?专家学者所误导,为什么他们误导呢,他们根本不懂,农耕时代培养出来的学生没办法,都是错的。 我相信我跟你们这样沟通以后,大家马上就懂了是这样一回事,原来美国go-vern-ment正在斩断工商链条。我最近我看到美国的形势发展,我就告诉各位,我前面跟各位讲的讲到现在,你注意到了没有,我一再告诉你,美国的次贷危机还没有影响到中国。就算是美国从来没有发生过次贷危机的话中国的股市也是这样跌,中国的楼盘也是这样跌,因为中国制造业持续衰退结果,必然拉动股市和楼市的下滑。情况会逐日的恶化,不是逐年的恶化,也不是逐月的恶化是逐日的恶化,每天都会恶化。 我记得昨天一个学者说,回应我的话对那种唱赞歌的人你应该警醒,整个国际金融形势比任何一个人想的都要难得多,但是没有冲击到中国,就在没有冲击到中国的时候我们的楼市也产生了重大危机,我刚讲了股市,现在讲到楼市,哪里的企业倒闭多,哪里的资金快速流入楼市,比如深圳,大量制造业的资金打入深圳的楼盘,而且,它的切入角度是高价楼盘。为什么?从中国台湾、亚太等地区的楼市历史来看,而长期依然看涨。06年初是1万元/平方米,到了年终是四万元/平方米,大量资金流入,炒到了高端楼盘,附近的中低档楼盘随之水涨船高,真正有泡沫的是中低档楼盘,他们水涨船高,缺乏资金的支援,一旦今年箫条之后,跌价的是中低档楼盘,高档楼盘依然坚挺,那就是地产商的资金链即将断裂,好了,即将断裂的结果就是高档楼盘抗住,那就是深圳目前的现状。 在北京跟上海情况是一样的,高端楼盘价格上去以后,中低档楼盘随之水涨船高。所以北京也好,上海也好,中低档楼盘目前跌价最多,高端楼盘则不是。北京为例,三环之内,根据我的数据,还是为早,顺义跌得更多,就跟深圳的关外一样,上海也是一样,内环有行无市。 最近潘石屹同志卖得不错的,我们查了一下他的资料,买潘石屹的资金51%来自山西煤老大,冲击了各级楼盘,冲击到了价格大涨。我要告诉各位,地产,长期而来,相对股票,以亚洲其他国家和地区为例,包括香港和台湾为例,它还是比较能抗通货膨胀的。 那么很多人问,你这样讲我都听懂了什么,楼市泡沫股市泡沫我该怎么办?我应该卖还是怎么办?你千万不要问我我不是股评家也不是卖地产的,我只是告诉你你所看到的现象背后的本质原因是什么?你要怎么做?你自己要去做判断。 那么各位再想想,下面一个问题就是理财的问题,当你了解了我前面所讲的所有的理论以后,说花一点钱怎么办?我请各位来宾注意,在经济大箫条的前期你不要有幻想,你千万不要想到去赚钱好吗?这是一个很大的思想转变,你在这个时刻能够保本就谢天谢地了,而且中国根本就没有理财的问题,什么媒体的理财专刊,根本不要看,都是错的。你有什么理财的问题,存银行、通货膨胀、买股票,股价大跌。你有什么理财的问题。好,不要问我了,是不是该买黄金,买外币,我跟你讲这个问题问的都是错的。你今天不要问我朗教授应不应该买黄金,应不应买欧元,不要这样问,这都是在平时经济稳定的时候问的,在这个时刻你不要这样问,我建议各位,听清楚,如果你想投资外币的话,你要你买一百块欧元必须买同样的美元,保证什么呢?保证不赚钱,保证不赚钱的结果就是保证不亏欠,买黄金也好,一定要买黄金计价单位的货币,美元,目的就是不赚钱。你能够在这一两年期间能够不损失。那么从09年开始就会有大量的机会,而且机会无所不在,到处是机会。 经济箫条不是坏事,经济箫条可以孕育出无数的英雄豪杰来,平时不一定有机会,谁能够抗过这一段,谁就能够拔地而起,再跟各位讲一个很有意思案例,作为我第一短演讲的结束,请各位来宾思考一下,我国上市公司的负债比例多高?而且这种负债比例是由于我们30年改革开放的成功,我们的企业家我们的官员从来没有经历过大箫条的磨难下他们的负债比是多少?他们把世界看得太简单了,我们上市公司的资本负比例是100%到 300%,资产负债比例是50%到70%。我以资产负债比例为分析,这些没有经历过大磨难的企业,上市以后他们的负债比例高达100%到300%的负债比例的。 我跟各位来宾跟我一起到香港去,香港非常有名四大天王,李嘉诚、李兆基、郭柄向、郑义同,这四个人是搞地产的,叫做四大天王。他最喜欢讲其中的一个天王,四大天王都比我们很多的企业大一百倍,而且香港有比较完善的司法制度,也有更为良好的金融体系。那么,请来宾想一想。这一些比你大一百倍以上的企业在一个信用良好的区域,法制建设完善的香港更有能力借钱吧,可是这些人不同的地方在哪里呢?他们是经历过大风大浪的人,起码是经过四个大箫条,这些曾经经历过数次大萧条的四大天王他们比你大一百倍,他的法制建设完善的香港以及信用良好的香港本来可以比你借更多的钱,你们猜一下他们的资产负债是多少?我们是100% 到300%,他们四大天王是20%,你可能说有钱不借,傻得吗?你说李嘉诚会借不到钱?你借不到钱是真,而且我告诉你不是四家平均20%,是每一个天王的资本负债比例都是20%,不可想象的结果。而且,这四大天王,总资产当中以现金形势保有的比例高达5%到15%之间,你们呢?总资产中以现金形式保有的比例高达5%到15%之间,你们呢?为什么?我曾经问过他们其中一个人,他们说,这一生成功的原因是因为保守。 一个企业家,能够赚多少钱没有什么了不起。而且在我们成功了30年的改革开放孕育出无数赚容易钱的企业家,这些企业家你只要看看我们上市公司负债比例,我就可以告诉你都是没有经历过大磨难的企业家,把世界看得太简单了,什么才是我心目中最睿智的企业家在这个时刻显得更重要的,那就是风险、管理最好得才是最好的企业家,风险管理做的好,我怎么看出来呢?财务报表一看就看出来。一个注重风险管理的企业家一定是随时随地保持着最低的负债比例,随时随地保持着最高的现金流,虽然公司的发展会受到限制,可是无所谓,因为只有保守经营稳健经营才可以帮助你渡过几次危机,你只要渡过两次危机不倒闭的话,你就可以成为该行业该地区的领头羊。这就是保守经营的实际。 我今天把这个数据念给各位听,更值得我们关切的是什么?当这些人在做投资的时候他们怎么想问题的?他想的问题跟我们想的不一样,他们其中一个人这么说的,当他要做A同志的时候他首先想的不是A能够赚多少钱,而是A如果做垮的话能够赔多少钱?如果做垮之后原来的企业有没有办法弥补这个损失?如果可以的话他才可以做,如果不可以的话他就不会做,也就是说他做任何投资的时候首先想到的是原来的企业有没有可以互补的现金流,也就是说新的投资现金流一旦断裂有没有现金流刚好可以弥补,你看到没有,人家在做这种投资,为什么这么谨慎?风险感觉意识是最重要的。做一笔投资随时想到有没有更好的项目跟它做互补。什么是互补?就是你坏我好,我坏你好可以互相抵消,按照我自己的数据,我发现四大天王他们的互补使他们的公司风险减低为多少?他们每个项目都有互补的项目,所以风险平均减少了10倍。 那么你想想,这四大天王所以能够成就这四大天王,第一,最低的负债比例,第二最高的现金流,第三,他们是及其保守而且互补型,投资保证可以对抗风险,所以他才可以走得这么稳。那么,他们写的报告呢?你们有没有写过可行性报告,你知道什么是可行性报告呢?就是找进各种莫名其妙的理由来做,你应该怎么写,你应该写不可行性报告,我想奉劝各位来宾,你把我的演讲听懂的话可以救你的命,在这个时刻你应该写不可行性报告,如果找了这么的的理由还是不充分的话你再做还是来得及。 因此,今天我在上半场给你总结的,你从今天开始要怎么做,第一有可能的话,尽量减低负债的风险,第二尽量收回欠款,积累大量的现金流,第三不要做任何形式的投资,你把我的三点把握好了,你才有可能度过即将来临的经济危机。那么我们休息15分钟回来之后我就把各位带向国际金融,好不好? 主持人:今天上半场的演讲就到这里,感谢朗教授。首先朗教授以我为例,举个例子非常容幸,而且告诉我说,今天我犯了一个大错误,在这里我也指出朗教授最大的错误就是来烟台来晚了,大家说对不对?让我们一起期待朗教授下半场的演出,休息15分钟。 主持人:对于期盼,朗教授的下半场的演讲而言,这个时间感觉更短,我们确实非常认真在听我们朗教授的演讲,不过我个人觉得还是稍微有一点点的遗憾,哪呢?整个演讲的过程中我们还是非常遗憾地听到了手机的铃声,所以我真的希望下半场的演讲过程中,亲爱的朋友能够将自己的手机打成静音或者是震动的状态,这是对朗教授最好的尊重,在朗教授走之后我说了一句话,朗教授可能没有听到,现在朗教授已经坐在了自己的座位上,朗教授说他从来没有犯过错此外,但是我说他只犯过一个错误,就是你来烟台太晚了,如果你早来烟台一年的话,至少我估计我的两个月辛辛苦苦攒下来的钱,还是两年的钱不会变成两个月,指出来我的错误,但是朗教授知道各位都套牢,但是各位和我一样,都找到了继续下去的信心,到底朗教授会让我们的信心百倍增强,我们让我们彻底的绝望,让我们一起来聆听。再次掌声有请朗教授! 朗教授:其实这也不是我的错,是阳光100的错,你们怎不早点叫我过来,我们两个人都没有错,搞了半天,刚才主持人给了我很大的压力,他说下半场的演讲,能不能为各位指出一条解套的方案,我不知道怎么解套,我的水平不够,说不定我越讲越绝望都可能,你们还敢听吗? 我前面讲到现在,还没有谈到次贷危机,也就是说告诉各位,就算没有次贷危机,我们中国经济发展也是这样的结果,所以,我们的问题比欧洲、比英国要严重得多得多。我们不但有二元经济所导致的民营经济的全面箫条,我们还有不可知的未来金融海啸的冲击。那么当然这个所谓的美国的次贷危机已经造成了很大的影响,可是我相信很多来宾,对于次贷危机为什么会发生以及它的冲击有多大?如何在我前面演讲的基础上更进一步阐述我的观点。那么最近我看了很多媒体的报道讲的不太正确,也想透过这个场合告诉大家到底资本主义出了什么问题? 以前在美国做房屋贷款是这样做的,这帮人在做,这些人并不是信用卓著,通过一些中介,负责帮银行收集资料做第一关的审核,那么中介把资料交给银行。银行在做第二次的审核,通过以后,银行把钱直接放贷给借款人,银行比如说借出一百万,银行就少了一百万,为了让资金充裕,就把一百万的债权卖给你,你们说熟悉的房地美跟房利美,就把一百万切成一千块,一千块一张的债券卖给全世界包括中国go-vern-ment,卖的三千七百亿,总共差不多5万亿,这个过程本来是非常好的,信用卓著的借款人把资料给银行,银行通过把钱借给借款人,再把债券转给房利美,再切给1000块的债券卖给大众,所以银行不缺资金,房利美拿回一百万,最后的债权全部由社会所承担,这个社会是广义的社会,包括中国go-vern-ment包括欧洲社会包括美国的大众,这是一条非常完美的链条。 可是,这么多年来,美国华尔街的贪婪,让这条链条彻底的变质,怎么变质?第一发明的次贷,次级贷就是允许财务报表不好的人,收入所得不够的人,信用不够的人依然可以买房子,如何透过第一道中介呢,就开始很像我们的银行,开始造假,学坏很快,学好不容易,拿一些假资料,我们做的很多了,骗银行我们骗多了,造一些假的资料,拿去忽悠你,银行所有的分析根据假的资料,所以通过审核把钱借给了借款人,银行拿这些有问题的次级债卖给房利美,他们根据这些一百万的次级债,切给一千块的债券卖给大众,中介为什么会造价,就是资本主义赖以为生的信托责任,在华尔街的贪婪下荡然无存。信托责任才是资本主义的灵魂,当中介机构一旦缺乏信托责任的下场就是整个链条被污染,只要借款人还不起债,银行债券就是差了,银行把差的债权卖给房利美,他们又发行债券卖给大众,会使得房利美还不起债。因此,造成破产现象。 现在美国go-vern-ment在做什么呢,直接进来救助房利美的银行,他们基本上都是受害者,直接拿钱帮他们付利息,否则后果不堪设想,各位听懂了吗?所以次贷危机的真正原因来自信托责任的破产。你们千万不要小看这次危机,因为除了次贷危机以外我发现美国还有万亿的次次债,比如说卖热狗的、viper的,这些人他们也可以买房子,这些人叫做次次贷也可以透过无聊的中介机构伪造一大堆的财务报表卖给银行,银行卖给房利美,这个是做爆炸呢?两年以后,所以美国go-vern-ment透过7 千亿的目的就是修补这个次次贷带来的污染,解救房利美。 但是各位请注意,这个影响太大了因为几万亿出去的,包括美国的AIG就是美国的国际保险公司,这个影响已经是危及全世界,而且更可怕的是这么多年来,为什么中国的经济成长这么健康?为什么中国这么严重的产能过剩,虽然是牺牲了环境、资源、劳动者的情况下,大量的产能过剩为什么还能存在,为什么经济不崩溃,原因是以美国为首的西方经济他们负债消化这些产品,也就是高度的负债,所有的美国人都在借钱,美国公司美国go-vern-ment都在借钱,然后大量印发钞票,购买我们中国出口制造业的产品。只要美国这链条一断裂,美国人不再购买产品以后,中国过剩的产能危机立刻爆炸,为什么没有爆炸呢?就是美国人不断借款,购买我们的产品。 但是,不断地借款不断借款没有关系,只要你的借款的品质是好的就没有问题,比如像以前信用良好的借款者借款没有问题,问题是今天链条被污染了,所以高负债的情况下,一个被污染的链条,立刻产生重大危机,你们听我讲到这里,就应该要干什么?如果这个负债的链条,防火墙挡不住的话,下一步结果是什么?你想想,也就是美国赖以生存的、以负债为主的大量购买中国产品的做法将立刻破产。好了,如果美国人不再购买我们的产品,我们这么多的产能过剩怎么办?请你们在座的各位来宾你们来回答我一下,我们的消费只有30%,我们根本买不起,我们买不了这么多的产品,只要美国人因为经济危机不买的话,我们生产过剩的现象立刻爆炸。 我在这个时刻我根本就不想讲粉饰太平,我也不想取悦领导,因为我是真正爱国的,只有把这句话讲清楚。(掌声)只有尽早告诉go-vern-ment它才能有英明对策,来宾们,你们都听懂了吗?中国产能过剩的问题,因为全球的高负债得到的缓解,他们买了我们的产品。只要我前面讲的防火墙一旦破裂,老百姓的信心一旦丧失,不再以负债的方式购买了,那么我们所面临的是企业的大量倒闭,我都不敢想。这一刻我比谁都紧张,我一直观察美国go-vern-ment能不能成功救市,因为美国go-vern-ment一旦失败你可不要做地上官,你可不要嘲笑美国 go-vern-ment部门,我们中国将付出惨重的代价。由于我看得比谁都早,看得比谁都明白,我到两点才睡,不断打电话到美国询问最新的情况是怎样?我得到的都是最新的讯息。不过告诉各位,我已经有了一些最新的讯息。我今天发现,美国的援助力不够,七千亿可能不够,你知道七千亿是什么概念吗?美国老百姓每一个人为此付出了接近3千美元。可是我认为,还是不够的。所以上周,美国股市跌了20%多,这是从包括1929年那次股灾,同样大的跌幅。你知道这意味着什么意义吗?可能大家没有这样的敏感度,我担心的是 1929年之后的经济大风波。 我现在希望,英国go- vern-ment也开始救市,你知道发生什么事吗?为什么救市不成功?而且上个礼拜全世界几大国家联合行动救市,同时注资,同时降低利率,各位记得吗,可是最后结果是失败的,你知道为什么失败吗?因为,每一家金融机构拿到救助款之后,而且是利息非常低的救助款之后,他把钱压在手里,都在怕,借给你不还给我怎么办?我对银行没有什么信心,所以也不借给银行,所以go-vern-ment给我的流动资金,我压在银行里,既不给企业短期融资也不给银行,我全部压在手上,如果银行都不拆借的话,我们全世界的短期融资怎么办?你怎么买原材料怎么发工资,你要靠短期融资,银行如果缺短期债的话,是无法生存的,否则资金会陷入周转不灵。 目前的现状是怎样的?银行系统虽然接收了go-vern-ment的救助,但是由于根本的问题解决不了,大家不敢从事短期借贷,下一步就是美国的制造业、美国的企业、美国的服务业拿不到短期融资而全线崩溃。美国银行业会由于银行之间不准拆借、周转不灵,造成更多的现状。为什么这些银行不借?虽然拿到这么多钱的救助为什么不借?因为信心丧失,什么信心丧失?对于资本主义的信心丧失,我讲这句话有点可笑,你千万不要笑。 最近欧洲go-vern-ment包括冰岛,已经开始把金融机构国有化,为什么?因为银行信用已经破产,大家都不相信银行,甚至连银行也不相信银行,银行拿到钱也不拆借企业,免得你们拿钱跑了。所以银行信用本身已经没有办法让系统运作了,因为银行信用不够了到最后逼迫英国go-vern-ment、欧洲go-vern-ment以国家力量收购银行变成我们痛恨的国有企业。你知道为什么这样做吗?因为以国家的信用担保,我保证还你钱,你只要以国家的信用担保,这家金融机构一定还钱,别的银行就会借钱给他,各位听懂了没有?在我们民营化的时候,你发现全世界国有化,为什么国有化,就是重新利用go-vern-ment的信用,给这个经济体系打下长期定数,你们放心的去借吧?go-vern-ment为你们撑腰,不但为银行撑腰,把银行收归国有,同时由go-vern-ment印钞票向企业融资,你把你的票据卖给go-vern-ment,go- vern-ment拿钱买你的短期融资的票据,让你发行,购买原材料,因此今天整个信用体系,破产的是各国go-vern-ment出面实行全球的国有化,什么目的?重新向这个腐败不堪的金融机构注入最后一股go-vern-ment信用。透过go-vern-ment信用,透过go-vern- ment的钱直接拆借给银行,透过go-vern-ment的钱直接购买企业的短期票据,让企业拿到短期融资发薪水、买原材料。美国go-vern- ment还没有这样做。他们看在眼里,心很急。因为如果你不学习欧洲go-vern-ment的话,没有go-vern-ment信用在里面,整个金融体系会因信息不足而全面崩溃。 这是今天上午得到的最新消息,我一直在想这个事怎么讲,我讲的是最前沿的,美国go- vern-ment也在考虑要不要把美国金融机构变成国营企业呢,这和美国go-vern-ment的民营理念有悖不太愿意这样做,但是如果不这样做的,你的七千亿美救市计划很难成功,因为大家的信心丧失,我相信你们想问我一句话,你们问我说,朗教授go-vern-ment信用是不是最后一步?你们想不想问这句话?对的,这是最后一步了。如果问我下面一句话,如果go-vern-ment信用也不行呢,完了。那完了,没有别的办法了。我都不想演讲下去了。 走到这一步,整个金融体系的问题,会使得各国无力再以负债的方式成长,因此,就不会再以负债的方式购买我们产能过剩所制造的产品,听懂了吗?下一步就是什么呢?所以说中国不可能幸免于难,我也请各位来宾密切注意这几天的发展,你们要随时随地按照我今天告诉你们的思路注意观察一下,你会发现今天两点开始,欧洲各国go-vern-ment甚至我怀疑美国go-vern-ment要大量实行全面国有化。否则,无法注入最后一道强心剂。因为资本主义的信心完全崩溃,信用体系完全崩溃。 你看我讲到这里,大家鸦雀无声了,你们才知道事态的严重。竟然还有无聊学者胡说八道说明天会更好,大家放心。是看不懂呢,还是怎么回事儿?刚才主持人问我如何解套,我不知道,我没有这个能力解套,因为我发现美国go-vern-ment也解不了套,郎咸平什么东西,还问我:朗教授,我们该做什么投资,你疯了,我昨天早上到今天中午很多企业家问我,我们应该投资什么行业,我一开始告诉你,你疯了,我当时讲你疯了,你可能觉得我在开玩笑,我讲到现在这样说你该理解了吧? 你晓不晓得什么危机在你面前,全世界各国的go-vern-ment现在已经拟定了三个方针:第一个方针,就是go-vern-ment出面协助各个金融机构的负债问题渡过难关。第二个问题,充足各个金融的资本,如果还不行,第三个,充足国有化,如果还不行有没有第四个,到这一天,防火墙会正式爆破,如果国有化解决不了问题,防火墙宣告爆破,我讲的工商链条多米诺骨牌效应将一发而不可收拾,中国经济发展靠出口创汇,基本是依靠过剩的产能发展。都听懂了吗? 当然了这个事件,未来是怎么走势我也无法预测。其实他们也是走一步算一步,以美国为首的西方国家作梦也没有想到连go-vern-ment注入几千亿资金的结果还是无法救市。因为,源自于企业的信念还是过窄,逼迫go-vern-ment出来用go- vern-ment力量帮助银行完成短期拆借,帮助企业完成短期拆借,帮助他们继续生存下去。现在各国go-vern-ment正在用go-vern- ment的力量协助银行进行短期拆借,利用go-vern-ment的力量协助企业进行短期融资,以维持一个正常的营运,而不要说发展。 你们听完我的演讲之后,以后再听到学者有任何乐观的呼吁你不要听了,你心里要做准备,没有人希望最坏的情况发生,我告诉各位来宾,我第一个做的演讲是跟次贷危机完全无关的中国经济问题。如果你们已经觉得日子很难过了,那么我第二个阶段的演讲将带来海啸般的冲击,我现在随时随地密切观察欧美各国能否有效斩断工商链条,中国的出口制造业就是工商链条的重要环节。 这也是为什么在第一场演讲完成以后,我告诉你们少投资,最少不要投资,减少负债,准备过冬。而且,像美国的财政部长鲍尔森以及美国的中央银行行长波兰克这些都是赫赫有名的人物,像波兰克这个人是1970年代的博士学者,我是1980年代毕业的经济学家,那个时代毕业的学者跟我们这个时代不一样,哪个时代的学者对于经济大恐慌本身研究得非常到位,不像我们 80年代的学者是非常单纯的一批人,迷信市场的人基本上都是这批人,70年代的学家有非常强的go-vern-ment道德责任感,当时波兰克也就是美国中央银行的主席,他的博士论文就是 1929年经济大恐慌,他说当时美国之所以发生经济大恐慌就是因为没有设立防火墙。 中国的企业、中国的制造业,在大海啸没有冲击之前为什么这样的不抗压,各位想想?所以我前面说了,第一,汇率的上升,第二成本的上升,第三劳动合同法,第四宏观调控,这四件事情和我现在讲的第五件事情相比它们的力量是非常小的,也就是在汇率、成本、劳合同法以及宏观调控的冲击下,我国制造业如此不抗压,为什么?这四项冲击远远比不上我刚才讲的大海啸。就算这四项小冲击,我们的制造业也抗不住,30%的企业倒闭,甚至到了年底有可能超过50%,我希望不会,go-vern-ment应该出来救企业,我诚恳地希望不会到50%,但是请问这四项冲击为什么我们企业抗不住?因为,我们和欧美各国的企业相比,我们有一个天生的缺陷,那就是我们引以为傲的制造业大国误导了我们的go-vern-ment部门,你真的以为我们是制造业大国吗?你在媒体上所看到的都是什么样的?都是错的,你真的这样认为吗?真正的制造业大国是美国,才不是中国呢,我们是自己感觉良好。那么我们中国制造业目前在什么环境之下呢?我给你讲一句最形象的话,中国经济发展到最后中国取得了 GDP,美国取得了利润,也就是说我们制造业的格局就是创造的GDP,最后的利润全部被美国席卷,这句话什么意思,为什么我们这么不抗压,因为我们的制造业不但破坏环境、浪费资源,而且是整条产业链中价值最低的过程。 我以芭比娃娃为例,我们广东东莞所生产的芭比娃娃卖到美国是9.9美元一个,接近10美元,请问10美元减掉1美元的9美元是如何创造出来的?那就是美国企业的灵魂,它透过6大块所创造出来,包括产品设计、原料采购、仓储运输、定单处理、批发经营、终端零售,创造出了9美元的产值,6大块加上中国一块的制造,叫做六加一的整个流程就是产业链,我们这么多年的经济成长,我们取得了整条产业链的“一”,而欧美各国掌控了整条产业链的“六”,这个价值是怎么回事儿?我们的制造业者在破坏环境、浪费资源、剥削劳工的基础上,我们每创造出一百万美元的产值,我们同时替美国创造出九百万美元的产值,我们辛辛苦苦创造出一亿美国的产值,我们同时替美国创造出9亿美元的产值。因此,中国越制造,美国越富裕,美国席卷了90%的价值。 那么这一种生产模式叫做国际分工。而中国被分到了最差的一项,破坏环境、浪费资源、剥削劳工。我们现在常常以1.8万亿感到扬扬得意,你晓不晓得我们怎样创造出这样的成绩?我们掌控着10%的价值,我们创造出1.8万亿美元的外汇,也就是1.8万亿除以10%等于18万亿,也就是我们出口制造业替全世界创造出18万亿的产值,我们只分到了1.8,其他的都是欧美的,你知道18万亿是什么概念呢?那就是在座的各位来宾和全中国的工人80年所加起来的工资的总和,这就是18万亿被国际分工席卷。 所以我常讲,今天西方帝国主义对中国的掠夺和19世纪免费掠夺非洲差不多,当时非洲是0%,现在中国拿10%,在我看来没有什么差别,至少非洲没有环境污染等的问题,我们的10%伴随着污染环境,浪费的资源以及被剥削的劳工,由于你是处在产业链的最底端。因此你特别抗压,因为真正掌控定价权的是整个产业链的六,一是不掌控定价权,所以你能不能想象,欧美各国尤其是以美国为首的欧美国家,不但席卷的90%的利益,而且掌控着我们的定价权,我们不掌控。这就是为什么,创造了汇率,成本、劳动合同法以及宏观调控之后我们的企业必须全力承担这些成本,因为我们不掌控定价权,我们无法提升售价,各位都懂了吗?这就是为什么我说的投资营销环境急速恶化,因为你不掌控定价权。 到最后的结果,大家不想干了,不想干的结果就像你们一样炒股去了,还被套牢了,想想这都是错的,你看,美国,掌控着定价权,透过6+1的6席卷了90%的产值,这种情况,他们竟然发生了次贷危机,你能不能想象他们的防火墙一旦破裂以后,洪水将席卷90%的产值,想到了没有?我前面跟大家讲的就是说防火墙破裂之后会影响到这个行业、这个行业,现在我把这个数字告诉你,美国防火墙破裂的结果冲击到以美国为首的90%的产值。然后再冲击到中国的10%的产值。 我就是把第二段演讲的前半段全部给你量化。因此,美国、欧洲的做法三步骤:第一保护银行的债权,第二保护银行资本金,第三全部国有化,如果能够斩断工商链条的话,美国所创造的90%才能保存住。如果抗不住的话,全部席卷90%,只要冲击90%,就同时冲击我们的10%。所以现在已经不是一个金融危机的问题了。各位来宾都听懂了吗? 那你可能问我了。那样我们这么多年的产业政策没有想到这个吗?我告诉你没有。我们这么多年的产业政策呼吁企业利用我们的廉价劳动力、呼吁企业品牌升级、呼吁企业产业升级,没错吧?我告诉你,都是错的,因为真正的竞争力来源于6+1的高效整合,我们应该用go-vern-ment的力量让我们的企业做成6+1的高效整合才能掌控定价权。只有掌控定价权我们才有生存的机会。 可是目前我们的制造业是大量的倒闭。那么请各位来宾想 一想。像郎咸平这种水平都会看得明白的事,你们认为美国go-vern-ment看不明白吗?你相不相信,美国go-vern-ment的要员比我聪明得多得多,我已经够聪明得了,他们比我还聪明,当然你不一定相信,你说朗教授谦虚了,今天这个年头还能自认为自己不足的人太少了,中国人牛人太多,不知道还不行了,连我这种水平的人我都看得这么清楚,何况美国。 这位女士说对了大量热钱进入中国,大量收购中国的制造业,为什么?中国的制造业1,美国的产业链是6,6不能没有“1”啊,听懂了没有?如果1崩溃的话,“6”也一定会崩溃,“6”一定有“1”做基础,才能发展,如果我们不生产芭比娃娃卖给美国,它怎么能创造出6的产值呢?我再一次告诉我们的地方go-vern-ment你们必须救自己。“1”最重要了。因为我们的“1”正在被大量的收购,我觉得这位来宾比我聪明,他已经把我结论讲的差不多了。 中国进出口总额的 55%都是外资,中国高科技出口的87%是外资,中国的汽车高端零配件90%是外资,中国你们吃的粮油85%是外资,中国山东、河北的几个粮食局已经被外资收购了,知道吗?中国的养猪的产业链某条产业链被收购了。这就是今天你所面临的格局,你知道这些数据吗?你可能都不知道,为什么不知道,因为你们从来不介意,我今天演讲的时间特别长,我已经把这些全部讲了,我们就算保有6+1的“1”,而且产值这么低的而且还是大量被收购的情况下,次贷危机的冲击还没有开始。 可是这些现象的原因就是中国的经济成长是靠着推动GDP所拉动,就是30%的部门透过钢筋水泥拉动的成长,70%都是过冷的制造业,这种特殊的二元经济 30%过热,70%过冷。经过了汇率、成本、劳动合同法以及宏观调控的冲击之下,过冷的制造业更冷,所面临的投资环境更加恶化。而过热的地方go- vern-ment过热,我记得上一次去山西,有的人说你看我们的山西最近发展很好,我说中国的哪个地方发展不好,哪个官员一上任也是搞建设,推动GDP 的工程建设,透过30%拉动 GDP这就是各级go-vern-ment做的事。越这样做,越多的资源流入过热的部门,过冷的制造业为什么这么不抗压?原因就是我们已经进入到了一个前所未有的产业链的暂停时代。以美国为首的欧美国家控制着整条产业链的“6”的,我们在破坏环境、浪费资源、剥削劳动的基础上我们创造的“1”,更严重的是这样使得我国的制造业产生严重的生产过剩现象,而这个生产过剩现象透过美国这么多年的负债增长的形势全部被它吸收了,所以我们看起来是表面的繁荣,我们这么多的产品好像是更富裕了,那个制造,你已经跟次贷危机牢牢挂钩了,因为购买你产品的原因就是负债,我们是靠美国的负债支撑起我们的出口制造业使得我们过剩的产能透过美国消化掉, 但是美国的次贷危机使得美国高负债的时代即将终结,你可以相信我。未来一定是负债比例大幅降低,因此对于中国产品的需求必定大幅降低,所以中国产能过剩的现实情况将会曝露无疑,这个时刻就是次贷危机防火墙爆炸的时候,不但冲击了美国所能够掌控的90%的产值,同时冲击到中国只有10%的产值的过剩的出口制造业,产能过剩的制造业。 下一步是什么呢?我也不想讲了,因为你已经听懂了多米诺骨牌效应,下一步是什么呢?再下一步是什么呢?会形成一个恶性循环。大家怎么都不吭气了,其实你们今天不应该来听我的演讲,不听的时候,模模糊糊过得挺好的,国家有吃有喝的,过得挺好的,一旦听懂以后再也睡不着了,相不相信我,你们每天晚上今天晚上都会看凤凰卫视,看美国的次贷危机,国有化会不会成功,一旦失败,朗教授告诉我们的最后一招,一旦国有化失败全盘崩溃,回去不要老是看《汉武大帝》什么的连续剧了,回去看看美国的国有化会不会成功。 主持人:朗教授的演讲到这里就结束了,接下来的时间就是我们在场的来宾向我们朗教授提问的时间,首先有请我们舞台左侧的朋友提问。 搜房网:朗教授你好,我是搜房网的网友提问一个非常实际的问题,就说在当前的情况下,如何能让自己日子保持得好一点,甚至过得更好一点。 朗教授:过得更好一点不可能的,不要过得更坏就不错了,我建议各位网友各位来宾,注意在这个时刻千万不要想赚多少钱,能够少赔多少钱是真的。这是我告诉你们的,如果你们想买外币保值的话,一定要买最保守外币,什么目的呢?不赚钱,也就是你买欧元一定要买等量的美元,保证不赚钱,也保证不亏钱,这是我给网友的建议。 提问:我是烟台日报的传媒记者,我问一下,今天总体感觉世界一片黑暗,我们改革开放30年,次贷危机来了以后,会不会是辛辛苦苦30年,会不会一夜回到改革前。 朗教授:这个问题问得太好了,这个不是我造成的该黑暗就是黑暗,该乐观就是乐观,为什么你们来听我的演讲,为什么大家欢迎听我的演讲,我是讲实话的,有良知的学者我不想骗你们,如果你认为是悲观就是悲观,但是事实只有一个,我今天给你讲的是事实,只要你要怎么做,千万不要问我,该不该炒股,这个我是不回答的,你只要了解了我讲的所有故事,该有的事你自己做判断。 提问:我记得第一次听您的课是在北京,当时给我印象最深的是在北京,出了三个,你错了,你错了,你还是错了,今天听得比较多的是你疯了,包括今天的主题,当时不是说您,我想说的是,因为在座可能更多的是我们的民营企业,包括房地产的一些行业,如果您是生在烟台,在这个企业之中,根据你的大的形势恩,我觉得还是有机会,你刚才也提到乱世出英豪,我想提两个比较简单的,企业能否自救,下一步问题是如何自救。谢谢。 朗教授:你的问题问得非常好,我想这样回答你,烟台,所受到的冲击远远小于广东、江浙。尤其是你们房地产价格是这个价位之下的话,你们所受到冲击也会远远小于温州等地,如果冲击不这么大的的话,制造业本身需要烟台市go-vern-ment的大力救助。那么,我这个时刻,我认为一个比较有效的短期的办法,是我们的制造业目前千万谨慎小心,不要随意扩张产能,维持现状,继续改进你的效率,降低成本,同时更重要的是烟台的民营企业需要go-vern-ment大力的救助,因为一切财富的基本来源来源于企业,一定是企业赚钱了,才会给员工更多的薪水,只有员工拿到更多的薪水,烟台才会更繁荣,大家不要只看GDP,如果烟台只是少数几个城市,首先放弃GDP 的理念,着重企业的利润的话,你就能排在名列前茅,就能更容易渡过难关,不要只看GDP,GDP不重要,go-vern-ment能够把资源移到对企业的直接救助方面,这就是对企业最大的帮助,也就是对烟台市最好的建设,这个需要一个思维的转变,什么转变呢?你不要认为救助制造业是违反市场化行为,你想想我今天的演讲,国有化是目前全世界的潮流,我们如果能够未雨绸缪,透过go-vern-ment的力量援助制造业渡过难关,将来烟台市一定能够更快上一个台阶。各位理解我意思吧? 提问:最近我们注意到十七届三中全会正在召开,好象是经过这样一个磨难以后,我们才认识到以前所谓的出口消费三辆马车的次序应该改改,改成拉动内需在前面,我们想听听朗教授对十七届三中全会的精神,怎样可以走出困境。谢谢。 朗教授:大方向我们肯定是赞同的,但是你是提的什么内需?千万不要把国家的有限资源又拉到以GDP为主的资源,我们资源的是有限的,不要为了提升我们的 GDP又去大量建公路、桥梁又搞这个,最后是什么下场呢?就是把制造业的谨慎的资金投入到过热的部门,使得我们制造业更难,提升内需就是我们go- vern-ment要学习欧美各国的做法,将大量资源投入到与民生相关的制造业跟服务业上,这才是我们未来该走的路,我认为最迫切的做法是利用go- vern-ment的力量协助制造业从过热的部门转入过冷的部门,帮助制造业渡过难关。因为山东讲的是原则性的问题,我建议一个原则性的方法来回答你,我认为这是解决目前难题的方法,至于次贷危机的危机,我们没有办法,我们只能是坐以待毙。 提问:目前很多的专家学者都在讲目前的经济状况下中国经济转型的很好的机会。 朗教授:这是胡说八道。这些家伙站着说话不腰疼,不懂中国的经济,中国90%的制造业根本不可能转型,要转型就是破产,做陶瓷做肉干什么的的怎么可能转型,不在于转型而再在六加一,如果高价收购养猪行业有没有让养猪转型,那么多的外资收购我们粮油有没有改成高科技,他们收购粮油、都在做六加一的产业链的高效整合,我们传统行业没有错,升级是错的。你忘了养猪往哪里升?你讲,粮油怎么升级?要做什么呢?就在做这些公司收购我们传统制造业之后做的就是六加一高效整合而不是产业升级,理解我的意思吗? 提问:中央在十七届三中全会提出经济有些扭转,如果将来有失去土地的农民会不会造成严重的社会问题。 朗教授:我知道你要问的是什么,我不想说的,你要想到,一句话,如果我国的制造业产能过剩的制造业一旦受到金融海啸的冲击之后你想到下一步是什么?大量的失业,你只能是吸收农村人口,别的话我不讲了。 提问:你一再强调国有化,我想问一下国有化和私有化的问题。 朗教授:她问的问题是我们这么多年的改革是反潮流的,别人忙着退市我们忙着上市,这是一个学习的过程,并不是说四年来都在国有化,全世界的金融机构都是私营的多,上市的多,这是为什么我们国家也走上这条路,只是今年的这两个礼拜开始变成国有化,我也相信这次演讲以后我们go-vern-ment会有深刻的认识,重新做一个思考私有化不是目的,目的是如何保护金融体系的问题,私有化也好,国有化也好都不是问题,只要保持稳定才是最大的前提,我们过去的私有化是有问题,我们是以私有化而私有化,我们未来要为了维持金融稳定而实行国有化或者是私有化。欧美国家为什么要国有化并不是变成社会主义,他们注入最后一剂强心剂,就是提升信心,国有化不是目的,所以大家不要搞错了不要认为欧美在国有化。我们就呼吁go-vern-ment国有化,我们今天呼吁go- vern-ment一定要在维持金融稳定的前提下,产生各种有益的方案,达成金融稳定,维护老百姓的信心,目前欧美是国有化,中国最重要的是维持老百姓的信心,我们中国也要做这样的事,维持老百姓的信心,至于怎样做也是更要考虑的问题,理解我的问题吗? 提问:在现在的经济环境作为经济学家与我们普通老百姓提一点建议,现在的情况下,投资房产还是比较保值的吗? 朗教授:房地产我这样讲好了,以亚洲各国为例,包括香港台湾韩国为例,房地产在足够长的时间下,包括十年到二十年以上,相对而言比股票市场更能够保值,这样波动是有的。我们现在会走上低谷也会,只要经济持续增长,情况会有所转换。你这样问的话,我相信回答是比较简单的,以台湾为例,台湾很富裕,原因和台湾老百姓都喜欢购买房屋有关系。举个例子,我们观察到广东的倒闭的企业会不会到台北,130亿美金,投入到台北干什么?买房子。陈水扁住的特区有一半是广东的台商买,有这种习惯,为什么这样的习惯呢?是台湾人致富的方法就是靠房地产。 提问:你好,朗教授,我只是一个高二的学生,所以我的问题可能过于浅显,请您多多包涵,我想问的第一个问题,你很有自信,而且你也很高的预见性,你今天分析的是我们现在所处的环境是多么灰暗,我想你为什么不分析为什么会这样分析,为什么不从美国的整个经济体系的建立过程中,从一战开始整个资本主义的经济体系是怎样建立的,为什么不从根源上探讨? 朗教授:应该从资本主义的本质开始,但是今天的时间不够。 提问:第二个问题我想问一下,前一段有学者说我们当下是处在人口红利期,我们今天知道这个说法是错误的,当我们大学毕业以后,我们面临的问题将会更多,我们将面临我们的爸爸妈妈爷爷奶奶将要全部靠我们养活,以及到时候考大学将会更难,研究生会更多,以及就业问题,我们现在应该做怎样的准备,才能在将来更好解决我们的人生,更好渡过我们的人生坎坷。 朗教授:你请坐,非常好,这位女同学,你高二是不是?你能问这么深刻的问题,我们对我们的下一代感到骄傲,我非常重视年轻人的问题,我才站起来回答你。因为她问的问题很深刻,我也希望我今天给你的回答能够改变你的一生,改变你的子女的一生,我非常严肃地站在这里,把你的两个问题做一个仔细的回答。我告诉各位我们的民族,我们这么多的年轻人都在学什么?讲一句难听的话,我们大学教育本身就是在摧残创造力。我们在干什么,我们在培养解题高手,像你有这种思路的女孩,甚至老师不会喜欢你,我必须以对你的重视表达我对教育的立场。我们中国的教育目的是在干什么,目的就是在训练你成为解题高手,我告诉你A我期待你讲 B,我告诉你C我期待你讲D,这么多年来,不要说朗教授的答案争议性很大,可是我们的大学教育没有培养学生这种能力,没有学生认为说这一切搞的都是错的,为什么今天一开始我们告诉你我们的媒体做的都是错的,我告诉你我们要否定A,你问的问题都是错的,我凭什么按照你的意愿回答B,到最后大家认为我可能是一个低端,偏激,甚至是争议性大,到最后发现原来思考的问题本身就是错误的,也就是说这种错误并不是一个学者专家的错误而是整个教育体系出了严重的错误,你们的子女只要在读完本科的结果就会是这样的结果,你告诉他A就是A,不会怀疑A是错的或者是C的错的,各位理解我的意思吗?我希望每位父母把我的话带回去给你的子女,怀疑告诉你的一切都是错的,只有这样才会培养你独立思考的创造力理解我意思吗?你问的我的第一个问题为什么这样重要,为什么按照我的思路讲,为什么不从y来讲,比如谈谈的原则,起源说不定这些才跟我们讲的有关,我可以讲,我在别的场合也说过,我讲了一句话,这是整个欧美国家对于整个资本主义的失望,这个话回答了你的问题,我从19世纪开始讲,我开玩笑说没有时间,但是我鼓励你这种说法,你高二学生没有听周杰伦的演唱会,你跑来听朗教授的演讲,这点我给里最高的崇敬。 看到高中生一追逐明星我就不舒服,我可能是嫉妒吧,这句话我也送给各位家长,为什么中国科技大的少年班是失败的,因为他们选拔的尖子学生根本不是天才是解题高手,这就是为什么他们培养不出真正的天才,真正的天才要像你这样问问题才能成为天才,永远怀疑A。第二个问题问得非常好,我把她的问题重复一遍等她长大以后,等她毕业以后,她的曾祖父增父母搞不好没有死,曾祖母、爸爸妈妈,结婚以后对方的一家人他们两口子养这么多的老前辈,哪个时候怎么办?最糟糕的是什么你辛辛苦苦考完了大学以后,大学一毕业保证失业,养也养不起,如果这样发展的话,中国十年二十年会成为最贫穷的国家,像我们这样的老人很多了,像他这样的也是,万一她找不到事怎么办?各位来宾有没有想到这个的严重性?她找不到事怎么办?我告诉你,为什么我要站起来回答你的问题,你已经帮我们所有的大学生问了朗教授一句话,我们为什么找不到事,我们连奉养父母的能力没有,我们为什么找不到事,因为产业政策都是错的,美国大学生比例这么高,我们如何搞教改,我们搞教改的原因是我们看到的美国的大学生这么多,我们误认为如果我们同样生产这么多的大学生就可以透过人力资本扩张像美国那样富裕,因为我们到处都是大学,最后发现今年培养出580万大专生,大部分找不到事。为什么?我有孙子了,我很关心这个事,我告诉你原因,那就是因为,真正需要大学生的是整条产业链中的“六 ”制造业这个“一”是不需要大学生的。理解了吗?那么你们问我了,难道搞教改的人不知道吗?我告诉你他就是不知道。他完全不知道美国多学生比例这么高的原因,是因为他们掌控着整个产业链的“六”,而我们掌控的是“一”,制造业本身不太需要大学生,因此烟台很多的工厂从董事长到保安没有一个大学生,有些工厂不是所有的啊,因为制造业不需要大学生,产品设计、零售规划、仓储物流这个需要大学生,可是我们都不掌控。都由谁掌控呢?由欧美各国掌控着。 这样一来的话,你会知道为什么中国长此下去会成为最贫穷的国家,因为我们掌控了价值链中最不重要的一个环节,因为掌控了6+1之后的“1”之后,带来的必然结果就是给你们一个最差的自然资源,挖光、用光的自然环境以及剥削的劳工给你们了,我们这一代是最对不起下一代了。这是我为什么站起来回答你的问题。 主持人:我相信今天朗教授精彩的演讲给留下了深刻的印象,接下来,让我们站起来以最热烈的掌声欢送朗教授、感谢朗教授! October 16 读写锁的OO分析
读写锁的本意是分别对读写状态进行互斥区分,有互斥时才加锁,否则放行.互斥的情况有: 我们只要让锁对象知道当前读写状态就可以了,再根据情况进行锁定和解锁,然后再分情况进行锁定.请看代码 代码如下: import java.util.ArrayList; /** *//** private ReadWriteLock lock; public DataLib() { // 写入数据,这时不能读取 // 读取数据,这时不能写入 } } /** *//** Writer类: import java.util.ArrayList; /** *//** Reader类: import java.util.List; /** *//** 测试类: /** *//** June 30 宝宝有名字了玉斗三台步紫宸.青云万里见前程
宝宝今天终于有名字了, 而且登记注册在北京市的户口档案里了. 名为紫宸. 今天领了出生证明上了户口, 现在总算轻松下来了. 宝宝的身份证号码也分配了, 由于取名太晚了, 所以排到500号之后了, 看来和宝宝同天生日的还不少, 既然没赶到开头, 收收尾也可以, 至少证明了在北京有250多个男宝宝和我的宝宝同一天生日.
幸运的中了一个Ipod nano.周五突然接到一个电话说我中奖了. 哈哈, 还以为是有人开玩笑, 但怎么听也觉得不像假的, 有时间有地点还是当面领奖, 而且是在知名的办公楼里.去看看吧, 周六冒着零星小雨来到了华腾大厦, 和门卫打听了一下, 还真的有这家公司, doubleA, 上去一看, 果然有一间办公室开着,doubleA是复印纸,我说怎么这么眼熟啊, 还有几个人正在那里等着, 看见我就问是不是来领奖的,带没带身份证, 然后就是恭喜我中了二等奖, 奖品就是这个Ipod Nano, 哈哈, 竟然是真的, 然后就是合影留念. 这一段运气还是不错的, 前一段时间是中行存折中奖, 这回是饮用水中奖. 宝宝可真是个大福宝宝,回家要好好的亲亲我的大宝宝.
-----------------------------------------------
查真伪,Double A & Robust领你中大奖 - 2008年3月24日至5月24日,凡饮用乐百氏桶装水,刮开盖侧防伪监督码贴涂层,获取16位防伪码,按指示查询产品真伪,即有机会赢取以下大奖: 一等奖: SONY DV 一台(5名) 二等奖: Ipod nano(4G)一台(30名) 三等奖: 100元超市购物券一张(500名) 四等奖: Double A (A4)复印纸一包(500张)(1000名) - 活动截止日期:2008年5月24日 - 查询真伪方法:凭乐百氏桶装水防伪监督码贴上的16位防伪码拨打电话/发送短讯至95001111,或登录www.95001111.com查询 - 查询后请保留乐百氏防伪监督码贴,中奖者将由电脑系统在查询号码中自动抽取 - 专人通知中奖者在指定时间到指定地点领取奖品 - 中奖者需持乐百氏防伪监督码贴、收缩膜和身份证到指定地点兑奖 November 28 竞猜,看看这段话来自何处,不许google原文:
行业内的人齐心合力,打造了一个好的氛围,我们给他不断的找平衡感。平衡感找到后开始谈生存危机,接下来提自信,最后提激情和欲望。在职场中,如果你是一名领导,对下属提激情提不起来,必须提自信,提自信的前提是先提危机意识。
(我的翻译:Team 要营建一个良好的工作环境, 要帮助新来的人寻找他能发挥能力的地方,之后我们要培养他的危机意识, 树立他的自信心,提高他的工作激情,当然也要满足他的合理需求. 我们需要让我们的成员充满激情的去工作,自信的去工作,自觉的去工作. 让他们感到他们的工作是有趣的,有意义的,而且也是帮助自己将来应付危机的最好选择. )。 September 26 time date 的output这个命令有一定的代表性。分析一下:
1. 其实这个命令要拆成两个命令看。一是time这个命令(这个time命令指的是bash的builtin命令),他有自己的stderr。还有就是date这个命令,它有自己的stdout. 2. time这个命令特殊的地方就是对命令的重定向无法在当前shell环境完成。可以试试 代码:
,无论怎么样,stderr都会显示。现在知道的唯一的方法是采用subshell的方式,让time在subshell生成stderr,然后在主shell来重定向操作。date命令输出方式是简单的。
3. 这个命令的执行顺序应该是:1. time执行并等待下一个命令结束。2. date执行并结束。3. time计算命令运行时间并结束. 3. 知道了原因,就可以对time date这个命令的重定向进行操作了。对date的输出进行操作可以在命令运行同时来完成, 或放到subshell来完成,或放到上层的主shell。而对time的stderr转stdout的操作就必须放在主shell来完成。这样的话我们可以重定向这样几种情况: 1. 只需要time的输出。 代码:
虽然结果一样,但是重定向的层和次序不一样。第一和第三中方式的重定向只单单的对date命令,根本不涉及对time的输出,同时重定向的层是一样的,但第二种重定向发生在命令运行的上层主shell,且是对time和date命令的共同输出做处理。第四种是利用了eval来将time和date作为整个命令一起执行,意义和第二种一样。
2. 只需要date的输出。 代码:
重定向都是在time和date的输出完成后执行的。
3。屏蔽所有输出。 代码:
第一种是在所有输出结束后整体屏蔽掉,后一种是先屏蔽date的输出,然后在屏蔽time的输出。
类似的,我们可以实现对不同的输出转入文件。 -----------------------------------
$cat 1.c #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> int main() { int fd; fd = open("/dev/tty",O_WRONLY); write(fd,"never blocked\n",14); } $gcc 1.c -o 1 $./1 &>/dev/null never blocked September 21 Javascript----文件操作一、功能实现核心:FileSystemObject 对象 September 20 FSO有关的属性和方法(FileSystemObject)方法或者属性 描述 实例说明 September 17 键盘驱动原理0 概述 我们将讨论 ps/2 键盘的驱动。主要讨论的内容有,ps/2 键盘的硬件,使用键盘驱动的应用层,键盘驱动的初始化,键盘驱动如何完成自己的工作,以及一些涉及到的相关内容。需要注意的是,以后我们提到的键盘,如果没有特殊说明,都是指 ps/2 键盘。 1 ps/2 键盘的硬件 要以写一个硬件的驱动为目的的话,需要对这个硬件有一定的了解,但并不需要太深入,只要对于写驱动足够就可以了。关于 ps/2 键盘的硬件知识,我们也是对讨论键盘驱动足够就可以了,一些对于驱动没有帮助的硬件实现的细节,我们不讨论。 1.1 ps/2 键盘硬件概述 对于驱动来说,和键盘相关的最重要的硬件是两个芯片。一个是 intel 8042 芯片,位于主板上,CPU 通过 IO 端口直接和这个芯片通信,获得按键的扫描码或者发送各种键盘命令。另一个是 intel 8048 芯片或者其兼容芯片,位于键盘中,这个芯片主要作用是从键盘的硬件中得到被按的键所产生的扫描码,与 i8042 通信,控制键盘本身。 当键盘上有键被按下时,i8048 直接获得键盘硬件产生的扫描码。i8048 也负责键盘本身的控制,比如点亮 LED 指示灯,熄灭 LED 指示灯。i8048 通过 ps/2 口和 i8042 通信,把得到的扫描码传送给 i8042。CPU 通过读写端口,可以直接把 i8042 中的数据读入到 CPU 的寄存器中,或者把 CPU 寄存器中的数据写入 i8042 中。ps/2 口一共有 6 个引脚,可以拔下 ps/2 插头看一下,这 6 个引脚分别为,时钟,数据,电源地,电源+5V,还有2 个引脚没有被用到。由于只有一个引脚传输数据,所以 ps/2 口上的数据传输是串行的。 下面几幅图是一个键盘的内部,可以看到用来产生扫描码的按键矩阵( Key Martix ),可以看到键盘中的芯片(这里不是i8048,是一个兼容的其他型号的芯片)。
注意,i8042 并不一定在主板上单独出现,可能被整合在某一芯片中。 1.2 扫描码 ,Make Code ,Break Code ,Typematic 当键盘上有键被按下,松开,按住,键盘将产生扫描码( Scan Code ),这些扫描码将被 i8048 直接得到。扫描码有两种,Make Code 和 Break Code。当一个键被按下或按住时产生的是 Make Code ,当一个键被松开产生的是 Break Code。每个键被分配了唯一的 Make Code 和 Break Code ,这样主机通过扫描码就可以知道是哪一个键。简单的说就是按下键,产生一个 Make Code。松开键,产生一个 Break Code。 而对于按住不放的情况呢。我们可以打开一个记事本,把 $1$a$1$ 键按住不放,可以看到会不停的产生 $1$a$1$ 直到我们松开。这是由于,当按住一个键不放时,将会 Typematic ,也就是自动打。每隔一定时间,自动产生一个被按住的键的 Make Code,直到最后松开该键。对于 Typematic 有两个重要的参数,一个是 Typematic Delay ,决定了按下多长时间之后,进入 Typematic,另一个是 Typematic Rate,决定了在进入 Typematic 之后,一秒钟内能产生多少个 Make Code 。现在我们再打开记事本,按住 $1$a$1$ 不放,仔细观察,将看到第一个 $1$a$1$ 和第二个 $1$a$1$ 之间间隔的时间明显比其他的要长,而之后每个$1$a$1$之间的时间间隔是一样的。 而对于同时按下多个键的情况呢。在一个键被按下,产生了 Make Code,而没有被松开,没有产生 Break Code 的时候,再按下另一个键,于是产生了另一个键的 Make Code ,就算是这两个键被同时按下。之后,这两个键松开时,各自产生各自的 Break Code。更多的键的情况也是一样。比如要按 Ctrl 和 A,下面的情况就算作是同时按下了 Ctrl 和 A。按Ctrl,产生 Ctrl 的 Make Code,然后按A,产生 A 的 Make Code,然后各自松开,各自产生各自的 Break Code。 而对于按一个键不放的时候,再按另一个键的情况呢。我们可以打开一个记事本,把$1$a$1$键按住不放,不要松开,然后再按$1$s $1$键不放。我们可以看到当按下$1$s$1$时,$1$a$1$键并没有松,但是并没有$1$a$1$再出现了,而是$1$s$1$开始出现,这时即使松开了$1$s$1$,$1$a$1$也不会继续出现了。
到目前为止一共有三套扫描码集( Scan Code Set ),ps/2 键盘默认使用第二套。不过可以设置 i8042,让 i8042 把得到的 Scan Code 翻译成 Scan Code Set 1 中的 Scan Code ,这样键盘驱动从 i8042 得到的所有 Scan Code 都是第一套中的 Scan Code(实际中驱动也是这么做的)。所以我们只讨论 Scan Code Set 1 。需要说明的是 Scan Code 和 ASCII码完全不相同。 在 Scan Code Set 1 中,大多数键的 Make Code,Break Code 都是一个字节。他们的 Make Code 的最高位都为0,也就是他们的 Make Code 都小于 0x7F。而他们的 Break Code 为其 Make Code 或运算 80h ,也就是把 Make Code 的低7位不变,最高位设置为1。 还有一些扩展按键,他们的 Scan Code 是双字节的。他们的第一个字节都是E0h,表明这是一个扩展键。第2个字节,和单字节 Scan Code 的情况相同。 还有一个特殊的键,Pause/Break 键,它的 Make Code 为 E1,1D,45 E1,9D,C5,注意是 E1h 开头。而且它没有 Break Code 。 我们按键的 Make Code 的值的大小,列出 Scan Code Set 1 中的所有扫描码 KEY MAKE BREAK ESC 01 81 TAB 0F 8F L_CTRL 1D 9D ` 29 89 KP * 37 B7 F1 3B BB NUM 45 C5 KP 7 47 C7 KP 4 4B CB KP 1 4F CF KP 0 52 D2 F11 57 D7 KP EN E0,1C E0,9C KP / E0,35 E0,B5 HOME E0,47 E0,C7 L ARROW E0,4B E0,CB END E0,4F E0,CF L GUI E0,5B E0,DB PRNT SCRN E0,2A, E0,37 E0,B7, E0,AA PAUSE E1,1D,45 E1,9D,C5 -NONE 这里说几句对驱动没有帮助的题外话,记不清是由于先有了关于 Scan Code 的值的猜测,才去按这个顺序列 Scan Code ,还是先这样列 Scan Code ,才有了关于 Scan Code 的值的猜测。总之,用这个 Make Code 的顺序,和我们现在键盘上键的布局做对照,我们大致就能猜到为什么 A 键的 Make Code 值为 0x1e,为什么 H 键的 Make Code 值为 0x23。我们拿其中的一小段举例子,A 1E,S 1F,D 20,F 21,G 22,H 23,看看键盘上 A,S,D,F,G,H 的位置吧。能感觉到些什么吧,感觉不到就算了,这个和驱动是无关的。从 Scan Code Set 1,可能还能推测出来最早的键盘的样子。以及发生在键盘上的一些变化。我们注意到 F10 和 F11,F12 的 Make Code 不是连在一起的,估计比较早的键盘只有10个功能键,而不是现在的12个功能键。从键的 Make Code 来看,有可能曾经使用的一些键,现在已经不出现在键盘上了。 还有一个值得注意的是,如果有 Make Code 为 0x60 的键,那么它的 Break Code 应该为 0x60+0x80=0xE0。那么这个键的 Break Code 将会和 表示扩展码的 0xE0 搞混。不过还好,并没有 Make Code 为 0x60 的键,所以不会发生搞混的情况。 1.4 i8042 键盘控制器 键盘驱动直接读写 i8042 芯片,通过 i8042 间接的向键盘中的 i8048 发命令。所以对于驱动来说,直接发生联系的只有 i8042 ,因此我们只介绍 i8042 ,不介绍 i8048。 象 i8042,i8048 这样的芯片,本身就是一个小的处理器,它的内部有自己的处理器,有自己的 Ram,有自己的寄存器,等等。 i8042 有 4 个 8 bits 的寄存器,他们是 Status Register(状态寄存器),Output Buffer(输出缓冲器), Input Buffer(输入缓冲器),Control Register(控制寄存器)。使用两个 IO 端口,60h 和 64h。
状态寄存器是一个8位只读寄存器,任何时刻均可被cpu读取。其各位定义如下 Bit7: PARITY-EVEN(P_E): 从键盘获得的数据奇偶校验错误
输出缓冲器是一个8位只读寄存器。驱动从这个寄存器中读取数据。这些数据包括,扫描码,发往 i8042 命令的响应,间接的发往 i8048 命令的响应。
输入缓冲器是一个8位只写寄存器。缓冲驱动发来的内容。这些内容包括,发往 i8042 的命令,通过 i8042 间接发往 i8048 的命令,以及作为命令参数的数据。
也被称作 Controller Command Byte (控制器命令字节)。其各位定义如下 Bit7: 保留,应该为0 2个端口 0x60,0x64 驱动中把 0x60 叫数据端口 1.5 命令 驱动可以直接给 i8042 发命令,可以通过 i8042 间接给 i8048 发命令。命令这部分内容直接来自 < 参考资料 [1] >。
驱动对键盘控制器发送命令是通过写端口64h实现的,共有12条命令,分别为 20h 60h A4h A5h A6h AAh ADh AEh C0h D0h D1h
共有10条命令,分别为 EDh EEh F0h F2h F3h F4h F5h F6h FEh FFh
AAh EEh F0h FAh FCh FEh 83ABh Scan code
首先介绍一下端口的读写操作,驱动中使用函数 READ_PORT_UCHAR 进行读操作, READ_PORT_UCHAR 中使用CPU读端口指令,in。驱动中使用函数 WRITE_PORT_UCHAR 进行写操作, WRITE_PORT_UCHAR 中使用CPU写端口指令,out。 1.6.1 读取状态寄存器 读取状态寄存器的方法,对64h端口进行读操作。 1.6.2 读数据 需要读取的数据有,i8042从i8048得到的按键的扫描码,i8042命令的ACK,i8042从i8048得到的i8048命令的ACK,需要命令重发的RESEND,一些需要返回结果的命令得到的结果。 当有数据需要被驱动读走的时候,数据被放入输出缓冲器,同时将状态寄存器的bit0(OUTPUT_BUFFER_FULL)置1,引发键盘中断(键盘中断的IRQ为1)。由于键盘中断,引起由键盘驱动提供的键盘中断服务例程被执行。在键盘中断服务例程中,驱动会从i8042读走数据。一旦数据读取完成,状态寄存器的bit0会被清0。 读数据的方法,首先,读取状态寄存器,判断bit0,状态寄存器bit0为1,说明输出缓冲器中有数据。保证状态寄存器bit0为1,然后对60h端口进行读操作,读取数据。 这里我们要谈一点很有用的题外话,前面提到的 IRQ,是 Interrupt Request line,中断请求线,是一个硬件线,它和中断向量是不同的。中断向量是用来在中断描述符表(IDT)中查找中断服务例程的那个序号。键盘的 IRQ 是1,键盘中断服务例程对应的中断向量可不是1。这点要弄清楚。 1.6.3 向i8042发命令 当命令被发往i8042的时候,命令被放入输入缓冲器,同时引起状态寄存器的 Bit1 置1,表示输入缓冲器满,同时引起状态寄存器的 Bit2 置1,表示写入输入缓冲器的是一个命令。 向i8042发命令的方法,首先,读取状态寄存器,判断bit1,状态寄存器bit1为0,说明输入缓冲器为空,可以写入。保证状态寄存器bit1为0,然后对64h端口进行写操作,写入命令。
向i8042发这些命令,i8042会转发i8048,命令被放入输入缓冲器,同时引起状态寄存器的Bit1 置1,表示输入缓冲器满,同时引起状态寄存器的 Bit2 置1,表示写入输入缓冲器的是一个命令。这里我们要注意,向i8048发命令,是通过写60h端口,而后面发命令的参数,也是写60h端口。i8042如何判断输入缓冲器中的内容是命令还是参数呢,我们在后面发命令的参数中一起讨论。 向i8048发命令的方法,首先,读取状态寄存器,判断bit1,状态寄存器bit1为0,说明输入缓冲器为空,可以写入。保证状态寄存器bit1为0,然后对60h端口进行写操作,写入命令。 1.6.5 发命令的参数 某些命令需要参数,我们在发送命令之后,发送它的参数,参数被放入输入缓冲器,同时引起状态寄存器的Bit1 置1,表示输入缓冲器满。这里我们要注意,向i8048发命令,是通过写60h端口,发命令的参数,也是写60h端口。i8042如何判断输入缓冲器中的内容是命令还是参数呢。i8042 是这样判断的,如果当前状态寄存器的Bit3 为1,表示之前已经写入了一个命令,那么现在通过写60h端口放入输入缓冲器中的内容,就被当做之前命令的参数,并且引起状态寄存器的 Bit3 置0。如果当前状态寄存器的 Bit3 为0,表示之前没有写入命令,那么现在通过写60h端口放入输入缓冲器中的内容,就被当做一个间接发往i8048的命令,并且引起状态寄存器的 Bit3 置1。 向i8048发参数的方法,首先,读取状态寄存器,判断bit1,状态寄存器bit1为0,说明输入缓冲器为空,可以写入。保证状态寄存器bit1为0,然后对60h端口进行写操作,写入参数。
"1ps/2 键盘的硬件" 主要参考下面的资料,关于 ps/2 键盘硬件更多的内容也请参考下面的资料 [1] http://pagoda-ooos.51.net/os_book/driver/driver-keyboard_2.htm (中文) WINDOWS XP服务和进程优化详解1.Alerter Alerter(警示器)服务的进程名是Services.exe(即启动这个服务后在后台运行的进程的名称,可以通过任务管理器看到)。Alerter服务的功能是,WinXP将系统上发生的与管理有关的事件以警示(Alert)信息传送至网络上指定的电脑或用户,例如当发生打印错误或硬盘即将写满等事件,这类警示信息由XP的警示器服务(Alerter Service)收集、送出。 尽管Alerter依存的服务并没有Messenger(信使)服务,但Alerter服务必须依赖后者才能送出信息,故在启动Alerter服务后还必须确定Messenger服务也是在工作中,而接收的电脑也必须启动Messenger服务。由于 Alerter服务运行后,服务使用户可以发送弹出(Pop-up)信息给其他用户,这些信息有可能被攻击者用来实施攻击,如诱骗用户修改口令等,从而造成安全隐患。同时该服务使得用户帐号名泄漏,也有可能被攻击者利用来进行口令猜测攻击。所以对于家庭单机用户,甚至对于绝大多数小型的局域网来说,这个功能是完全可禁用的,不仅节省了系统资源和加快启动速度,也提高了机器的安全性。 2.Application Layer Gateway Service 简称"ALG"(应用层网关),其进程名是alg.exe,WinXP Home/PRO默认安装的启动类型为手动。ALG又被称为代理服务器(Proxy Server),是网络防火墙从功能面上分类的一种。当内部计算机与外部主机连结时,将由代理服务器(Proxy Server)担任内部计算机与外部主机的连结中继者。使用ALG的好处是隐藏内部主机的地址和防止外部不正常的连接,如果代理服务器上未安装针对该应用程序设计的代理程序时,任何属于这个网络服务的封包将完全无法通过防火墙。通俗点说,具体到ALG本身,它就是WinXP附带的Internet连接共享 /防火墙的具体控管程序,如果你需要启用这二者,这个服务是必备的。当然,只有一台计算机的上网家庭可以考虑禁用这个服务,不过笔者个人觉得WinXP内置的防火墙效果还是不错的,如果不是坚持要使用第三方的防火墙,还是建议开着它吧。 3.Application Management AppMgmt (应用程序管理服务)的进程名是Svchost.exe,WinXP Home/Pro默认安装的启动类型是手动,没有任何依存服务关系。从Win2000开始微软引入了一种基于MSI文件格式(应用程序安装信息程序包文件)的全新、有效软件管理方案——即应用程序管理组件服务(Application Management),它不仅管理软件的安装、删除,而且可使用此项服务修改、修复现有应用程序,监视文件复原并通过复原排除基本故障等。通常这个服务我们保持其默认状态较好。 可能许多朋友都有印象,当年ACDSee 4.0刚发布时,由于安装制作上的考虑不周,并没有考虑到那个时候大多数人的系统还并不支持MSI安装格式,结果只得又去下载安装一个名为Windows Installer的MSI辅助文件才解决问题。通常以MSI文件格式安装的软件十分好认,比如说Office XP,当你安装后再次运行软件的安装程序时,它一般会有"重新安装"、"修复软件"、"卸载软件"等多个选项,而不是以前安装程序那种就简单的卸载或覆盖安装了事。 4.Automatic Updates Wuauserv(自动更新服务)的进程名是 Svchost.exe,WinXP Home/Pro默认安装的启动类型为自动,没有任何依存服务关系。这个是大家都非常熟悉的系统自动更新功能,就不多说了。用小猫上网而深受其苦的朋友记得在系统属性中关闭是不够的,还要将Automatic Updates这个服务禁用才可以。以后需要更新的话,直接到在IE中键入Windows Update 网站地址手动更新即可。 5.Background Intelligent Transfer Service BITS (后台智能传输服务)的进程名是Svchost.exe,WinXP Home/Pro默认安装的启动类型是手动,依赖于Remote Procedure Call、Workstation服务。微软宣称BITS能够利用剩余的带宽传输文件,当网络切断或计算机需重启时,后台智能传输服务会自动对文件传输加以维护,当网络重新连接时,后台智能传输服务将继续从停止的地方继续开始传输文件。其实这个服务原是用来实现HTTP 1.1服务器之间的信息传输,基本上它的应用也就是支持Windows自动更新时的断点续传。如果你禁用了Automatic Updates,留着它基本上也没有什么意义。 6.ClipBook ClipSrv(剪贴板查看器服务)的进程名是clipsrv.exe,WinXP Home/Pro默认安装的启动类型是手动,依赖Network DDE服务。ClipBook通过Network DDE和Network DDE DSDM提供的网络动态数据交换服务,可查阅远程机器中的剪贴板,通俗的说就是ClipBook支持剪贴板查看器(ClipBook Viewer)程序,该程序可允许剪贴页被远程计算机上的ClipBook浏览。 例如有个较大的文档工程,由A、B、C共同开发,A负责 Excel数据部分,B负责Visio制图部分,而C负责将两部分文档的整合。C经常需要对A、B的数据进行拷贝,愚蠢的做法是C打开A、B在网络邻居上共享的文档,然后将相关内容拷贝。而对Windows体系有一定了解的用户应该听说过OLE这个东西,上面说的EXCEL数据和Visio制图都可以认为是独立的OLE对象,如果A、B、C的3台机器上的Clipbook服务都为开启,就可利用ClipBook共享这些OLE对象,C只要在自己的文档中建立OLE对象的链接指向A、B的Excel和Visio,A、B对自己工作的任何改动即可在C的复合文档里自动体现。由此可见,ClipBook是基于对象的共享,而非简单的文件共享。所以也很好理解,这是一把双刃剑,在带来极大方便的同时,也带来被非法远程访问ClipBook剪贴页面的安全隐患。对于没有上述类似工作,又不准备使用或极少使用远程桌面的用户,这个服务完全可以禁用,在需要的时候再打开。 7.COM+ Event System EventSystem (COM+事件系统服务)的进程名是Svchost.exe,WinXP Home/Pro默认安装的启动类型是手动,依赖Remote Procedure Call服务。对于非软件开发专业的朋友来说,COM+是个非常难理解的名词。简单的说COM+是一种软件构件/组件的标准。比如写一个软件好比是盖一座房子。而门窗等部件会根据标准设计,以求得省时省力,COM组件即是Windows的门窗等标准组件了,COM+是对COM的进一步扩展,其具体含义在此就不详细介绍了,Windows系统又是个典型的消息(事件)处理型系统,很多功能都是由消息来触发的,这就产生了COM+ Event System。我们要学习的是如何简单判断自己的系统中是否有程序依靠此服务。检查你的系统安装盘下的"Program files\ComPlus Applications "目录,如果没有东西就可以把这个服务关闭了。 8.COM+ System Application COMSysApp (COM+系统应用服务)的进程名是Dllhost.exe,WinXP Home/Pro默认安装的启动类型是手动,依赖Remote Procedure Call服务。简单的说,COM+ System Application是COM+ Event System的具体执行者,如果禁用了COM+ Event System也就自然禁用它。 9.Computer Browser Browser (计算机浏览器服务)的进程名是Svchost.exe,WinXP Home/Pro默认安装的启动类型是自动,依赖Server和Workstation服务。Browser服务维护着一个网络资源的清单,其中包括基于 Windows的域、工作组和计算机,还有其他支持NetBIOS协议的网络设备,我们在"网上邻居"上看到显示的内容正是来源于此。显然对于一般家庭用的计算机这个服务并不需要,除非计算机位于局域网之上,例如用长城宽带的朋友,用它可方便地知道社区内的网络环境。这个服务还是慎重对待较好,若不是太在意还是将其设置成自动吧。 10.Cryptographic services CryptSvc (认证服务)的进程名是Svchost.exe,WinXP Home/Pro默认安装的启动类型为自动,依赖Remote Procedure Call服务。CryptSvc是整个微软公钥体系(PKI,Public Key Infrastructure)的核心元件。所谓的PK是一种公匙加密法,通过加密来保证数据的安全和传送,它与传统的秘密(对称)钥匙密码法不相同, PK密码法的基本特性是加密和解密的钥匙不同,每一个用户两把钥匙,一把公开密匙,一把私匙。撇开这些难以一下子理解的术语,具体到CryptSvc本身来说,如果我们在WinXP中使用Automatic Updates自动更新,或在Internet上使用证书进行身份验证以及正确管理这些证书等,那么这个服务就不要关闭。其中这个功能最有用的是,当你安装一个驱动程序时,以确定它是不是通过微软认证的。因为驱动程序在操作系统内可以获得很高的运行权限,含有恶意代码的驱动程序会让你玩完,因而开发驱动程序的厂家一般都会去做微软认证,通过验证后,微软会在里面添加它的认证数据,再到你机器上安装时就可以通过CryptSvc检测升级。 11.DHCP Client Dhcp (DHCP客户端服务)的进程名是Svchost.exe,WinXP Home/Pro默认安装的启动类型为自动,依赖AFD Networking Support Environment、NetBIOS over TCP/IP以及TCP/IP Protocol Driver服务。简单的说DHCP过程就是由网络中一台主机(DHCP Server)将所有的网络参数自动分配给网络内的任何一台计算机,而DHCP Client就是网络中被分配网络参数的对象计算机了。如果能在网络中被自动分配IP地址等网络参数,那么这个DHCP Client服务就必不可少。对于家庭单机用户来说,只要是使用DSL/Cable上网、开启ICS和IPSEC服务的人都需要这个来指定静态IP,所以通常这个服务是不关闭的,除非你的机器是完全的单机应用环境。 12.Distributed Link Tracking Client TrkWks (分布式连结追踪客户端服务)的进程名是Svchost.exe,WinXP Home/Pro默认安装的启动类型为自动,依赖Remote Procedure Call服务。对于计算机有一定了解的人对于"分布式"这个词并不陌生,这里就不作解释。TrkWks服务简单说,就是将整个网络中分散于各台计算机上互相有连接的NTFS文件看作一个整体,相当于一台机器上的文件系统,所以当系统内发生文件移动,就会记录这个信息。它是针对"域用户"的"NTFS文件" 的"分布式连接",这3个条件缺一个你就用不上它,对于不在局域网的单机用户来说,当然是禁用它。 13.Distributed Transaction coordinator MSDTC (分布式交易协调器)的进程名是Msdtc.exe,WinXP Home/Pro默认安装的启动类型是手动,依赖Remote Procedure Call和Security Accounts Manager服务。MSDTC主要用来处理分布式交易,所谓分布式交易,就是跨越两个或多个数据库的单一SQL Server内部的交易。同一数据库内不同数据表间的交易,则不能称作分布式交易。显然对于需要同时处理多个数据库或文件系统的用户来说,这个服务意义重大,但它也是通常意义上一般用户不会使用到的服务,通常来默认手动启动就好了,其实这个服务也容易受到远程拒绝服务攻击,禁用它也没有问题,而且更安全。 14.DNS Client Dnscache(DNS客户端服务)的进程名是Svchost.exe,WinXP Home/Pro默认安装的启动类型为自动,依赖TCP/IP Protocol Driver服务。DNS(Domain Name System)也是常见的名词了,简单的解释就是当使用网页浏览器去上网时,会键入网站的网址,而这些网址名称在因特网上就是透过网域名称服务器(DNS 服务器)来完成名称转换为IP地址的解释。实际上一些网站并不是只有一台服务器在工作,而是有多台服务器在同时工作,也就是说同样一个网站名称地址可对应不同的IP地址(在Win2000以前的操作系统可执行此查询)。但如果将操作系统换到Win2000或XP,同样的网站你又会发现总是查到同一个IP地址。为什么会这样呢?这就是DNS Client服务的作用。 为了要达到用最快速、最有效率的方式,让客户端能够迅速找到网域的验证服务,在Win2000/XP系统中,加入了DNS快取(Cache)的功能,当第一次在找到了目的主机的IP地址后,操作系统就会将所查询到的名称及IP地址记录在本机的DNS快取缓冲区中,下次客户端还需要再查询时,就不需要到 DNS服务器上查询,而直接使用本机DNS Cache中的数据即可,所以你查询的结果始终是同一IP地址。这个服务关闭与否影响并不大,在安全性上最多只是可以泄漏你的缓存内容,确定你曾经访问过的网站。 15.Error Reporting Service ERSvc(错误报告服务)的进程名是Svchost.exe,WinXP Home/Pro默认安装的启动类型为自动,依赖Remote Procedure Call服务。这个服务我们经常碰到,当使用程序出错时会跳出对话框,问你是否需要向微软发送报告,就是这个服务的功能。此服务完全可设置为手动或禁止。如果你想对错误报告进行更详细的设置,可以右键单击"我的电脑"图标,选择"属性",在"高级选项卡"下点击"错误报告"按钮,在那里你可以决定是否发送错误报告以及发送怎样的错误报告。而对于没有上网的用户就可直接禁用此服务了,上网用户如果担心报告会向微软透漏你的私人信息(当然微软保证不会发生这种事情),也大可禁用它。 16.Event Log Eventlog(系统日志纪录服务)的进程名是Services.exe,WinXP Home/Pro默认安装的启动类型为自动,没有服务依存关系。Event Log服务负责记录来自系统和运行中程序的管理事件消息,为Windows和应用程序提供了一个标准而集中的方法来记录重要的软件和硬件事件。打开事件查看器的方法是依次打开"开始→控制面板",然后选择打开"管理工具→事件查看器"。这个服务是基础服务,无法调整关闭。 17.Fast User Switching Compatibility Fast User Switching Compatibility(多用户快速切换服务)的进程名是svchost.exe,WinXP Home/Pro默认安装的启动类型是手动,依赖Terminal Services服务。此服务是WinXP的新技术,即快速的多用户切换环境。解决了以前的多用户环境虽然安全但是切换用户环境需要重新启动,并丢失上一用户工作环境的问题。使用很简单,只要进行"开始→注销→切换用户"操作即可方便地切换用户环境,是非常不错的多用户技术,如果用不着多用户环境就不用打开它(加入域后默认不能进行快速切换,当然可禁用)。 18.FAX Service FAX (传真服务)的进程名是Fxssvc.exe,WinXP Home/Pro中默认是没有安装的,依赖Plug and Play、Print Spooler、Remote Procedure Call、Telephony服务。FAX服务在默认情况下是没有安装的,但如果你安装了它就可以进行"开始→所有程序→附件→通讯→传真"操作,使用 WinXP内置的传真服务来收发传真了,当然你要保证你的机器至少还保留了一只小猫。不需要的人就禁用吧。 19.Help and Support Helpsvc (帮助服务)的进程名是Svchost.exe,WinXP Home/Pro中默认安装的启动类型为自动,依赖Remote Procedure Call服务。这个服务用于支持WinXP帮助和支持中心的功能,如果你刚开始使用WinXP,这个帮助中心能解决不少问题,如果你觉得不需要它了,那就禁用吧。 20.Human Interface Device Access HidServ (人性化接口装置服务)的进程名是Svchost.exe,WinXP Home/Pro中默认安装的启动类型是禁用,依赖Remote Procedure Call服务。这个服务简单说就是支持那些所谓的带有多媒体功能智能键盘,比如音量调节。当然你有符合人体工程学标准的设备(主要指键盘和鼠标),那么这个服务就设置为自动,否则这些设备的一些功能将不能正常使用。而如果你没有这类设备或者你的设备有自己的驱动,即可禁用此服务。 21.IMAPI CD-Burning COM Service ImapiService (IMAPI CD刻录服务)的进程名是Imapi.exe,WinXP Home/Pro中默认安装的启动类型是手动,没有任何的服务依存关系。这个就是WinXP内置的CD刻录服务了,杂志2003年第12期对此有过较详细的介绍。总的来说该服务的功能和性能十分有限,有刻录机的朋友还是安装成熟的第三方刻录软件,关闭这个服务吧。 22.Indexing Service Cisvc (索引服务)的进程名是Cisvc.exe,WinXP Home/Pro中默认安装的启动类型是手动,依赖Remote Procedure Call服务。这个服务可为本地和远程计算机上的文件编制索引,也就是说像图书馆里为图书编制的查询索引一样,这样可加快寻找文件的速度。开启此项服务对个人用户而言有一个很大的帮助,就是文件浏览速度(即双击某文件夹后的等待时间)会明显增加,因为系统已将目录结构读入了内存,需要时会直接调用。但此服务启用后某此情况会导致系统极度繁忙,通过任务管理器,可看见Cidaemon.exe这个进程占用了大部分CPU资源。因此对待这个不成熟的服务请根据自己机器的情况设为"自动"或"禁用"。 23.Internet Connection Firewall/Internet Connection Sharing SharedAccess (Internet连接共享和防火墙服务)的进程名是Svchost.exe,WinXP Home/Pro中默认安装的启动类型分别是手动和自动,依赖Application Layer Gateway Service、Network Connections、Network Location Awareness、Remote Access Connection Manager服务。这个服务提供WinXP内置的Internet连接共享和防火墙功能。笔者比较喜欢这两个功能,性能都不错而且方便,具体关闭与否看个人喜好,不用就可以关闭它。 24.IPSEC Services PolicyAgent (IP安全策略服务)的进程名是Lsass.exe,WinXP Home/Pro中默认安装的启动类型为自动,依赖IPSEC driver、Remote Procedure Call、TCP/IP Protocol Driver服务。IPSEC是一种用来保护内部网、专用网络以及外部网(Internet、Extranet)免遭攻击的重要防御方法,主要特征在于它可对所有IP级的通信进行加密和认证,正是这一点才使IPSEC可以确保包括远程登录、客户/服务器、电子邮件、文件传输及Web访问在内的多种应用程序的安全。由于企业及政府用户非常注重于部署安全的IP,所以这一服务显得很重要。同时也可以看到,对于绝大多数用户来说,这是个根本就不用关心的东西。所以禁用它吧。 25.Logical Disk Manager Dmserver(逻辑磁盘管理员服务)的进程名是Svchost.exe,WinXP Home/Pro中默认安装的启动类型分别是手动和自动,依赖Plug and Play、Remote Procedure Call服务。Dmserver用来动态管理磁盘,如显示磁盘可用空间和使用Microsoft Management Console(MMC)主控台中的磁盘管理功能。这个服务对于经常使用移动硬盘、U盘等外设的朋友来说必不可少,没有的话可选择禁用它。 26.Logical Disk Manager Administrative Service Dmadmin (逻辑磁盘管理系统管理服务)的进程名是Svchost.exe,WinXP Home/Pro中默认安装的启动类型分别是手动和自动,依赖Logical Disk Manager、Plug and Play、Remote Procedure Call服务。Dmadmin主要用来配置硬盘信息,平时基本上没用。打开"计算机管理"(Microsoft Management Console,简称MMC)时,你可以看到"磁盘管理",这时就会用上它,可设为手动。 ------------------- 【掸子增补】 [mdm.exe] 进程文件: mdm or mdm.exe 进程名称: Machine Debug Manager 描 述: Debug除错管理用于调试应用程序和Microsoft Office中的Microsoft Script Editor脚本编辑器。 介绍:Mdm.exe的主要工作是针对应用软件进行排错(Debug),说到这里,扯点题外话,如果你在系统见到fff开头的0字节文件,它们就是 mdm.exe在排错过程中产生一些暂存文件,这些文件在操作系统进行关机时没有自动被清除,所以这些fff开头的怪文件里是一些后缀名为CHK的文件都是没有用的文件,只要系统中有Mdm.exe存在,就有可能产生以fff开头的怪文件。可以按下面的方法让系统停止运行Mdm.exe来彻底删除以fff 开头的怪文件:首先按"Ctrl+Alt+Del"组合键,在弹出的"关闭程序"窗口中选中"Mdm",按"结束任务"按钮来停止Mdm.exe在后台的运行,接着把Mdm.exe(在C:\Windows\System目录下)改名为Mdm.bak。运行msconfig程序,在启动页中取消对 "Machine Debug Manager"的选择。这样可以不让Mdm.exe自启动,然后点击"确定"按钮,结束msconfig程序,并重新启动电脑。另外,如果你使用IE 5.X以上版本浏览器,建议禁用脚本调用(点击"工具→Internet选项→高级→禁用脚本调用"),这样就可以避免以fff开头的怪文件再次产生。 OFF:如何关闭计算机调试管理器 Mdm.exe found.000文件夹的问题 问:我的电脑有的时候在C盘或D盘的根目录下有个名为found.000的文件夹,里面有一些后缀名为CHK的文件。在c:\windows下有很多以fff开头的怪文件,而且大小全部为0字节。请问这些是什么文件?能否将它们删除? 答: found.000文件夹里面的一些后缀名为CHK的文件是你在使用"磁盘碎片整理程序"整理硬盘后所产生的"丢失簇的恢复文件"。在c:\ windows下有很多以fff开头的文件是由Mdm.exe(Machine Debug Manager)这个程序产生的。Mdm.exe的主要工作是针对应用软件进行排错(Debug),在排错过程中会产生一些暂存文件,这些文件在操作系统进行关机时没有自动被清除,所以这些fff开头的怪文件和found.000文件夹里面的一些后缀名为CHK的文件都是没有用的:s33文件,可以任意删除而不会对系统产生不良影响。 但只要系统中有Mdm.exe存在,那么以fff开头的怪文件就又有可能产生。你可以按下面的方法让系统停止运行Mdm.exe来彻底删除以fff开头的怪文件:首先按"Ctrl+Alt+Del"组合键,在弹出的"关闭程序"窗口中选中"Mdm",按" 结束任务"按钮来停止Mdm.exe在后台的运行,接着把Mdm.exe(在C:\Windows\System目录下)改名为Mdm.bak。运行 msconfig程序,在启动页中取消对"Machine Debug Manager"的选择。这样可以不让Mdm.exe自启动,然后点击"确定"按钮,结束msconfig程序,并重新启动电脑。另外,如果你使用IE 5.X,建议禁用脚本调用(点击"工具→Internet选项→高级→禁用脚本调用"),这样就可以避免以fff开头的怪文件再次产生。 ----------------- 27.Messenger Messenger (信使服务)的进程名是Services.exe,WinXP Home/Pro中默认安装的启动类型为自动,依赖NetBIOS Interface、Plug and Play、Remote Procedure Call、Workstation服务。Messenger这个服务上过网的人都应该比较熟悉,本来Microsoft开发"信使服务"是为了方便同一域中的管理员进行信息交流,后来有些人开发了突破域限制的信使发送工具,于是大家挂在网上时,计算机上经常会弹出一个名为"信使服务"的对话框,这些不请自到的"信使"基本上是一些垃圾信使信息,有无聊的广告,有非法的信息等。通常这些信息是用一些名为"凶宝宝信使"、"妖刺"的软件发布的,但实际上如果是在同一域中,只需要用NET SEND命令就可以轻易发送消息了。突然出现的"信使服务"不仅会干扰工作,影响心情,而且还容易遭到"社会工程"攻击,所以禁用它吧。 28.MS Software Shadow Copy Provider SwPrv(管理磁盘区卷影复制服务)的进程名是dllhost.exe,WinXP Home/Pro中默认安装的启动类型是手动,依赖Remote Procedure Call服务。这个服务是为WinXP中的MS Backup备份程序提供支持,奇怪的是即使关掉它我的备份工作也可以顺利完成,用不着的话就禁用它吧。 29.Net Logon Netlogon (网域登录服务)的进程名是lsass.exe,WinXP Home/Pro中默认安装的启动类型分别是手动和自动,依赖Workstation服务。这个服务是用来做网域审查的。当你的计算机处在一个域网内时,如果要使用网内的域服务器登录到域网时,就要通过它来登录了。一般用户用不着,禁用即可。 30.NetMeeting Remote Desktop Sharing Mnmsrvc (NetMeeting远程桌面共享服务)的进程名是Mnmsrvc.exe,WinXP Home/Pro中默认安装的启动类型是手动,依赖Remote Procedure Call服务。使用NetMeeting可透过公司内部网络,让使用者将计算机的控制权分享给局域网上或因特网上的其他使用者,很多人都因为安全问题关掉它,而且它很占网络资源。但如果你想和别人做些非文字的交流,还是比较好玩的。注意关掉它后,远程桌面共享功能将无法使用。 31.Network Connections Netman (网络连接服务)的进程名是svchost.exe,WinXP Home/PRO默认安装的启动类型是手动,依赖于Remote Procedure Call服务。Netman也是非常重要的基础服务,它管理着"网络和拨号连接"文件夹中的所有对象,任何有关于网络上(局域网、Internet)的连接都需要这个服务。如果被禁用,在"网络和拨号连接"文件夹中将什么都看不到,更不用说新建连接和拨号上网了。因此除非你的机器是绝对的单机环境,才可将其关闭。 32.Network DDE NetDDE(网络动态数据交换服务)的进程名是 netdde.exe,WinXP Home/PRO默认安装的启动类型是手动,依赖于Network DDE DSDM服务。NetDDE(Network Dynamic Data Exchange)是微软早期设计的一种方法,可让应用程序在不同PC上的Windows之间交换动态数据,现在已经很少使用。实际上在WinXP中,真正使用它的只有ClipBook服务,回顾上一期中提到的3人共同开发文档,通过ClipBook来交换动态数据的例子就可以很好理解这个服务的作用了。数据共享服务通常是经过可信赖的沟通渠道,负责管理这项服务的是网络DDE代理(Network DDE Agent),实际上网络DDE代理会使机器非常容易遭受攻击而失去本机的管理员控制权。因此如果无需ClipBook共享这个特殊服务,不妨禁用。 33.Network DDE DSDM NetDDE dsdm(网络动态数据交换网络共享服务)的进程名是netdde.exe,WinXP Home/PRO默认安装的启动类型是手动,它不依赖于其他服务。如果此服务终止,Network DDE服务将不可用,实际上如果不用Network DDE,那么Network DDE DSDM也禁用好了。 34.Network Location Awareness NLA (网络位置识别服务)的进程名是svchost.exe,WinXP Home/PRO默认安装的启动类型是手动,依赖于AFD网络支持环境和TCP/IP Protocol Driver服务,而ICF/ICS服务依赖于它。NLA可以探测网络系统的相关信息,当这些信息发生变化时通知相关的应用程序。基本上,这个服务主要针对的对象是笔记本电脑。因为在实际工作和生活中,人们的笔记本电脑常常在超过一个以上的网络环境中应用。经常可能遇到在一个网络中需要使用动态IP地址,而在另一网络中需要使用静态IP地址的问题。比如说你在办公室里使用的是动态IP,而在家里却使用静态IP来连接宽带,那么NLA就可让你在家里及单位网络(有线)之间切换时自动辨认出不同网络环境,从而自动选择合适的配置而无需重新调整网络参数。对于经常移动办公的人,这确实是个不错的功能。 35.NT LM Security Support Provider NtLmSsp (NT LM安全性支持提供者服务)的进程名是lsass.exe,WinXP Home/PRO默认安装的启动类型是手动,它不依赖于其他服务。NT LM的意思即NT LanManger,是NT下提供的认证方法之一,使用了64位的加密手段。NtLmSsp这个服务主要针对RPC(远程过程调用),通常RPC可以选择基于两种通信方式,一种是传输协议,比如TCP/IP、UDP、IPX等,另一种为命名管道(Pipeline)。通常情况下Windows默认选择都是传输协议,而由于RPC是采用非加密传输的,通信数据安全无法得到保证,而NtLmSsp就可向这一类RPC提供安全服务。WinXP中已知的这类RPC 应用就是Telnet服务(Telnet也依赖于NtLmSsp),因此无需Telnet服务的单机用户可将NtLmSsp其关闭。 36.Performance Logs and Alerts SysmonLog (效能记录日志及警示服务)的进程名是smlogsvc.exe,WinXP Home/PRO默认安装的启动类型是手动,它没有任何服务依存关系。如果打开控制面板的管理工具,可以看到有"性能"这个工具,它较详细地反映了系统的性能,但配置起来相当复杂,不好上手,而且大多数人也会认为这个性能工具没什么意义。 SysmonLog就是为它提供日志记录的服务。如果你对自己机器的工作状态比较在意,这绝对是一个值得研究的工具,因为它可以严格监视硬盘、内存、CPU甚至于软件在系统中的运行,并通过记录下的日志数据分析机器软硬件资源的具体情况。更有用的是,如果你比较了解计数器这个参数的设置,就可为各部分资源设置合适的计数器值,一旦服务监视到资源的性能值超过或是低于此值,就会通过Messenger服务发出警告,如此很容易就能觉察到机器的某部分资源不足(如若升级电脑就可先从这里考虑)或发生了故障等。当然,并不关心自己机器具体工作的用户也可将其关闭。 37.Plug and Play PlugPlay(即插即用服务)的进程名是services.exe,WinXP Home/PRO默认安装的启动类型是自动,它不依赖于任何服务。这个服务想必大家相当熟悉,从Win98开始这个技术就始终是微软操作系统的核心部分。即插即用是Intel开发的一组规范,它赋予了计算机自动检测和配置设备并安装相应驱动程序的能力,当有设备被更改时能自动通知当前设备的状况并使用该设备变更后的程序。PlugPlay是WinXP的几个基础服务之一,在服务管理工具中无法调整它,而且如果本服务一旦失败就只有重新启动机器了。 38.Portable Media Serial Number Service WmdmPmSp(便携的媒体序号服务)的进程名是svchost.exe,WinXP Home/PRO默认安装的启动类型是自动,它没有任何服务依存关系。这个服务其实非常简单,它是微软用来防盗版的工具之一,但目前基本上只是针对音乐。微软用它获得你系统中媒体播放器的序列号,做什么用呢?其实它是在试图控制你将盗版的音乐文件拷贝到类似MP3、MD等便携播放器上。尽管微软声称关掉这个服务会影响将正版音乐下载到便携播放器,但笔者还是关掉这个服务,一是影响并不大,至少手上的正版CD拷贝到MP3是没有问题的,二是微软也刺探得太多了吧,我们用什么还都得报告它? 39.Print Spooler Spooler(打印后台处理服务)的进程名是spoolsv.exe,WinXP Home/PRO默认安装的启动类型是自动,依赖于Remote Procedure Call。Spooler是为了提高文件打印效率,将多个请求打印的文档统一进行保存和管理,先将要打印的文件拷贝到内存,待打印机空闲后,再将数据送往打印机处理。这样处理速度更快些。建议将其设置为手动,有打印任务时再打开。如果没有打印机自然是禁用了。 40.Protected Storage ProtectedStorage (受保护存放区服务)的进程名是lsass.exe,WinXP Home/PRO默认安装的启动类型是自动,依赖于Remote Procedure Call。这一服务提供对敏感性数据保护的功能,比如密码、证书等,但通常它只针对Windows自身的敏感数据进行保护,可用来储存你计算机上的密码。通常上网的用户都比较喜欢开这个服务,毕竟像自动填表这些功能给人带来不少方便。但如果你的电脑是多用户环境,或是使用笔记本电脑,经常移动办公,那么这个服务就要谨慎使用了。有不少密码破解软件就是针对这个ProtectedStorage的,比较有名的有Protected Storage PassView,用它可以轻易得到被储存在ProtectedStorage中你曾经上过的论坛的帐号密码、拨号密码等。因此,对于这个服务要视使用环境而定,在不安全的环境下还是关闭较好。 备此功能,不然可关闭。 41.QoS RSVP RSVP(QoS 许可控制服务)的进程名是rsvp.exe,WinXP Home/PRO默认安装的启动类型是手动,依赖于AFD Networking Support Environment、Remote Procedure Call、TCP/IP Protocol Driver服务。这就是微软那个饱受争议的占用了20%网络带宽的服务了。对大多数朋友来说,关掉它是简单正确的选择。但是要理解这个服务究竟是干什么的就不这么简单了。QoS这个词的意思是服务质量(Quality of Service),而RSVP这个词的意思是资源预留协议(ReSerVation Protocol)。 随着IP技术和网络的发展,世界各国的运营商基于IP网络已开发出多种多样的新业务。由于目前基于存储转发机制的Internet(IPv4标准)只为用户提供了"尽力而为(best- effort)"的服务,不能保证数据包传输的实时性、完整性以及到达的顺序性,更无法保障实时多媒体业务服务质量(QoS),所以主要应用在文件传送和电子邮件服务。而随着Internet的飞速发展,人们对于在Internet上传输多媒体信息的需求越来越大,这就要求网络应能根据用户的要求分配和调度资源,传统的"尽力而为"转发机制已不能满足用户的要求。为解决这一问题,美国于1996年底开始了以提高网络服务质量研究为核心的InternetⅡ 以及NGI(下一代Internet)等研究项目。相关的权威组织IETF(Internet Engineering Task Force)也成立了专门的工作小组来研究多媒体服务质量的定义和相关标准。IETF在IP网络的QoS方面提出了多种服务模型和机制,其中的综合业务模型(Int-Serv)引入了一个重要的网络控制协议RSVP(资源预留协议),这一模型的思想是"为了给特定的客户包流提供特殊的QoS,要求路由器必须能够预留资源。反过来要求路由器中有特定流的状态信息"。所以可以看出,这一模型能提供绝对有保证的QoS,是以预留下的资源作为代价的,对资源的要求实际上是更高的。因此,对于WinXP中的QoS RSVP服务保留了20%的网络带宽也就不足为奇了,由于对于个人应用几乎毫无意义,禁用它是不二选择。 42.Remote Access Auto Connection Manager RasAuto (远程访问自动联机管理员服务)的进程名是svchost.exe,WinXP Home/PRO默认安装的启动类型是手动,依赖于Remote Access Connection Manager、Telephony服务。RasAuto主要针对宽带使用,当有网络连接请求时它会自动打开网络连接,我们在使用WinXP时会经常弹出一个自动拨号窗口,就是它在工作。如果你的机器提供网络共享服务就开着它,避免网络断线后手动连接,否则可将其关闭。 43.Remote Access Connection Manager RasMan(远程访问联机管理员服务)的进程名是svchost.exe,WinXP Home/PRO默认安装的启动类型是手动,依赖于Telephony服务,其简单描述是"创建网络连接",这个解释简单明了,所以根据自己系统的情况来使用这个服务即可。 44.Remote Desktop Help Session Manager RDSessMgr (远程桌面协助服务)的进程名是sessmgr.exe,WinXP Home/PRO默认安装的启动类型是手动,依赖于Remote Procedure Call服务。这是与NetMeeting Remote Desktop Sharing很类似的一个服务。鼠标点击"开始→所有程序→附件→通讯→远程桌面连接"可开远程桌面功能,而RDSessMgr就是为它提供支持。微软的原意是通过它做远程帮助,其代价是牺牲安全与4MB内存的占用,不需要时一定得关闭。 45.Remote Procedure Call RpcSs (远程过程调用服务)的进程名是svchost.exe,WinXP Home/PRO默认安装的启动类型是自动。太多服务依赖于这一服务了,最近"冲击波"横行,恐怕大家都对RPC有此印象了吧,它原名远程进程调用,是早期IBM、SUN等公司定义的功能级通信协议,随后被微软采纳,但作了改动,称之为MRPC。总的来说RPC是一种消息传递功能,上一期说过 Windows系统是个典型的消息(事件)处理型系统,所以RPC对于系统的重要性不言而喻。由于Windows内部结构已相当复杂了,很难搞清楚哪些模块在用RPC哪些不用,事实上你只要关掉它,系统就可能崩溃。所以这个服务也是不可禁用的。 46.Remote Procedure Call(RPC)Locator RpcLocator (远程过程调用定位服务)的进程名是locator.exe,WinXP Home/PRO默认安装的启动类型是手动,依赖于Workstation服务。这一服务和上面的RPC服务并无太多关系,是用来给RPC的命名服务的。其用途简单解释就是,通过它对RPC的命名管理,调用者才能找到被调用者的位置。但由于微软系统注册表的存在,使得这些命名服务在本机上的调用上毫无意义。因此对于一般用户完全可以关闭。 47.Remote Registry RemoteRegistry (远程注册表服务)的进程名是svchost.exe,在WinXP Home下不可用,在WinXP PRO下默认安装的启动类型是自动,依赖于Remote Procedure Call服务。此服务是向其他连机的计算机开放你的注册表,微软总是让这种明显是安全隐患的服务自动启动实在让人费解。不过如果你有这种特殊需求的话可以尝试一下。打开注册表编辑器Regedit,在文件菜单栏里找到"连接网络注册表"这一项,可让你打开甚至编辑其他机器上的注册表。当然那些机器上的 RemoteRegistry也必须是打开的,而且对你计算机的一些相应权限同样必须开放。 48.Removable Storage NtmsSvc (卸除式存放装置服务)的进程名是svchost.exe,在WinXP Home/PRO下默认安装的启动类型是手动,依赖于Remote Procedure Call服务。此服务的名称太容易让人误解,实际上它只是对特殊可移动存储器的管理,比如ZIP软驱和磁带驱动器,不要担心你的CD和DVD等设备。从事图像设计的用户经常会用ZIP同苹果机交换文件,一般人恐怕很少使用这些特殊设备,因此可将其关闭。 49.Routing and Remote Access RemoteAccess (路由和远程访问服务)的进程名是svchost.exe,在WinXP Home/PRO下默认安装的启动类型分别为禁用和手动,依赖于NetBIOSGroup、Remote Procedure Call服务。Routing and Remote Access为软路由,即在一台连接多个网络的计算机上通过运行路由软件,以实现网络间路由的一种方法,相对于硬件路由来说很是方便经济。WinXP也把这个功能集成到系统里来了,不过可能比较少人知道是在哪里配置路由,主要原因就是这个服务默认为关闭。首先启动此服务,网络连接文件夹里会多出一个"传入的连接",值得注意的是,在VPN连接(传入的连接)的属性"Internet协议(TCP/IP)"里一般要指定TCP/IP地址(一般来说都必须是合法地址)才行。感兴趣的朋友可以自己继续研究,而大多数不需要的朋友直接禁用它吧。 50.Secondary Logon Seclogon (二次登录服务)的进程名是svchost.exe,在WinXP Home/PRO下默认安装的启动类型是自动,没有任何服务依存关系。这个服务对应于用户临时权限分配功能,在多用户使用的计算机上,某些用户因为是非管理员权限,导致某些程序无法执行。为了让没有管理员权限的已经登录用户可以使用这些程序,WinXP设计了这个功能来分配临时的管理员权限。打开这个服务后,右键点击鼠标选择"运行方式"将会出现对话框,让你选择执行这个程序的用户身份。对多用户环境下的管理员,这确实是方便的功能,不过依然是以安全作为代价的,对单人环境的笔记本电脑用户来说尤其无用而且危险!所以要谨慎使用。 51.Security Accounts Manager SamSs (安全账户管理服务)的进程名是lsass.exe,在WinXP Home/PRO下默认安装的启动类型是自动,依赖于Remote Procedure Call服务。熟悉WinXP启动过程的用户都知道SAM文件的重要性,SamSs是负责SAM数据库的控制和维护的服务。SAM数据库位于注册表 "HKLM\SAM\SAM"下,可使用Regedit32.exe打开注册表编辑器,并设置适当权限查看SAM中的内容。SAM数据库保存在磁盘上的" 系统盘\windows\system32\config"目录下的sam文件中,在这个目录下还包括一个security文件,是安全数据库的内容,两者有不少关系。SAM数据库中包含了系统中所有组、账户的信息。而WinXP启动时就需要在SAM文件中读取诸如用户名、用户全名(full name)、所属组、描述、密码、注释、是否可以更改密码、密码设置时间等信息。这也是系统中不可关闭的几个基础服务之一,如果服务启动失败,系统就只有重启了。 52.Server Lanmanserver(服务器服务)的进程名是svchost.exe,在WinXP Home/PRO下默认安装的启动类型是自动。Server服务对应的是网络上的文件/打印机器共享,以及网络的路径映射共享功能。没有这些方面的需要你就可以关闭它。 53.Shell Hardware Detection ShellHWDetection (外壳硬件探测服务)的进程名是svchost.exe,在WinXP Home/PRO下默认安装的启动类型是自动,依赖于Remote Procedure Call服务。对这个服务微软是语焉不详,也没有给出详细的硬件描述或列表,不过根据网络上不少人的测试,这个服务主要还是和具有自动运行(播放)功能的硬件有关系,例如数字相机、CD-ROM等。通过这个服务,当这些硬件接上系统或放入相应媒介时,WinXP能自动探测到并做出对应动作。对于外设越来越多的现在,没有把握还是不要轻易关闭它。 54.Smart Card SCardSvr(智能卡服务)的进程名是SCardSvr.exe,在WinXP Home/PRO下默认安装的启动类型是手动,依赖于Plug and Play服务。Smart Card(智能卡)其外型和一般信用卡大小一样,但多了一块指甲大小的IC芯片后,使原本普通的一张卡片变成拥有资料控管与逻辑运算的能力。智能卡包括金融卡、GSM卡等,与我们一般常用的电话IC卡相比,内部的IC线路设计不同。由于卡内本身即已包含了CPU功能、ROM、EEPROM、RAM等元件,智能卡就像一台可随身携带的超微型电脑,可用来储存及处理重要资料。在安全性方面,智能卡具有自我毁灭系统,想窃取卡上的资料非常困难。如果你拥有智能卡及相关的读卡设备就开启这个服务,否则就禁用吧。 55.Smart Card Helper SCardDrv(智能卡协助服务)的进程名是SCardSvr.exe,在WinXP Home/PRO下默认安装的启动类型是手动,它没有任何服务依存关系。只要没有相关的设备就禁用好了。 56.SSDP Discovery Service SSDPSRV (简易服务发现协议之发现服务)的进程名是svchost.exe,在WinXP Home/PRO下默认安装的启动类型是手动。SSDPSRV主要用于局域网上UPnP(Universal Plug and Play,统一即插即用)设备的搜索。UPnP并不同于我们平常熟悉的PnP,UPnP技术PnP对进行了扩展,简化了家庭或企业中智能设备的联网过程。 UPnP规范基于TCP/IP协议和针对设备彼此间通信而制订的其他Internet协议,这就是它之所以被称作"通用"的原因所在-——UPnP技术不依赖于特定的设备驱动程序,而是使用标准协议。与即插即用相比,这种技术的意义在于,能够轻易地使家庭等非专业用户享受到智能化技术带来的更舒适完美的生活,例如,正是UPnP才使得能在网上冲浪的电冰箱成为可能。UPnP是个较新的协议,也不是非常成熟,对应设备在市场上非常罕见,市场上流行的 Linksys BEFSR41W无线路由器是这方面的例子。对于大多数现在还无缘使用此类设备的朋友,关闭这个服务吧。 57.System Event Notification SENS (系统事件通知服务)的进程名是svchost.exe,在WinXP Home/PRO下默认安装的启动类型是自动,依赖于COM+ Event System服务。它的简单描述是"跟踪系统事件,如登录Windows、网络以及电源事件等。将这些事件通知给COM+事件系统‘订阅者(subscriber)’"。这已将服务的内容解释得很清楚了。尽管有人认为这个服务无关紧要,事实上系统是否需要它取决于你在系统里安装了些什么,而许多应用程序的运行是要通过SENS来实现的,所以建议还是让它自动打开为好。 58.System Restore Service Srservice (系统还原服务)的进程名是svchost.exe,在WinXP Home/PRO下默认安装的启动类型是自动,依赖于Remote Procedure Call服务。这是大家都非常熟悉的系统还原功能了,如果不使用的话,先在"我的电脑"属性中的系统还原选项卡关闭,然后在这里将服务禁用即可。 59.Task Scheduler Schedule (计划任务服务)的进程名是svchost.exe,在WinXP Home/PRO下默认安装的启动类型是自动,依赖于Remote Procedure Call服务。此服务支持WinXP的计划任务,它能使程序在预定的时间自动运行,如定期进行磁盘碎片整理、病毒扫描、更新等,可根据自己的需要选择是否开启。 60.TCP/IP NetBIOS Helper LmHosts(TCP/IP NetBIOS 助手服务)的进程名是svchost.exe,在WinXP Home/PRO下默认安装的启动类型是自动,依赖于AFD网络支持环境、NetBios Over TCP/IP服务。该服务能在TCP/IP上提供NetBIOS支持。大家应该对TCP/IP比较熟悉了,相对来说NetBIOS网络协议对读者来说可能比较陌生,它是由IBM开发的一个很古老的协议,当年在局域网上占据主导。由于NetBIOS不具备路由功能,也就是说它的数据包无法跨网段传输,因此在广域网、城域网大行其道的今天,它只能退居配角。其实在Win95/98的网络协议中仍然保留着NetBIOS,不过它已经改名叫NetBEUI (NetBIOS扩展用户接口),是NetBIOS的Microsoft改进版。由于NetBIOS是完全基于局域网的,因此作为访问Internet资源的一般用户可以禁用它,除非你的系统处在小局域网中,而且使用的也正是NetBIOS协议。 61.Telephony TapiSrv (电话服务)的进程名是svchost.exe,在WinXP Home/PRO下默认安装的启动类型是手动,依赖于Plug and Play、Remote Procedure Call服务。简单地说这个服务能为计算机提供电话拨号的能力。如果你使用了任何形式的拨号,不管是用拨号调制解调器还是DSL/Cable连接到 Internet,还是通过电话线连接其他计算机,或是拨打电脑IP电话、发传真等,你就有必要保留这个服务,反之就可关掉它。 62.Telnet TapiSrv(远程登录服务)的进程名是tlntsvr.exe,在WinXP Home下不可用,在WinXP PRO下默认安装的启动类型是手动,依赖于NT LM Security Support Provider、Remote Procedure Call、TCP/IP Protocol Driver服务。这是一个容易遭到误会的服务名称,一般人会误以为这是以前DOS下那个Telnet,关了之后就无法使用BBS。其实它与BBS无关,完全是微软自己的Telnet系统,尽管两者的原理相差不大,即让用户以模拟终端的方式,登录到Internet的某台主机上,一旦连接成功,这些个人计算机就好像是远程计算机的一个终端,可以像使用自己的计算机一样输入命令,运行远程计算机中的程序。基于安全性理由,如果没有特别需求,这个服务一定要关掉禁用。 63.Terminal Services TermService(终端机服务)的进程名是svchost.exe,在WinXP Home/PRO下默认安装的启动类型是手动,依赖于Remote Procedure Call服务。它的简单描述是"允许多位用户连接并控制一台机器,并且在远程计算机上显示桌面和应用程序。这是远程桌面(包括管理员的远程桌面)、快速用户转换、远程协助和终端服务器的基础结构"。这段描述已将该服务的用途解释得很清楚了,需要强调的是,这些方便都是以安全为代价的,如果平时不用就一定要关掉。 64.Themes Themes(主题服务)的进程名是svchost.exe,在WinXP Home/PRO下默认安装的启动类型是自动,没有服务依存关系。很多人都喜欢使用XP的布景主题,不过如果用户没有使用就关闭好了。 65.Uninterruptible Power Supply UPS (UPS电源管理服务)的进程名是UPS.exe,在WinXP Home/PRO下默认安装的启动类型是手动,没有服务依存关系。它的简单描述是"管理连接到计算机的不间断电源(UPS)",同样很好理解,UPS(不间断电源供应)一般用户极少用到,除非你的电源供应器具 66.Universal Plug and Play Device Host UPNPhost (统一即插即用驱动主机服务)的进程名是svchost.exe,在WinXP Home/PRO下默认安装的启动类型是手动,依赖于SSDP Discovery Service服务。它同SSDP Discovery Service是继承关系,后者搜索发现UPnP设备,而UPNPhost为UPnP设备提供驱动支持。当然通常情况下关闭即可。 67.Upload Manager Uploadmgr (上传管理服务)的进程名是svchost.exe,在WinXP Home/PRO下默认安装的启动类型是自动,依赖于Remote Procedure Call服务。这个服务的具体效果不明,关闭它后实际使用中的网络上传下载并没有受到什么影响,也许它跟微软的服务器和相关服务有关?请根据需要关闭。 68.Volume Shadow Copy VSS(上传管理服务)的进程名是 vssvc.exe,在WinXP Home/PRO下默认安装的启动类型是手动,依赖于Remote Procedure Call服务。它的简单描述是"管理并执行用于备份和其他目的的卷影复制",依然是和WinXP备份有关的服务,它默认就是关闭的,也并没有在笔者的机器上对备份造成影响,其具体应用依是未解之谜。 69.WebClient WebClient (Web客户端服务)的进程名是svchost.exe,在WinXP Home/PRO下默认安装的启动类型是自动,依赖于WebDav Client Redirector系统组件。使用WebDav可将档案或数据夹上传到某个Web服务,这个服务对于未来.NET意义更大。基于安全性的理由,现在你可以尝试关闭它。 70.Windows Audio AudioSrv(Windows音频服务)的进程名是svchost.exe,在WinXP Home/PRO下默认安装的启动类型是自动,依赖于Plug and Play、Remote Procedure Call服务。理解这个服务再简单不过了,如果你的机器没有声卡可以关闭它。 71.Windows Image Acquisition(WIA) Stisvc (Windows影像取得服务)的进程名是svchost.exe,在WinXP Home/PRO下默认安装的启动类型是手动,依赖于Remote Procedure Call服务。该服务为控制面板中的"扫描仪和照相机"功能提供支持。通过这个功能,用户在安装好设备驱动后无需要再安装相关管理软件,就能轻易操作扫描仪和数码相机来获得图像。不需要的用户可关闭它。 72.Windows Installer MSIServer (Windows安装服务)的进程名是msiexec\.exe,在WinXP Home/PRO下默认安装的启动类型是手动,依赖于Remote Procedure Call服务。这一服务同Application Management服务基本是一样的。从微软的解释看,Windows Installer服务应该是.MSI文件的最直接执行者。同样让人奇怪的是,这个服务默认就是关闭的,可.MSI文件的安装、修复或删除却很正常,和备份工具一样,究竟这个服务在系统中扮演什么角色,如何工作,只有微软的工程师才知道了。 73.Windows Time W32Time(Windows时间服务)的进程名是svchost.exe,在WinXP Home/PRO下默认安装的启动类型是自动,它没有服务依存关系。这一服务对应WinXP的Internet对时服务,如不需要关闭即可。 74.Windows Management Instrumentation(WMI) Winmgmt (Windows管理规范服务)的进程名是svchost.exe,在WinXP Home/PRO下默认安装的启动类型是自动,依赖于Event Log、Remote Procedure Call服务。WMI是Windows中的基础管理结构,它通过一组常用接口来控制和监视系统(如对系统属性的查看与更改、设置用户权限等)。WMI为访问大量的Windows管理数据提供了一个统一的机制。WMI通过脚本、C++程序接口、.NET类(系统管理)和命令行工具(WMIC)提供了对信息的访问。WMI的功能还包括事件、远程、查询、查看、计划和实施用户扩展及更多内容。总而言之,虽然在服务管理工具中可以关闭,但最好别动它,否则会出现许多莫名的问题。 75.Windows Management Instrumentation Driver Extensions Wmi (Windows管理规范驱动延伸服务)的进程名是svchost.exe,在WinXP Home下不可用,在WinXP PRO下默认安装的启动类型是手动,没有服务依存关系。微软的白皮书介绍,该服务是作为WMI服务在驱动程序方面的一个延伸,简单说主要就是为让系统方便地获知计算机中OEMs(original equipment manufacturers)以及IHVs(independent hardware vendors)等与硬件厂商相关的硬件信息。不过让人奇怪的是,为什么它在WinXP Home下不可用呢? 76.Wireless Zero Configuration WZCSVC (无线配置服务)的进程名是svchost.exe,在WinXP Home/PRO下默认安装的启动类型是自动,依赖于NDIS Usermode I/O Protocol组件、Remote Procedure Call服务。它的简单描述是"为您的802.11适配器提供自动配置"。802.11是大家都比较熟悉的无线局域网协议标准了,其已经在市场上占据了优势。当然,802.11协议、蓝牙标准和HomeRF工业标准是无线局域网所有标准中最主要的竞争对手,它们也各有优劣。然而802.11b无线局域网技术已经在美国得到了广泛的应用,所以微软的WinXP内置服务支持也就不足为奇了。如果你没有使用无线网络适配卡装置,那么可以关闭服务。 77.WMI Performance Adapter WmiApSrv (WMI性能适配器服务)的进程名是wmiapsrv.exe,在WinXP Home/PRO下默认安装的启动类型是手动,依赖于Remote Procedure Call服务。此服务提供了从WMI HiPerf 提供者获得的性能库信息,需要以手动方式进行配置,并不会在缺省状态下实现运行。该服务太过专业,无法解释得浅显,对于普通的使用者最好保持其默认状态。 78.Workstation Lanmanworkstation(工作站服务)的进程名是svchost.exe,在WinXP Home/PRO下默认安装的启动类型是自动,它不依赖于其他服务,但有不少服务都依赖它。该服务同样为基础服务,请保持其默认状态不要关闭。 游戏外挂技术基础与实现(好文共享)要想在修改游戏中做到百战百胜,是需要相当丰富的计算机知识的。有很多计算机高手就是从玩游戏,修改游戏中,逐步对计算机产生浓厚的兴趣,逐步成长起来的。
不要在羡慕别人能够做到的,因为别人能够做的你也能够!我相信你们看了本教程后,会对游戏有一个全新的认识,呵呵,因为我是个好老师!(别拿鸡蛋砸我呀,救
命啊!#¥%……*) 不过要想从修改游戏中学到知识,增加自己的计算机水平,可不能只是靠修改游戏呀!要知道,修改游戏只是一个验证你对你所了解的某些计
算机知识的理解程度的场所,只能给你一些发现问题、解决问题的机会,只能起到帮助你提高学习计算机的兴趣的作用,而决不是学习计算机的捷径。
一:什么叫外挂?
现在的网络游戏多是基于Internet上客户/服务器模式,服务端程序运行在游戏服务器上,游戏的设计者在其中创造一个庞大的游戏空间,各地的玩家可以通过运
行客户端程序同时登录到游戏中。简单地说,网络游戏实际上就是由游戏开发商提供一个游戏环境,而玩家们就是在这个环境中相对自由和开放地进行游戏操作。那么
既然在网络游戏中有了服务器这个概念,我们以前传统的修改游戏方法就显得无能为力了。记得我们在单机版的游戏中,随心所欲地通过内存搜索来修改角色的各种属
性,这在网络游戏中就没有任何用处了。因为我们在网络游戏中所扮演角色的各种属性及各种重要资料都存放在服务器上,在我们自己机器上(客户端)只是显示角色
的状态,所以通过修改客户端内存里有关角色的各种属性是不切实际的。那么是否我们就没有办法在网络游戏中达到我们修改的目的?回答是"否 "。
我们知道Internet客户/服务器模式的通讯一般采用TCP/IP通信协议,数据交换是通过IP数据包的传输来实现的,一般来说我们客户端向服务器发出某些请求,比
如移动、战斗等指令都是通过封包的形式和服务器交换数据。那么我们把本地发出消息称为SEND,意思就是发送数据,服务器收到我们SEND的消息后,会按照既定的程
序把有关的信息反馈给客户端,比如,移动的坐标,战斗的类型。那么我们把客户端收到服务器发来的有关消息称为RECV。知道了这个道理,接下来我们要做的工作就
是分析客户端和服务器之间往来的数据(也就是封包),这样我们就可以提取到对我们有用的数据进行修改,然后模拟服务器发给客户端,或者模拟客户端发送给服务
器,这样就可以实现我们修改游戏的目的了。
目前除了修改游戏封包来实现修改游戏的目的,我们也可以修改客户端的有关程序来达到我们的要求。我们知道目前各个服务器的运算能力是有限的,特别在游戏
中,游戏服务器要计算游戏中所有玩家的状况几乎是不可能的,所以有一些运算还是要依靠我们客户端来完成,这样又给了我们修改游戏提供了一些便利。比如我们可
以通过将客户端程序脱壳来发现一些程序的判断分支,通过跟踪调试我们可以把一些对我们不利的判断去掉,以此来满足我们修改游戏的需求。在下几个章节中,我们
将给大家讲述封包的概念,和修改跟踪客户端的有关知识。大家准备好了吗?
游戏数据格式和存储:
在进行我们的工作之前,我们需要掌握一些关于计算机中储存数据方式的知识和游戏中储存数据的特点。本章节是提供给菜鸟级的玩家看的,如果你是高手就可以
跳过了,如果,你想成为无坚不摧的剑客,那么,这些东西就会花掉你一些时间;如果,你只想作个江湖的游客的话,那么这些东西,了解与否无关紧要。是作剑客,
还是作游客,你选择吧!
现在我们开始!首先,你要知道游戏中储存数据的几种格式,这几种格式是:字节(BYTE)、字 (WORD)和双字(DOUBLE WORD),或者说是8位、16位和32位储存方式
。字节也就是8位方式能储存0~255的数字;字或说是16位储存方式能储存0~65535的数;双字即32位方式能储存0~4294967295的数。
为何要了解这些知识呢?在游戏中各种参数的最大值是不同的,有些可能100左右就够了,比如,金庸群侠传中的角色的等级、随机遇敌个数等等。而有些却需要
大于255甚至大于65535,象金庸群侠传中角色的金钱值可达到数百万。所以,在游戏中各种不同的数据的类型是不一样的。在我们修改游戏时需要寻找准备修改的数据
的封包,在这种时候,正确判断数据的类型是迅速找到正确地址的重要条件。
在计算机中数据以字节为基本的储存单位,每个字节被赋予一个编号,以确定各自的位置。这个编号我们就称为地址。
在需要用到字或双字时,计算机用连续的两个字节来组成一个字,连续的两个字组成一个双字。而一个字或双字的地址就是它们的低位字节的地址。现在我们常用
的Windows 9x操作系统中,地址是用一个32位的二进制数表示的。而在平时我们用到内存地址时,总是用一个8位的16进制数来表示它。
二进制和十六进制又是怎样一回事呢?
简单说来,二进制数就是一种只有0和1两个数码,每满2则进一位的计数进位法。同样,16进制就是每满十六就进一位的计数进位法。16进制有0--F十六个数字,
它为表示十到十五的数字采用了A、B、C、D、E、F六个数字,它们和十进制的对应关系是:A对应于10,B对应于11,C对应于12,D对应于13,E对应于14,F对应于15。
而且,16进制数和二进制数间有一个简单的对应关系,那就是;四位二进制数相当于一位16进制数。比如,一个四位的二进制数1111就相当于16进制的F,1010就相当
于A。
了解这些基础知识对修改游戏有着很大的帮助,下面我就要谈到这个问题。由于在计算机中数据是以二进制的方式储存的,同时16进制数和二进制间的转换关系十
分简单,所以大部分的修改工具在显示计算机中的数据时会显示16进制的代码,而且在你修改时也需要输入16进制的数字。你清楚了吧?
在游戏中看到的数据可都是十进制的,在要寻找并修改参数的值时,可以使用Windows提供的计算器来进行十进制和16进制的换算,我们可以在开始菜单里的程序
组中的附件中找到它。
现在要了解的知识也差不多了!不过,有个问题在游戏修改中是需要注意的。在计算机中数据的储存方式一般是低位数储存在低位字节,高位数储存在高位字节。
比如,十进制数41715转换为16进制的数为A2F3,但在计算机中这个数被存为F3A2。
看了以上内容大家对数据的存贮和数据的对应关系都了解了吗? 好了,接下来我们要告诉大家在游戏中,封包到底是怎么一回事了,来!大家把袖口卷起来,让
我们来干活吧!
二:什么是封包?
怎么截获一个游戏的封包?怎么去检查游戏服务器的ip地址和端口号? Internet用户使用的各种信息服务,其通讯的信息最终均可以归结为以IP包为单位的信息
传送,IP包除了包括要传送的数据信息外,还包含有信息要发送到的目的IP地址、信息发送的源IP地址、以及一些相关的控制信息。当一台路由器收到一个IP数据包时
,它将根据数据包中的目的IP地址项查找路由表,根据查找的结果将此IP数据包送往对应端口。下一台IP路由器收到此数据包后继续转发,直至发到目的地。路由器之
间可以通过路由协议来进行路由信息的交换,从而更新路由表。
那么我们所关心的内容只是IP包中的数据信息,我们可以使用许多监听网络的工具来截获客户端与服务器之间的交换数据,下面就向你介绍其中的一种工具:WPE
。
WPE使用方法:执行WPE会有下列几项功能可选择:
SELECT GAME选择目前在记忆体中您想拦截的程式,您只需双击该程式名称即可。
TRACE追踪功能。用来追踪撷取程式送收的封包。WPE必须先完成点选欲追踪的程式名称,才可以使用此项目。按下Play键开始撷取程式收送的封包。您可以随时按
下 | | 暂停追踪,想继续时请再按下 | | 。按下正方形可以停止撷取封包并且显示所有已撷取封包内容。若您没按下正方形停止键,追踪的动作将依照OPTION里的设
定值自动停止。如果您没有撷取到资料,试试将OPTION里调整为Winsock Version 2。WPE 及 Trainers 是设定在显示至少16 bits 颜色下才可执行。
FILTER过滤功能。用来分析所撷取到的封包,并且予以修改。
SEND PACKET送出封包功能。能够让您送出假造的封包。
TRAINER MAKER制作修改器。
OPTIONS设定功能。让您调整WPE的一些设定值。
FILTER的详细教学
- 当FILTER在启动状态时 ,ON的按钮会呈现红色。- 当您启动FILTER时,您随时可以关闭这个视窗。FILTER将会保留在原来的状态,直到您再按一次 on / off
钮。- 只有FILTER启用钮在OFF的状态下,才可以勾选Filter前的方框来编辑修改。- 当您想编辑某个Filter,只要双击该Filter的名字即可。
NORMAL MODE:
范例:
当您在 Street Fighter Online ﹝快打旋风线上版﹞游戏中,您使用了两次火球而且击中了对方,这时您会撷取到以下的封包:SEND-> 0000 08 14 21 06 01 04
SEND-> 0000 02 09 87 00 67 FF A4 AA 11 22 00 00 00 00 SEND-> 0000 03 84 11 09 11 09 SEND-> 0000 0A 09 C1 10 00 00 FF 52 44 SEND-> 0000 0A 09 C1 10
00 00 66 52 44
您的第一个火球让对方减了16滴﹝16 = 10h﹞的生命值,而您观察到第4跟第5个封包的位置4有10h的值出现,应该就是这里了。
您观察10h前的0A 09 C1在两个封包中都没改变,可见得这3个数值是发出火球的关键。
因此您将0A 09 C1 10填在搜寻列﹝SEARCH﹞,然后在修改列﹝MODIFY﹞的位置4填上FF。如此一来,当您再度发出火球时,FF会取代之前的10,也就是攻击力为
255的火球了!
ADVANCED MODE:
范例:当您在一个游戏中,您不想要用真实姓名,您想用修改过的假名传送给对方。在您使用TRACE后,您会发现有些封包里面有您的名字出现。假设您的名字是
Shadow,换算成16进位则是﹝53 68 61 64 6F 77﹞;而您打算用moon﹝6D 6F 6F 6E 20 20﹞来取代他。1) SEND-> 0000 08 14 21 06 01 042) SEND-> 0000 01 06
99 53 68 61 64 6F 77 00 01 05 3) SEND-> 0000 03 84 11 09 11 094) SEND-> 0000 0A 09 C1 10 00 53 68 61 64 6F 77 00 11 5) SEND-> 0000 0A 09 C1 10 00
00 66 52 44
但是您仔细看,您的名字在每个封包中并不是出现在相同的位置上
- 在第2个封包里,名字是出现在第4个位置上- 在第4个封包里,名字是出现在第6个位置上
在这种情况下,您就需要使用ADVANCED MODE- 您在搜寻列﹝SEARCH﹞填上:53 68 61 64 6F 77 ﹝请务必从位置1开始填﹞- 您想要从原来名字Shadow的第一个字
母开始置换新名字,因此您要选择从数值被发现的位置开始替代连续数值﹝from the position of the chain found﹞。- 现在,在修改列﹝MODIFY﹞000的位置填上
:6D 6F 6F 6E 20 20 ﹝此为相对应位置,也就是从原来搜寻栏的+001位置开始递换﹞- 如果您想从封包的第一个位置就修改数值,请选择﹝from the beginning of
the packet﹞
了解一点TCP/IP协议常识的人都知道,互联网是将信息数据打包之后再传送出去的。每个数据包分为头部信息和数据信息两部分。头部信息包括数据包的发送地址
和到达地址等。数据信息包括我们在游戏中相关操作的各项信息。那么在做截获封包的过程之前我们先要知道游戏服务器的IP地址和端口号等各种信息,实际上最简单
的是看看我们游戏目录下,是否有一个SERVER.INI的配置文件,这个文件里你可以查看到个游戏服务器的IP地址,比如金庸群侠传就是如此,那么除了这个我们还可以
在DOS下使用NETSTAT这个命令,
NETSTAT命令的功能是显示网络连接、路由表和网络接口信息,可以让用户得知目前都有哪些网络连接正在运作。或者你可以使用木马客星等工具来查看网络连接
。工具是很多的,看你喜欢用哪一种了。
NETSTAT命令的一般格式为:NETSTAT [选项]
命令中各选项的含义如下:-a 显示所有socket,包括正在监听的。-c 每隔1秒就重新显示一遍,直到用户中断它。-i 显示所有网络接口的信息。-n 以网络IP地
址代替名称,显示出网络连接情形。-r 显示核心路由表,格式同"route -e"。-t 显示TCP协议的连接情况。-u 显示UDP协议的连接情况。-v 显示正在进行的工作。
三:怎么来分析我们截获的封包?
首先我们将WPE截获的封包保存为文本文件,然后打开它,这时会看到如下的数据(这里我们以金庸群侠传里PK店小二客户端发送的数据为例来讲解):
第一个文件:SEND-> 0000 E6 56 0D 22 7E 6B E4 17 13 13 12 13 12 13 67 1BSEND-> 0010 17 12 DD 34 12 12 12 12 17 12 0E 12 12 12 9BSEND-> 0000 E6
56 1E F1 29 06 17 12 3B 0E 17 1ASEND-> 0000 E6 56 1B C0 68 12 12 12 5ASEND-> 0000 E6 56 02 C8 13 C9 7E 6B E4 17 10 35 27 13 12 12SEND-> 0000 E6 56
17 C9 12
第二个文件:SEND-> 0000 83 33 68 47 1B 0E 81 72 76 76 77 76 77 76 02 7ESEND-> 0010 72 77 07 1C 77 77 77 77 72 77 72 77 77 77 6DSEND-> 0000 83
33 7B 94 4C 63 72 77 5E 6B 72 F3SEND-> 0000 83 33 7E A5 21 77 77 77 3FSEND-> 0000 83 33 67 AD 76 CF 1B 0E 81 72 75 50 42 76 77 77SEND-> 0000 83 33
72 AC 77
我们发现两次PK店小二的数据格式一样,但是内容却不相同,我们是PK的同一个NPC,为什么会不同呢? 原来金庸群侠传的封包是经过了加密运算才在网路上传输
的,那么我们面临的问题就是如何将密文解密成明文再分析了。
因为一般的数据包加密都是异或运算,所以这里先讲一下什么是异或。简单的说,异或就是"相同为0,不同为1"(这是针对二进制按位来讲的),举个例子,0001
和0010异或,我们按位对比,得到异或结果是0011,计算的方法是:0001的第4位为0,0010的第4位为0,它们相同,则异或结果的第4位按照"相同为0,不同为1"的原
则得到0,0001的第3位为 0,0010的第3位为0,则异或结果的第3位得到0,0001的第2位为0,0010的第2位为1,则异或结果的第2位得到1,0001的第1位为1, 0010的
第1位为0,则异或结果的第1位得到1,组合起来就是0011。异或运算今后会遇到很多,大家可以先熟悉熟悉,熟练了对分析很有帮助的。
下面我们继续看看上面的两个文件,按照常理,数据包的数据不会全部都有值的,游戏开发时会预留一些字节空间来便于日后的扩充,也就是说数据包里会存在一
些"00"的字节,观察上面的文件,我们会发现文件一里很多"12",文件二里很多"77",那么这是不是代表我们说的"00"呢?推理到这里,我们就开始行动吧!
我们把文件一与"12"异或,文件二与"77"异或,当然用手算很费事,我们使用"M2M 1.0 加密封包分析工具"来计算就方便多了。得到下面的结果:
第一个文件:1 SEND-> 0000 F4 44 1F 30 6C 79 F6 05 01 01 00 01 00 01 75 09SEND-> 0010 05 00 CF 26 00 00 00 00 05 00 1C 00 00 00 892 SEND-> 0000
F4 44 0C E3 3B 13 05 00 29 1C 05 083 SEND-> 0000 F4 44 09 D2 7A 00 00 00 484 SEND-> 0000 F4 44 10 DA 01 DB 6C 79 F6 05 02 27 35 01 00 005 SEND->
0000 F4 44 05 DB 00
第二个文件:1 SEND-> 0000 F4 44 1F 30 6C 79 F6 05 01 01 00 01 00 01 75 09SEND-> 0010 05 00 70 6B 00 00 00 00 05 00 05 00 00 00 1A2 SEND-> 0000
F4 44 0C E3 3B 13 05 00 29 1C 05 843 SEND-> 0000 F4 44 09 D2 56 00 00 00 484 SEND-> 0000 F4 44 10 DA 01 B8 6C 79 F6 05 02 27 35 01 00 005 SEND->
0000 F4 44 05 DB 00
哈,这一下两个文件大部分都一样啦,说明我们的推理是正确的,上面就是我们需要的明文!
接下来就是搞清楚一些关键的字节所代表的含义,这就需要截获大量的数据来分析。
首先我们会发现每个数据包都是"F4 44"开头,第3个字节是变化的,但是变化很有规律。我们来看看各个包的长度,发现什么没有?对了,第3个字节就是包的长
度!通过截获大量的数据包,我们判断第4个字节代表指令,也就是说客户端告诉服务器进行的是什么操作。例如向服务器请求战斗指令为"30",战斗中移动指令为
"D4"等。 接下来,我们就需要分析一下上面第一个包"F4 44 1F 30 6C 79 F6 05 01 01 00 01 00 01 75 09 05 00 CF 26 00 00 00 00 05 00 1C 00 00 00 89",在
这个包里包含什么信息呢?应该有通知服务器你PK的哪个NPC吧,我们就先来找找这个店小二的代码在什么地方。我们再PK一个小喽罗(就是大理客栈外的那个咯):
SEND-> 0000 F4 44 1F 30 D4 75 F6 05 01 01 00 01 00 01 75 09SEND-> 0010 05 00 8A 19 00 00 00 00 11 00 02 00 00 00 C0 我们根据常理分析,游戏里的NPC
种类虽然不会超过65535(FFFF),但开发时不会把自己限制在字的范围,那样不利于游戏的扩充,所以我们在双字里看看。通过"店小二"和"小喽罗"两个包的对比,
我们把目标放在"6C 79 F6 05"和"CF 26 00 00"上。(对比一下很容易的,但你不能太迟钝咯,呵呵)我们再看看后面的包,在后面的包里应该还会出现NPC的代码,
比如移动的包,游戏允许观战,服务器必然需要知道NPC的移动坐标,再广播给观战的其他玩家。在后面第4个包"SEND-> 0000 F4 44 10 DA 01 DB 6C 79 F6 05 02 27
35 01 00 00"里我们又看到了"6C 79 F6 05",初步断定店小二的代码就是它了!(这分析里边包含了很多工作的,大家可以用WPE截下数据来自己分析分析)
第一个包的分析暂时就到这里(里面还有的信息我们暂时不需要完全清楚了)
我们看看第4个包"SEND-> 0000 F4 44 10 DA 01 DB 6C 79 F6 05 02 27 35 01 00 00",再截获PK黄狗的包,(狗会出来2只哦)看看包的格式:SEND-> 0000 F4
44 1A DA 02 0B 4B 7D F6 05 02 27 35 01 00 00SEND-> 0010 EB 03 F8 05 02 27 36 01 00 00
根据上面的分析,黄狗的代码为"4B 7D F6 05"(100040011),不过两只黄狗服务器怎样分辨呢?看看"EB 03 F8 05"(100140011),是上一个代码加上100000,
呵呵,这样服务器就可以认出两只黄狗了。我们再通过野外遇敌截获的数据包来证实,果然如此。
那么,这个包的格式应该比较清楚了:第3个字节为包的长度,"DA"为指令,第5个字节为NPC个数,从第7个字节开始的10个字节代表一个NPC的信息,多一个NPC就
多10个字节来表示。
大家如果玩过网金,必然知道随机遇敌有时会出现增援,我们就利用游戏这个增援来让每次战斗都会出现增援的NPC吧。
通过在战斗中出现增援截获的数据包,我们会发现服务器端发送了这样一个包:F4 44 12 E9 EB 03 F8 05 02 00 00 03 00 00 00 00 00 00 第5-第8个字节为增
援NPC的代码(这里我们就简单的以黄狗的代码来举例)。那么,我们就利用单机代理技术来同时欺骗客户端和服务器吧!
好了,呼叫NPC的工作到这里算是完成了一小半,接下来的事情,怎样修改封包和发送封包,我们下节继续讲解吧.
四:怎么冒充"客户端"向"服务器"发我们需要的封包?
这里我们需要使用一个工具,它位于客户端和服务器端之间,它的工作就是进行数据包的接收和转发,这个工具我们称为代理。如果代理的工作单纯就是接收和转
发的话,这就毫无意义了,但是请注意:所有的数据包都要通过它来传输,这里的意义就重大了。我们可以分析接收到的数据包,或者直接转发,或者修改后转发,或
者压住不转发,甚至伪造我们需要的封包来发送。
下面我们继续讲怎样来同时欺骗服务器和客户端,也就是修改封包和伪造封包。 通过我们上节的分析,我们已经知道了打多个NPC的封包格式,那么我们就动手吧
!
首先我们要查找客户端发送的包,找到战斗的特征,就是请求战斗的第1个包,我们找"F4 44 1F 30"这个特征,这是不会改变的,当然是要解密后来查找哦。 找
到后,表示客户端在向服务器请求战斗,我们不动这个包,转发。继续向下查找,这时需要查找的特征码不太好办,我们先查找"DA",这是客户端发送NPC信息的数据
包的指令,那么可能其他包也有"DA",没关系,我们看前3个字节有没有"F4 44"就行了。找到后,我们的工作就开始了!
我们确定要打的NPC数量。这个数量不能很大,原因在于网金的封包长度用一个字节表示,那么一个包可以有255个字节,我们上面分析过,增加一个NPC要增加10
个字节,所以大家算算就知道,打20个NPC比较合适。
然后我们要把客户端原来的NPC代码分析计算出来,因为增加的NPC代码要加上100000哦。再把我们增加的NPC代码计算出来,并且组合成新的封包,注意代表包长
度的字节要修改啊,然后转发到服务器,这一步在编写程序的时候要注意算法,不要造成较大延迟。
上面我们欺骗服务器端完成了,欺骗客户端就简单了。
发送了上面的封包后,我们根据新增NPC代码构造封包马上发给客户端,格式就是"F4 44 12 E9 NPC代码 02 00 00 03 00 00 00 00 00 00",把每个新增的NPC都构
造这样一个包,按顺序连在一起发送给客户端,客户端也就被我们骗过了,很简单吧。
以后战斗中其他的事我们就不管了,尽情地开打吧.一、 前言
所谓游戏外挂,其实是一种游戏外辅程序,它可以协助玩家自动产生游戏动作、修
改游戏网络数据包以及修改游 戏内存数据等,以实现玩家用最少的时间和金钱去完成功力升级和过关斩将。虽然,现
在对游戏外挂程序的“合法” 身份众说纷纭,在这里我不想对此发表任何个人意见,让时间去说明一切吧。
不管游戏外挂程序是不是“合法”身份,但是它却是具有一定的技术含量的,在这
些小小程序中使用了许多高端 技术,如拦截Sock技术、拦截API技术、模拟键盘与鼠标技术、直接修改程序内存技术
等等。本文将对常见的游戏外挂 中使用的技术进行全面剖析。
二、认识外挂
游戏外挂的历史可以追溯到单机版游戏时代,只不过当时它使用了另一个更通俗易
懂的名字??游戏修改器。它可 以在游戏中追踪锁定游戏主人公的各项能力数值。这样玩家在游戏中可以达到主角不掉
血、不耗费魔法、不消耗金钱 等目的。这样降低了游戏的难度,使得玩家更容易通关。
随着网络游戏的时代的来临,游戏外挂在原有的功能之上进行了新的发展,它变得
更加多种多样,功能更加强大 ,操作更加简单,以至有些游戏的外挂已经成为一个体系,比如《石器时代》,外挂品
种达到了几十种,自动战斗、 自动行走、自动练级、自动补血、加速、不遇敌、原地遇敌、快速增加经验值、按键精
灵……几乎无所不包。 游戏外挂的设计主要是针对于某个游戏开发的,我们可以根据它针对的游戏的类型
可大致可将外挂分为两种大类 。
一类是将游戏中大量繁琐和无聊的攻击动作使用外挂自动完成,以帮助玩家轻松搞
定攻击对象并可以快速的增加 玩家的经验值。比如在《龙族》中有一种工作的设定,玩家的工作等级越高,就可以驾
驭越好的装备。但是增加工作 等级却不是一件有趣的事情,毋宁说是重复枯燥的机械劳动。如果你想做法师用的杖,
首先需要做基本工作--?砍树。 砍树的方法很简单,在一棵大树前不停的点鼠标就可以了,每10000的经验升一级。这
就意味着玩家要在大树前不停的 点击鼠标,这种无聊的事情通过"按键精灵"就可以解决。外挂的"按键精灵"功能可以让
玩家摆脱无趣的点击鼠标的工 作。
另一类是由外挂程序产生欺骗性的网络游戏封包,并将这些封包发送到网络游戏服
务器,利用这些虚假信息欺骗 服务器进行游戏数值的修改,达到修改角色能力数值的目的。这类外挂程序针对性很
强,一般在设计时都是针对某个 游戏某个版本来做的,因为每个网络游戏服务器与客户端交流的数据包各不相同,外挂
程序必须要对欺骗的网络游戏 服务器的数据包进行分析,才能产生服务器识别的数据包。这类外挂程序也是当前最流
利的一类游戏外挂程序。 另外,现在很多外挂程序功能强大,不仅实现了自动动作代理和封包功能,而且还
提供了对网络游戏的客户端程 序的数据进行修改,以达到欺骗网络游戏服务器的目的。我相信,随着网络游戏商家的
反外挂技术的进展,游戏外挂 将会产生更多更优秀的技术,让我们期待着看场技术大战吧......
三、外挂技术综述
可以将开发游戏外挂程序的过程大体上划分为两个部分:
前期部分工作是对外挂的主体游戏进行分析,不同类型的外挂分析主体游戏的内容
也不相同。如外挂为上述谈到 的外挂类型中的第一类时,其分析过程常是针对游戏的场景中的攻击对象的位置和分布
情况进行分析,以实现外挂自 动进行攻击以及位置移动。如外挂为外挂类型中的第二类时,其分析过程常是针对游戏
服务器与客户端之间通讯包数 据的结构、内容以及加密算法的分析。因网络游戏公司一般都不会公布其游戏产品的通
讯包数据的结构、内容和加密 算法的信息,所以对于开发第二类外挂成功的关键在于是否能正确分析游戏包数据的结
构、内容以及加密算法,虽然 可以使用一些工具辅助分析,但是这还是一种坚苦而复杂的工作。
后期部分工作主要是根据前期对游戏的分析结果,使用大量的程序开发技术编写外
挂程序以实现对游戏的控制或 修改。如外挂程序为第一类外挂时,通常会使用到鼠标模拟技术来实现游戏角色的自动
位置移动,使用键盘模拟技术 来实现游戏角色的自动攻击。如外挂程序为第二类外挂时,通常会使用到挡截Sock和挡
截API函数技术,以挡截游戏服 务器传来的网络数据包并将数据包修改后封包后传给游戏服务器。另外,还有许多外挂
使用对游戏客户端程序内存数 据修改技术以及游戏加速技术。
本文主要是针对开发游戏外挂程序后期使用的程序开发技术进行探讨,重点介绍的
如下几种在游戏外挂中常使用 的程序开发技术:
● 动作模拟技术:主要包括键盘模拟技术和鼠标模拟技术。
● 封包技术:主要包括挡截Sock技术和挡截API技术。四、动作模拟技术
我们在前面介绍过,几乎所有的游戏都有大量繁琐和无聊的攻击动作以增加玩家的
功力,还有那些数不完的迷宫 ,这些好像已经成为了角色游戏的代名词。现在,外挂可以帮助玩家从这些繁琐而无聊
的工作中摆脱出来,专注于游 戏情节的进展。外挂程序为了实现自动角色位置移动和自动攻击等功能,需要使用到键
盘模拟技术和鼠标模拟技术。 下面我们将重点介绍这些技术并编写一个简单的实例帮助读者理解动作模拟技术的实现
过程。 1. 鼠标模拟技术
几乎所有的游戏中都使用了鼠标来改变角色的位置和方向,玩家仅用一个小小的鼠 标,就可以使角色畅游天下。 那么,我们如何实现在没有玩家的参与下角色也可以自动行走呢。其实实现这个并不
难,仅仅几个Windows API函数就 可以搞定,让我们先来认识认识这些API函数。
(1) 模拟鼠标动作API函数mouse_event,它可以实现模拟鼠标按下和放开等动作。
VOID mouse_event(
DWORD dwFlags, // 鼠标动作标识。 DWORD dx, // 鼠标水平方向位置。 DWORD dy, // 鼠标垂直方向位置。 DWORD dwData, // 鼠标轮子转动的数量。 DWORD dwExtraInfo // 一个关联鼠标动作辅加信息。 ); 其中,dwFlags表示了各种各样的鼠标动作和点击活动,它的常用取值如下:
MOUSEEVENTF_MOVE 表示模拟鼠标移动事件。
MOUSEEVENTF_LEFTDOWN 表示模拟按下鼠标左键。
MOUSEEVENTF_LEFTUP 表示模拟放开鼠标左键。
MOUSEEVENTF_RIGHTDOWN 表示模拟按下鼠标右键。
MOUSEEVENTF_RIGHTUP 表示模拟放开鼠标右键。
MOUSEEVENTF_MIDDLEDOWN 表示模拟按下鼠标中键。
MOUSEEVENTF_MIDDLEUP 表示模拟放开鼠标中键。
(2)、设置和获取当前鼠标位置的API函数。获取当前鼠标位置使用GetCursorPos()
函数,设置当前鼠标位置使用 SetCursorPos()函数。
BOOL GetCursorPos(
LPPOINT lpPoint // 返回鼠标的当前位置。 ); BOOL SetCursorPos( int X, // 鼠标的水平方向位置。 int Y //鼠标的垂直方向位置。 ); 通常游戏角色的行走都是通过鼠标移动至目的地,然后按一下鼠标的按钮就搞定
了。下面我们使用上面介绍的API 函数来模拟角色行走过程。
CPoint oldPoint,newPoint;
GetCursorPos(&oldPoint); //保存当前鼠标位置。 newPoint.x = oldPoint.x+40; newPoint.y = oldPoint.y+10; SetCursorPos(newPoint.x,newPoint.y); //设置目的地位置。 mouse_event(MOUSEEVENTF_RIGHTDOWN,0,0,0,0);//模拟按下鼠标右键。 mouse_event(MOUSEEVENTF_RIGHTUP,0,0,0,0);//模拟放开鼠标右键。 2. 键盘模拟技术
在很多游戏中,不仅提供了鼠标的操作,而且还提供了键盘的操作,在对攻击对象
进行攻击时还可以使用快捷键 。为了使这些攻击过程能够自动进行,外挂程序需要使用键盘模拟技术。像鼠标模拟技
术一样,Windows API也提供了 一系列API函数来完成对键盘动作的模拟。
模拟键盘动作API函数keydb_event,它可以模拟对键盘上的某个或某些键进行按下
或放开的动作。 VOID keybd_event(
BYTE bVk, // 虚拟键值。 BYTE bScan, // 硬件扫描码。 DWORD dwFlags, // 动作标识。 DWORD dwExtraInfo // 与键盘动作关联的辅加信息。 ); 其中,bVk表示虚拟键值,其实它是一个BYTE类型值的宏,其取值范围为1-254。有
关虚拟键值表请在MSDN上使用 关键字“Virtual-Key Codes”查找相关资料。bScan表示当键盘上某键被按下和放开
时,键盘系统硬件产生的扫描码 ,我们可以MapVirtualKey()函数在虚拟键值与扫描码之间进行转换。dwFlags表示各种
各样的键盘动作,它有两种取 值:KEYEVENTF_EXTENDEDKEY和KEYEVENTF_KEYUP。
下面我们使用一段代码实现在游戏中按下Shift+R快捷键对攻击对象进行攻击。
keybd_event(VK_CONTROL,MapVirtualKey(VK_CONTROL,0),0,0); //按下CTRL
键。 keybd_event(0x52,MapVirtualKey(0x52,0),0,0);//键下R键。 keybd_event(0x52,MapVirtualKey(0x52,0), KEYEVENTF_KEYUP,0);//放开R键。 keybd_event(VK_CONTROL,MapVirtualKey(VK_CONTROL,0), KEYEVENTF_KEYUP,0);//放开CTRL键。 3. 激活外挂
上面介绍的鼠标和键盘模拟技术实现了对游戏角色的动作部分的模拟,但要想外挂
能工作于游戏之上,还需要将 其与游戏的场景窗口联系起来或者使用一个激活键,就象按键精灵的那个激活键一样。
我们可以用GetWindow函数来枚 举窗口,也可以用Findwindow函数来查找特定的窗口。另外还有一个FindWindowEx函数
可以找到窗口的子窗口,当游 戏切换场景的时候我们可以用FindWindowEx来确定一些当前窗口的特征,从而判断是否
还在这个场景,方法很多了, 比如可以GetWindowInfo来确定一些东西,比如当查找不到某个按钮的时候就说明游戏
场景已经切换了等等办法。当使 用激活键进行关联,需要使用Hook技术开发一个全局键盘钩子,在这里就不具体介绍全
局钩子的开发过程了,在后面 的实例中我们将会使用到全局钩子,到时将学习到全局钩子的相关知识。
4. 实例实现
通过上面的学习,我们已经基本具备了编写动作式游戏外挂的能力了。下面我们将
创建一个画笔程序外挂,它实 现自动移动画笔字光标的位置并写下一个红色的“R”字。以这个实例为基础,加入相
应的游戏动作规则,就可以实现 一个完整的游戏外挂。这里作者不想使用某个游戏作为例子来开发外挂(因没有游戏商
家的授权啊!),如读者感兴 趣的话可以找一个游戏试试,最好仅做测试技术用。
首先,我们需要编写一个全局钩子,使用它来激活外挂,激活键为F10。创建全局
钩子步骤如下: (1).选择MFC AppWizard(DLL)创建项目ActiveKey,并选择MFC Extension DLL
(共享MFC拷贝)类型。 (2).插入新文件ActiveKey.h,在其中输入如下代码:
#ifndef _KEYDLL_H
#define _KEYDLL_H class AFX_EXT_CLASS CKeyHook:public CObject
{ public: CKeyHook(); ~CKeyHook(); HHOOK Start(); //安装钩子 BOOL Stop(); //卸载钩子 }; #endif (3).在ActiveKey.cpp文件中加入声明"#i nclude ActiveKey.h"。
(4).在ActiveKey.cpp文件中加入共享数据段,代码如下:
//Shared data section
#pragma data_seg("sharedata") HHOOK glhHook=NULL; //钩子句柄。 HINSTANCE glhInstance=NULL; //DLL实例句柄。 #pragma data_seg() (5).在ActiveKey.def文件中设置共享数据段属性,代码如下:
SETCTIONS
shareddata READ WRITE SHARED (6).在ActiveKey.cpp文件中加入CkeyHook类的实现代码和钩子函数代码:
//键盘钩子处理函数。
extern "C" LRESULT WINAPI KeyboardProc(int nCode,WPARAM wParam,LPARAM lParam) { if( nCode >= 0 ) { if( wParam == 0X79 )//当按下F10键时,激活外挂。 { //外挂实现代码。 CPoint newPoint,oldPoint; GetCursorPos(&oldPoint); newPoint.x = oldPoint.x+40; newPoint.y = oldPoint.y+10; SetCursorPos(newPoint.x,newPoint.y); mouse_event(MOUSEEVENTF_LEFTDOWN,0,0,0,0);//模拟按下鼠标左键。 mouse_event(MOUSEEVENTF_LEFTUP,0,0,0,0);//模拟放开鼠标左键。 keybd_event(VK_SHIFT,MapVirtualKey(VK_SHIFT,0),0,0); //按下SHIFT键。 keybd_event(0x52,MapVirtualKey(0x52,0),0,0);//按下R键。 keybd_event(0x52,MapVirtualKey(0x52,0),KEYEVENTF_KEYUP,0);//放开R键。 keybd_event(VK_SHIFT,MapVirtualKey(VK_SHIFT,0),KEYEVENTF_KEYUP,0);//放开 SHIFT键。 SetCursorPos(oldPoint.x,oldPoint.y); } } return CallNextHookEx(glhHook,nCode,wParam,lParam); } CKeyHook::CKeyHook(){}
CKeyHook::~CKeyHook() { if( glhHook ) Stop(); } //安装全局钩子。 HHOOK CKeyHook::Start() { glhHook = SetWindowsHookEx(WH_KEYBOARD,KeyboardProc,glhInstance,0);//设置键 盘钩子。 return glhHook; } //卸载全局钩子。 BOOL CKeyHook::Stop() { BOOL bResult = TRUE; if( glhHook ) bResult = UnhookWindowsHookEx(glhHook);//卸载键盘钩子。 return bResult; } (7).修改DllMain函数,代码如下:
extern "C" int APIENTRY
DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID lpReserved) { //如果使用lpReserved参数则删除下面这行 UNREFERENCED_PARAMETER(lpReserved); if (dwReason == DLL_PROCESS_ATTACH)
{ TRACE0("NOtePadHOOK.DLL Initializing!\n"); //扩展DLL仅初始化一次 if (!AfxInitExtensionModule(ActiveKeyDLL, hInstance)) return 0; new CDynLinkLibrary(ActiveKeyDLL); //把DLL加入动态MFC类库中 glhInstance = hInstance; //插入保存DLL实例句柄 } else if (dwReason == DLL_PROCESS_DETACH) { TRACE0("NotePadHOOK.DLL Terminating!\n"); //终止这个链接库前调用它 AfxTermExtensionModule(ActiveKeyDLL); } return 1; } (8).编译项目ActiveKey,生成ActiveKey.DLL和ActiveKey.lib。
接着,我们还需要创建一个外壳程序将全局钩子安装了Windows系统中,这个外壳
程序编写步骤如下: (1).创建一个对话框模式的应用程序,项目名为Simulate。
(2).在主对话框中加入一个按钮,使用ClassWizard为其创建CLICK事件。
(3).将ActiveKey项目Debug目录下的ActiveKey.DLL和ActiveKey.lib拷贝到
Simulate项目目录下。 (4).从“工程”菜单中选择“设置”,弹出Project Setting对话框,选择Link标
签,在“对象/库模块”中输入 ActiveKey.lib。
(5).将ActiveKey项目中的ActiveKey.h头文件加入到Simulate项目中,并在 Stdafx.h中加入#i nclude ActiveKey.h。
(6).在按钮单击事件函数输入如下代码:
void CSimulateDlg::OnButton1()
{ // TODO: Add your control notification handler code here if( !bSetup ) { m_hook.Start();//激活全局钩子。 } else { m_hook.Stop();//撤消全局钩子。 } bSetup = !bSetup; }
(7).编译项目,并运行程序,单击按钮激活外挂。
(8).启动画笔程序,选择文本工具并将笔的颜色设置为红色,将鼠标放在任意位置
后,按F10键,画笔程序自动移 动鼠标并写下一个红色的大写R。图一展示了按F10键前的画笔程序的状态,图二展示了
按F10键后的画笔程序的状态。 图一:按F10前状态(001.jpg) 图二:按F10后状态(002.jpg) 五、封包技术 通过对动作模拟技术的介绍,我们对游戏外挂有了一定程度上的认识,也学会了使
用动作模拟技术来实现简单的 动作模拟型游戏外挂的制作。这种动作模拟型游戏外挂有一定的局限性,它仅仅只能解
决使用计算机代替人力完成那 么有规律、繁琐而无聊的游戏动作。但是,随着网络游戏的盛行和复杂度的增加,很多
游戏要求将客户端动作信息及 时反馈回服务器,通过服务器对这些动作信息进行有效认证后,再向客户端发送下一步
游戏动作信息,这样动作模拟 技术将失去原有的效应。为了更好地“外挂”这些游戏,游戏外挂程序也进行了升级换
代,它们将以前针对游戏用户 界面层的模拟推进到数据通讯层,通过封包技术在客户端挡截游戏服务器发送来的游戏
控制数据包,分析数据包并修 改数据包;同时还需按照游戏数据包结构创建数据包,再模拟客户端发送给游戏服务
器,这个过程其实就是一个封包 的过程。
封包的技术是实现第二类游戏外挂的最核心的技术。封包技术涉及的知识很广泛,
实现方法也很多,如挡截 WinSock、挡截API函数、挡截消息、VxD驱动程序等。在此我们也不可能在此文中将所
有的封包技术都进行详细介绍, 故选择两种在游戏外挂程序中最常用的两种方法:挡截WinSock和挡截API函数。
1. 挡截WinSock
众所周知,Winsock是Windows网络编程接口,它工作于Windows应用层,它提供与
底层传输协议无关的高层数据传 输编程接口。在Windows系统中,使用WinSock接口为应用程序提供基于TCP/IP协议的网
络访问服务,这些服务是由 Wsock32.DLL动态链接库提供的函数库来完成的。
由上说明可知,任何Windows基于TCP/IP的应用程序都必须通过WinSock接口访问网
络,当然网络游戏程序也不例 外。由此我们可以想象一下,如果我们可以控制WinSock接口的话,那么控制游戏客户
端程序与服务器之间的数据包也 将易如反掌。按着这个思路,下面的工作就是如何完成控制WinSock接口了。由上面的
介绍可知,WinSock接口其实是 由一个动态链接库提供的一系列函数,由这些函数实现对网络的访问。有了这层的认
识,问题就好办多了,我们可以 制作一个类似的动态链接库来代替原WinSock接口库,在其中实现WinSock32.dll中实现
的所有函数,并保证所有函数 的参数个数和顺序、返回值类型都应与原库相同。在这个自制作的动态库中,可以对我
们感兴趣的函数(如发送、接 收等函数)进行挡截,放入外挂控制代码,最后还继续调用原WinSock库中提供的相应
功能函数,这样就可以实现对网 络数据包的挡截、修改和发送等封包功能。
下面重点介绍创建挡截WinSock外挂程序的基本步骤:
(1) 创建DLL项目,选择Win32 Dynamic-Link Library,再选择An empty DLL
project。 (2) 新建文件wsock32.h,按如下步骤输入代码:
① 加入相关变量声明:
HMODULE hModule=NULL; //模块句柄
char buffer[1000]; //缓冲区 FARPROC proc; //函数入口指针 ② 定义指向原WinSock库中的所有函数地址的指针变量,因WinSock库共提供70多
个函数,限于篇幅,在此就只选 择几个常用的函数列出,有关这些库函数的说明可参考MSDN相关内容。
//定义指向原WinSock库函数地址的指针变量。
SOCKET (__stdcall *socket1)(int ,int,int);//创建Sock函数。 int (__stdcall *WSAStartup1)(WORD,LPWSADATA);//初始化WinSock库函数。 int (__stdcall *WSACleanup1)();//清除WinSock库函数。 int (__stdcall *recv1)(SOCKET ,char FAR * ,int ,int );//接收数据函数。 int (__stdcall *send1)(SOCKET ,const char * ,int ,int);//发送数据函 数。 int (__stdcall *connect1)(SOCKET,const struct sockaddr *,int);//创建连 接函数。 int (__stdcall *bind1)(SOCKET ,const struct sockaddr *,int );//绑定函 数。 ......其它函数地址指针的定义略。 (3) 新建wsock32.cpp文件,按如下步骤输入代码:
① 加入相关头文件声明:
#i nclude <windows.h>
#i nclude <stdio.h> #i nclude "wsock32.h" ② 添加DllMain函数,在此函数中首先需要加载原WinSock库,并获取此库中所有
函数的地址。代码如下: BOOL WINAPI DllMain (HANDLE hInst,ULONG ul_reason_for_call,LPVOID
lpReserved) { if(hModule==NULL){ //加载原WinSock库,原WinSock库已复制为wsock32.001。 hModule=LoadLibrary("wsock32.001"); } else return 1; //获取原WinSock库中的所有函数的地址并保存,下面仅列出部分代码。 if(hModule!=NULL){ //获取原WinSock库初始化函数的地址,并保存到WSAStartup1中。 proc=GetProcAddress(hModule,"WSAStartup"); WSAStartup1=(int (_stdcall *)(WORD,LPWSADATA))proc; //获取原WinSock库消除函数的地址,并保存到WSACleanup1中。 proc=GetProcAddress(hModule i,"WSACleanup"); WSACleanup1=(int (_stdcall *)())proc; //获取原创建Sock函数的地址,并保存到socket1中。 proc=GetProcAddress(hModule,"socket"); socket1=(SOCKET (_stdcall *)(int ,int,int))proc; //获取原创建连接函数的地址,并保存到connect1中。 proc=GetProcAddress(hModule,"connect"); connect1=(int (_stdcall *)(SOCKET ,const struct sockaddr *,int ))proc; //获取原发送函数的地址,并保存到send1中。 proc=GetProcAddress(hModule,"send"); send1=(int (_stdcall *)(SOCKET ,const char * ,int ,int ))proc; //获取原接收函数的地址,并保存到recv1中。 proc=GetProcAddress(hModule,"recv"); recv1=(int (_stdcall *)(SOCKET ,char FAR * ,int ,int ))proc; ......其它获取函数地址代码略。 } else return 0; return 1; } ③ 定义库输出函数,在此可以对我们感兴趣的函数中添加外挂控制代码,在所有
的输出函数的最后一步都调用原 WinSock库的同名函数。部分输出函数定义代码如下:
//库输出函数定义。
//WinSock初始化函数。 int PASCAL FAR WSAStartup(WORD wVersionRequired, LPWSADATA lpWSAData) { //调用原WinSock库初始化函数 return WSAStartup1(wVersionRequired,lpWSAData); } //WinSock结束清除函数。 int PASCAL FAR WSACleanup(void) { return WSACleanup1(); //调用原WinSock库结束清除函数。 } //创建Socket函数。 SOCKET PASCAL FAR socket (int af, int type, int protocol) { //调用原WinSock库创建Socket函数。 return socket1(af,type,protocol); } //发送数据包函数 int PASCAL FAR send(SOCKET s,const char * buf,int len,int flags) { //在此可以对发送的缓冲buf的内容进行修改,以实现欺骗服务器。 外挂代码...... //调用原WinSock库发送数据包函数。 return send1(s,buf,len,flags); } //接收数据包函数。 int PASCAL FAR recv(SOCKET s, char FAR * buf, int len, int flags) { //在此可以挡截到服务器端发送到客户端的数据包,先将其保存到buffer中。 strcpy(buffer,buf); //对buffer数据包数据进行分析后,对其按照玩家的指令进行相关修改。 外挂代码...... //最后调用原WinSock中的接收数据包函数。 return recv1(s, buffer, len, flags); } .......其它函数定义代码略。 (4)、新建wsock32.def配置文件,在其中加入所有库输出函数的声明,部分声明代
码如下: LIBRARY "wsock32"
EXPORTS WSAStartup @1 WSACleanup @2 recv @3 send @4 socket @5 bind @6 closesocket @7 connect @8 ......其它输出函数声明代码略。
(5)、从“工程”菜单中选择“设置”,弹出Project Setting对话框,选择Link标 签,在“对象/库模块”中输入 Ws2_32.lib。
(6)、编译项目,产生wsock32.dll库文件。
(7)、将系统目录下原wsock32.dll库文件拷贝到被外挂程序的目录下,并将其改名
为wsock.001;再将上面产生的 wsock32.dll文件同样拷贝到被外挂程序的目录下。重新启动游戏程序,此时游戏程序
将先加载我们自己制作的 wsock32.dll文件,再通过该库文件间接调用原WinSock接口函数来实现访问网络。上面
我们仅仅介绍了挡载WinSock的 实现过程,至于如何加入外挂控制代码,还需要外挂开发人员对游戏数据包结构、内
容、加密算法等方面的仔细分析 (这个过程将是一个艰辛的过程),再生成外挂控制代码。关于数据包分析方法和技
巧,不是本文讲解的范围,如您 感兴趣可以到网上查查相关资料。
2.挡截API
挡截API技术与挡截WinSock技术在原理上很相似,但是前者比后者提供了更强大的
功能。挡截WinSock仅只能挡截 WinSock接口函数,而挡截API可以实现对应用程序调用的包括WinSock API函数在内的
所有API函数的挡截。如果您的 外挂程序仅打算对WinSock的函数进行挡截的话,您可以只选择使用上小节介绍的挡截
WinSock技术。随着大量外挂程 序在功能上的扩展,它们不仅仅只提供对数据包的挡截,而且还对游戏程序中使用的
Windows API或其它DLL库函数的 挡截,以使外挂的功能更加强大。例如,可以通过挡截相关API函数以实现对非中文游
戏的汉化功能,有了这个利器, 可以使您的外挂程序无所不能了。
挡截API技术的原理核心也是使用我们自己的函数来替换掉Windows或其它DLL库提
供的函数,有点同挡截WinSock 原理相似吧。但是,其实现过程却比挡截WinSock要复杂的多,如像实现挡截Winsock过
程一样,将应用程序调用的所 有的库文件都写一个模拟库有点不大可能,就只说Windows API就有上千个,还有很多
库提供的函数结构并未公开,所 以写一个模拟库代替的方式不大现实,故我们必须另谋良方。
挡截API的最终目标是使用自定义的函数代替原函数。那么,我们首先应该知道应
用程序何时、何地、用何种方式 调用原函数。接下来,需要将应用程序中调用该原函数的指令代码进行修改,使它将调
用函数的指针指向我们自己定 义的函数地址。这样,外挂程序才能完全控制应用程序调用的API函数,至于在其中如
何加入外挂代码,就应需求而异 了。最后还有一个重要的问题要解决,如何将我们自定义的用来代替原API函数的函数
代码注入被外挂游戏程序进行地 址空间中,因在Windows系统中应用程序仅只能访问到本进程地址空间内的代码和数
据。 综上所述,要实现挡截API函数,至少需要解决如下三个问题:
● 如何定位游戏程序中调用API函数指令代码?
● 如何修改游戏程序中调用API函数指令代码?
● 如何将外挂代码(自定义的替换函数代码)注入到游戏程序进程地址空间?
下面我们逐一介绍这几个问题的解决方法:
(1) 、定位调用API函数指令代码
我们知道,在汇编语言中使用CALL指令来调用函数或过程的,它是通过指令参数中
的函数地址而定位到相应的函 数代码的。那么,我们如果能寻找到程序代码中所有调用被挡截的API函数的CALL指令
的话,就可以将该指令中的函数 地址参数修改为替代函数的地址。虽然这是一个可行的方案,但是实现起来会很繁琐,
也不稳健。庆幸的是,Windows 系统中所使用的可执行文件(PE格式)采用了输入地址表机制,将所有在程序调用的
API函数的地址信息存放在输入地 址表中,而在程序代码CALL指令中使用的地址不是API函数的地址,而是输入地址表中
该API函数的地址项,如想使程 序代码中调用的API函数被代替掉,只用将输入地址表中该API函数的地址项内容修改即
可。具体理解输入地址表运行 机制,还需要了解一下PE格式文件结构,其中图三列出了PE格式文件的大致结构。
图三:PE格式大致结构图(003.jpg) PE格式文件一开始是一段DOS程序,当你的程序在不支持Windows的环境中运行时,
它就会显示“This Program cannot be run in DOS mode”这样的警告语句,接着这个DOS文件头,就开始真正的PE
文件内容了。首先是一段称为 “IMAGE_NT_HEADER”的数据,其中是许多关于整个PE文件的消息,在这段数据的尾端
是一个称为Data Directory的数 据表,通过它能快速定位一些PE文件中段(section)的地址。在这段数据之后,则是
一个“IMAGE_SECTION_HEADER” 的列表,其中的每一项都详细描述了后面一个段的相关信息。接着它就是PE文件中最主
要的段数据了,执行代码、数 据和资源等等信息就分别存放在这些段中。
在所有的这些段里,有一个被称为“.idata”的段(输入数据段)值得我们去注
意,该段中包含着一些被称为输 入地址表(IAT,Import Address Table)的数据列表。每个用隐式方式加载的API所在
的DLL都有一个IAT与之对应, 同时一个API的地址也与IAT中一项相对应。当一个应用程序加载到内存中后,针对每一
个API函数调用,相应的产生如 下的汇编指令:
JMP DWORD PTR [XXXXXXXX]
或
CALL DWORD PTR [XXXXXXXX]
其中,[XXXXXXXX]表示指向了输入地址表中一个项,其内容是一个DWORD,而正是
这个DWORD才是API函数在内存中 的真正地址。因此我们要想拦截一个API的调用,只要简单的把那个DWORD改为我们自己
的函数的地址。 (2) 、修改调用API函数代码
从上面对PE文件格式的分析可知,修改调用API函数代码其实是修改被调用API函数
在输入地址表中IAT项内容。由 于Windows系统对应用程序指令代码地址空间的严密保护机制,使得修改程序指令代码
非常困难,以至于许多高手为之 编写VxD进入Ring0。在这里,我为大家介绍一种较为方便的方法修改进程内存,它仅需
要调用几个Windows核心API函 数,下面我首先来学会一下这几个API函数:
DWORD VirtualQuery(
LPCVOID lpAddress, // address of region PMEMORY_BASIC_INFORMATION lpBuffer, // information buffer DWORD dwLength // size of buffer ); 该函数用于查询关于本进程内虚拟地址页的信息。其中,lpAddress表示被查询页
的区域地址;lpBuffer表示用于 保存查询页信息的缓冲;dwLength表示缓冲区大小。返回值为实际缓冲大小。
BOOL VirtualProtect(
LPVOID lpAddress, // region of committed pages SIZE_T dwSize, // size of the region DWORD flNewProtect, // desired access protection PDWORD lpflOldProtect // old protection ); 该函数用于改变本进程内虚拟地址页的保护属性。其中,lpAddress表示被改变保
护属性页区域地址;dwSize表示 页区域大小;flNewProtect表示新的保护属性,可取值为PAGE_READONLY、
PAGE_READWRITE、PAGE_EXECUTE等; lpflOldProtect表示用于保存改变前的保护属性。如果函数调用成功返回“T”,否则
返回“F”。 有了这两个API函数,我们就可以随心所欲的修改进程内存了。首先,调用
VirtualQuery()函数查询被修改内存的 页信息,再根据此信息调用VirtualProtect()函数改变这些页的保护属性为
PAGE_READWRITE,有了这个权限您就可以 任意修改进程内存数据了。下面一段代码演示了如何将进程虚拟地址为0x0040106c处的
字节清零。 BYTE* pData = 0x0040106c;
MEMORY_BASIC_INFORMATION mbi_thunk; //查询页信息。 VirtualQuery(pData, &mbi_thunk, sizeof(MEMORY_BASIC_INFORMATION)); //改变页保护属性为读写。 VirtualProtect(mbi_thunk.BaseAddress,mbi_thunk.RegionSize, PAGE_READWRITE, &mbi_thunk.Protect); //清零。 *pData = 0x00; //恢复页的原保护属性。 DWORD dwOldProtect; VirtualProtect(mbi_thunk.BaseAddress,mbi_thunk.RegionSize, mbi_thunk.Protect, &dwOldProtect); (3)、注入外挂代码进入被挂游戏进程中 完成了定位和修改程序中调用API函数代码后,我们就可以随意设计自定义的API函
数的替代函数了。做完这一切 后,还需要将这些代码注入到被外挂游戏程序进程内存空间中,不然游戏进程根本不会
访问到替代函数代码。注入方 法有很多,如利用全局钩子注入、利用注册表注入挡截User32库中的API函数、利用
CreateRemoteThread注入(仅限于 NT/2000)、利用BHO注入等。因为我们在动作模拟技术一节已经接触过全局钩子,我相
信聪明的读者已经完全掌握了 全局钩子的制作过程,所以我们在后面的实例中,将继续利用这个全局钩子。至于其它
几种注入方法,如果感兴趣可 参阅MSDN有关内容。
有了以上理论基础,我们下面就开始制作一个挡截MessageBoxA和recv函数的实
例,在开发游戏外挂程序 时,可 以此实例为框架,加入相应的替代函数和处理代码即可。此实例的开发过程如下:
(1) 打开前面创建的ActiveKey项目。
(2) 在ActiveKey.h文件中加入HOOKAPI结构,此结构用来存储被挡截API函数名
称、原API函数地址和替代函数地 址。
typedef struct tag_HOOKAPI
{ LPCSTR szFunc;//被HOOK的API函数名称。 PROC pNewProc;//替代函数地址。 PROC pOldProc;//原API函数地址。 }HOOKAPI, *LPHOOKAPI; (3) 打开ActiveKey.cpp文件,首先加入一个函数,用于定位输入库在输入数据段
中的IAT地址。代码如下: extern "C" __declspec(dllexport)PIMAGE_IMPORT_DESCRIPTOR
LocationIAT(HMODULE hModule, LPCSTR szImportMod) //其中,hModule为进程模块句柄;szImportMod为输入库名称。 { //检查是否为DOS程序,如是返回NULL,因DOS程序没有IAT。 PIMAGE_DOS_HEADER pDOSHeader = (PIMAGE_DOS_HEADER) hModule; if(pDOSHeader->e_magic != IMAGE_DOS_SIGNATURE) return NULL; //检查是否为NT标志,否则返回NULL。 PIMAGE_NT_HEADERS pNTHeader = (PIMAGE_NT_HEADERS)((DWORD)pDOSHeader+ (DWORD)(pDOSHeader- >e_lfanew));
if(pNTHeader->Signature != IMAGE_NT_SIGNATURE) return NULL; //没有IAT表则返回NULL。 if(pNTHeader->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].Vir tualAddress == 0) return NULL;
//定位第一个IAT位置。 PIMAGE_IMPORT_DESCRIPTOR pImportDesc = (PIMAGE_IMPORT_DESCRIPTOR)((DWORD)pDOSHeader + (DWORD) (pNTHeader->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].Virtu
alAddress)); //根据输入库名称循环检查所有的IAT,如匹配则返回该IAT地址,否则检测下 一个IAT。 while (pImportDesc->Name) { //获取该IAT描述的输入库名称。 PSTR szCurrMod = (PSTR)((DWORD)pDOSHeader + (DWORD)(pImportDesc->Name)); if (stricmp(szCurrMod, szImportMod) == 0) break; pImportDesc++; } if(pImportDesc->Name == NULL) return NULL; return pImportDesc; } 再加入一个函数,用来定位被挡截API函数的IAT项并修改其内容为替代函数地址。
代码如下: extern "C" __declspec(dllexport)
HookAPIByName( HMODULE hModule, LPCSTR szImportMod, LPHOOKAPI pHookApi) //其中,hModule为进程模块句柄;szImportMod为输入库名称;pHookAPI为 HOOKAPI结构指针。 { //定位szImportMod输入库在输入数据段中的IAT地址。 PIMAGE_IMPORT_DESCRIPTOR pImportDesc = LocationIAT(hModule, szImportMod); if (pImportDesc == NULL) return FALSE; //第一个Thunk地址。 PIMAGE_THUNK_DATA pOrigThunk = (PIMAGE_THUNK_DATA)((DWORD)hModule + (DWORD)(pImportDesc- >OriginalFirstThunk));
//第一个IAT项的Thunk地址。 PIMAGE_THUNK_DATA pRealThunk = (PIMAGE_THUNK_DATA)((DWORD)hModule + (DWORD)(pImportDesc- >FirstThunk));
//循环查找被截API函数的IAT项,并使用替代函数地址修改其值。 while(pOrigThunk->u1.Function) { //检测此Thunk是否为IAT项。 if((pOrigThunk->u1.Ordinal & IMAGE_ORDINAL_FLAG) != IMAGE_ORDINAL_FLAG) { //获取此IAT项所描述的函数名称。 PIMAGE_IMPORT_BY_NAME pByName =(PIMAGE_IMPORT_BY_NAME)((DWORD)hModule+(DWORD)(pOrigThunk- >u1.AddressOfData));
if(pByName->Name[0] == \0) return FALSE; //检测是否为挡截函数。 if(strcmpi(pHookApi->szFunc, (char*)pByName->Name) == 0) { MEMORY_BASIC_INFORMATION mbi_thunk; //查询修改页的信息。 VirtualQuery(pRealThunk, &mbi_thunk, sizeof(MEMORY_BASIC_INFORMATION)); //改变修改页保护属性为PAGE_READWRITE。 VirtualProtect(mbi_thunk.BaseAddress,mbi_thunk.RegionSize, PAGE_READWRITE, &mbi_thunk.Protect);
//保存原来的API函数地址。 if(pHookApi->pOldProc == NULL) pHookApi->pOldProc = (PROC)pRealThunk->u1.Function; //修改API函数IAT项内容为替代函数地址。 pRealThunk->u1.Function = (PDWORD)pHookApi->pNewProc; //恢复修改页保护属性。 DWORD dwOldProtect; VirtualProtect(mbi_thunk.BaseAddress, mbi_thunk.RegionSize, mbi_thunk.Protect, &dwOldProtect);
} } pOrigThunk++; pRealThunk++; } SetLastError(ERROR_SUCCESS); //设置错误为ERROR_SUCCESS,表示成功。 return TRUE; } (4) 定义替代函数,此实例中只给MessageBoxA和recv两个API进行挡截。代码如下
: static int WINAPI MessageBoxA1 (HWND hWnd , LPCTSTR lpText, LPCTSTR
lpCaption, UINT uType) { //过滤掉原MessageBoxA的正文和标题内容,只显示如下内容。 return MessageBox(hWnd, "Hook API OK!", "Hook API", uType); } static int WINAPI recv1(SOCKET s, char FAR *buf, int len, int flags ) { //此处可以挡截游戏服务器发送来的网络数据包,可以加入分析和处理数据代 码。 return recv(s,buf,len,flags); } (5) 在KeyboardProc函数中加入激活挡截API代码,在if( wParam == 0X79 )语句
中后面加入如下else if语句: ......
//当激活F11键时,启动挡截API函数功能。 else if( wParam == 0x7A ) { HOOKAPI api[2]; api[0].szFunc ="MessageBoxA";//设置被挡截函数的名称。 api[0].pNewProc = (PROC)MessageBoxA1;//设置替代函数的地址。 api[1].szFunc ="recv";//设置被挡截函数的名称。 api[1].pNewProc = (PROC)recv1; //设置替代函数的地址。 //设置挡截User32.dll库中的MessageBoxA函数。 HookAPIByName(GetModuleHandle(NULL),"User32.dll",&api[0]); //设置挡截Wsock32.dll库中的recv函数。 HookAPIByName(GetModuleHandle(NULL),"Wsock32.dll",&api[1]); } ...... (6) 在ActiveKey.cpp中加入头文件声明 "#i nclude "wsock32.h"。 从“工程”菜 单中选择“设置”,弹出 Project Setting对话框,选择Link标签,在“对象/库模块”中输入Ws2_32..lib。
(7) 重新编译ActiveKey项目,产生ActiveKey.dll文件,将其拷贝到Simulate.exe
目录下。运行Simulate.exe并 启动全局钩子。激活任意应用程序,按F11键后,运行此程序中可能调用MessageBoxA函
数的操作,看看信息框是不是 有所变化。同样,如此程序正在接收网络数据包,就可以实现封包功能了。
六、结束语
除了以上介绍的几种游戏外挂程序常用的技术以外,在一些外挂程序中还使用了游 戏数据修改技术、游戏加速技术等。在这篇文章里,就不逐一介绍了。 September 08 消息钩子函数入门篇Windows系统是建立在事件驱动的机制上的,说穿了就是整个系统都是通过消息的传递来实现的。而钩子是Windows系统中非常重要的系统接口,用它可以截获并处理送给其他应用程序的消息,来完成普通应用程序难以实现的功能。钩子可以监视系统或进程中的各种事件消息,截获发往目标窗口的消息并进行处理。这样,我们就可以在系统中安装自定义的钩子,监视系统中特定事件的发生,完成特定的功能,比如截获键盘、鼠标的输入,屏幕取词,日志监视等等。可见,利用钩子可以实现许多特殊而有用的功能。因此,对于高级编程人员来说,掌握钩子的编程方法是很有必要的。 钩子的类型 一. 按事件分类,有如下的几种常用类型 (1) 键盘钩子和低级键盘钩子可以监视各种键盘消息。 (2) 鼠标钩子和低级鼠标钩子可以监视各种鼠标消息。 (3) 外壳钩子可以监视各种Shell事件消息。比如启动和关闭应用程序。 (4) 日志钩子可以记录从系统消息队列中取出的各种事件消息。 (5) 窗口过程钩子监视所有从系统消息队列发往目标窗口的消息。 此外,还有一些特定事件的钩子提供给我们使用,不一一列举。 下面描述常用的Hook类型: 1、WH_CALLWNDPROC和WH_CALLWNDPROCRET Hooks WH_CALLWNDPROC和WH_CALLWNDPROCRET Hooks使你可以监视发送到窗口过程的消息。系统在消息发送到接收窗口过程之前调用WH_CALLWNDPROC Hook子程,并且在窗口过程处理完消息之后调用WH_CALLWNDPRO CRET Hook子程。WH_CALLWNDPROCRET Hook传递指针到CWPRETSTRUCT结构,再传递到Hook子程。CWPRETSTRUCT结构包含了来自处理消息的窗口过程的返回值,同样也包括了与这个消息关联的消息参数。 2、WH_CBT Hook 在以下事件之前,系统都会调用WH_CBT Hook子程,这些事件包括: 1. 激活,建立,销毁,最小化,最大化,移动,改变尺寸等窗口事件; 2. 完成系统指令; 3. 来自系统消息队列中的移动鼠标,键盘事件; 4. 设置输入焦点事件; 5. 同步系统消息队列事件。 Hook子程的返回值确定系统是否允许或者防止这些操作中的一个。 3、WH_DEBUG Hook 在系统调用系统中与其他Hook关联的Hook子程之前,系统会调用WH_DEBUG Hook子程。你可以使用这个Hook来决定是否允许系统调用与其他Hook关联的Hook子程。 4、WH_FOREGROUNDIDLE Hook 当应用程序的前台线程处于空闲状态时,可以使用WH_FOREGROUNDIDLE Hook执行低优先级的任务。当应用程序的前台线程大概要变成空闲状态时,系统就会调用WH_FOREGROUNDIDLE Hook子程。 5、WH_GETMESSAGE Hook 应用程序使用WH_GETMESSAGE Hook来监视从GetMessage or PeekMessage函数返回的消息。你可以使用WH_GETMESSAGE Hook去监视鼠标和键盘输入,以及其他发送到消息队列中的消息。 6、WH_JOURNALPLAYBACK Hook WH_JOURNALPLAYBACK Hook使应用程序可以插入消息到系统消息队列。可以使用这个Hook回放通过使用WH_JOURNALRECORD Hook记录下来的连续的鼠标和键盘事件。只要WH_JOURNALPLAYBACK Hook已经安装,正常的鼠标和键盘事件就是无效的。WH_JOURNALPLAYBACK Hook是全局Hook,它不能象线程特定Hook一样使用。WH_JOURNALPLAYBACK Hook返回超时值,这个值告诉系统在处理来自回放Hook当前消息之前需要等待多长时间(毫秒)。这就使Hook可以控制实时事件的回放。 WH_JOURNALPLAYBACK是system-wide local hooks,它們不會被注射到任何行程位址空間。(估计按键精灵是用这个hook做的) 7、WH_JOURNALRECORD Hook WH_JOURNALRECORD Hook用来监视和记录输入事件。典型的,可以使用这个Hook记录连续的鼠标和键盘事件,然后通过使用WH_JOURNALPLAYBACK Hook来回放。WH_JOURNALRECORD Hook是全局Hook,它不能象线程特定Hook一样使用。WH_JOURNALRECORD是system-wide local hooks,它們不會被注射到任何行程位址空間。 8、WH_KEYBOARD Hook 在应用程序中,WH_KEYBOARD Hook用来监视WM_KEYDOWN and WM_KEYUP消息,这些消息通过GetMessage or PeekMessage function返回。可以使用这个Hook来监视输入到消息队列中的键盘消息。 9、WH_KEYBOARD_LL Hook WH_KEYBOARD_LL Hook监视输入到线程消息队列中的键盘消息。 10、WH_MOUSE Hook WH_MOUSE Hook监视从GetMessage 或者 PeekMessage 函数返回的鼠标消息。使用这个Hook监视输入到消息队列中的鼠标消息。 11、WH_MOUSE_LL Hook WH_MOUSE_LL Hook监视输入到线程消息队列中的鼠标消息。 12、WH_MSGFILTER 和 WH_SYSMSGFILTER Hooks WH_MSGFILTER 和 WH_SYSMSGFILTER Hooks使我们可以监视菜单,滚动条,消息框,对话框消息并且发现用户使用ALT+TAB or ALT+ESC 组合键切换窗口。WH_MSGFILTER Hook只能监视传递到菜单,滚动条,消息框的消息,以及传递到通过安装了Hook子程的应用程序建立的对话框的消息。WH_SYSMSGFILTER Hook监视所有应用程序消息。WH_MSGFILTER 和 WH_SYSMSGFILTER Hooks使我们可以在模式循环期间过滤消息,这等价于在主消息循环中过滤消息。通过调用CallMsgFilter function可以直接的调用WH_MSGFILTER Hook。通过使用这个函数,应用程序能够在模式循环期间使用相同的代码去过滤消息,如同在主消息循环里一样。 13、WH_SHELL Hook 外壳应用程序可以使用WH_SHELL Hook去接收重要的通知。当外壳应用程序是激活的并且当顶层窗口建立或者销毁时,系统调用WH_SHELL Hook子程。 WH_SHELL 共有5钟情況: 1. 只要有个top-level、unowned 窗口被产生、起作用、或是被摧毁; 2. 当Taskbar需要重画某个按钮; 3. 当系统需要显示关于Taskbar的一个程序的最小化形式; 4. 当目前的键盘布局状态改变; 5. 当使用者按Ctrl+Esc去执行Task Manager(或相同级别的程序)。 按照惯例,外壳应用程序都不接收WH_SHELL消息。所以,在应用程序能够接收WH_SHELL消息之前,应用程序必须调用SystemParametersInfo function注册它自己。 以上是13种常用的hook类型! 二. 按使用范围分类,主要有线程钩子和系统钩子 (1) 线程钩子监视指定线程的事件消息。 (2) 系统钩子监视系统中的所有线程的事件消息。因为系统钩子会影响系统中所有的应用程序,所以钩子函数必须放在独立的动态链接库(DLL) 中。这是系统钩子和线程钩子很大的不同之处。 几点需要说明的地方: (1) 如果对于同一事件(如鼠标消息)既安装了线程钩子又安装了系统钩子,那么系统会自动先调用线程钩子,然后调用系统钩子。 (2) 对同一事件消息可安装多个钩子处理过程,这些钩子处理过程形成了钩子链。当前钩子处理结束后应把钩子信息传递给下一个钩子函数。而且最近安装的钩子放在链的开始,而最早安装的钩子放在最后,也就是后加入的先获得控制权。 (3) 钩子特别是系统钩子会消耗消息处理时间,降低系统性能。只有在必要的时候才安装钩子,在使用完毕后要及时卸载。 编写钩子程序 编写钩子程序的步骤分为三步:定义钩子函数、安装钩子和卸载钩子。 1.定义钩子函数 钩子函数是一种特殊的回调函数。钩子监视的特定事件发生后,系统会调用钩子函数进行处理。不同事件的钩子函数的形式是各不相同的。下面以鼠标钩子函数举例说明钩子函数的原型: LRESULT CALLBACK HookProc(int nCode ,WPARAM wParam,LPARAM lParam) 参数wParam和 lParam包含所钩消息的信息,比如鼠标位置、状态,键盘按键等。nCode包含有关消息本身的信息,比如是否从消息队列中移出。 我们先在钩子函数中实现自定义的功能,然后调用函数 CallNextHookEx.把钩子信息传递给钩子链的下一个钩子函数。CallNextHookEx.的原型如下: LRESULT CallNextHookEx( HHOOK hhk, int nCode, WPARAM wParam, LPARAM lParam ) 参数 hhk是钩子句柄。nCode、wParam和lParam 是钩子函数。 当然也可以通过直接返回TRUE来丢弃该消息,就阻止了该消息的传递。 2.安装钩子 在程序初始化的时候,调用函数SetWindowsHookEx安装钩子。其函数原型为: HHOOK SetWindowsHookEx( int idHook,HOOKPROC lpfn, INSTANCE hMod,DWORD dwThreadId ) 参数idHook表示钩子类型,它是和钩子函数类型一一对应的。比如,WH_KEYBOARD表示安装的是键盘钩子,WH_MOUSE表示是鼠标钩子等等。 Lpfn是钩子函数的地址。 HMod是钩子函数所在的实例的句柄。对于线程钩子,该参数为NULL;对于系统钩子,该参数为钩子函数所在的DLL句柄。 dwThreadId 指定钩子所监视的线程的线程号。对于全局钩子,该参数为NULL。 SetWindowsHookEx返回所安装的钩子句柄。 3.卸载钩子 当不再使用钩子时,必须及时卸载。简单地调用函数 BOOL UnhookWindowsHookEx( HHOOK hhk)即可。 值得注意的是线程钩子和系统钩子的钩子函数的位置有很大的差别。线程钩子一般在当前线程或者当前线程派生的线程内,而系统钩子必须放在独立的动态链接库中,实现起来要麻烦一些。 线程钩子的编程实例: 按照上面介绍的方法实现一个线程级的鼠标钩子。钩子跟踪当前窗口鼠标移动的位置变化信息。并输出到窗口。 (1)在VC++6.0中利用MFC APPWizard(EXE)生成一个不使用文档/视结构的单文档应用mousehook。打开childview.cpp文件,加入全局变量: HHOOK hHook;//鼠标钩子句柄 CPoint point;//鼠标位置信息 CChildView *pView; // 鼠标钩子函数用到的输出窗口指针 在CChildView::OnPaint()添加如下代码: CPaintDC dc(this); char str[256]; sprintf(str,“x=%d,y=%d",point.x,point.y); //构造字符串 dc.TextOut(0,0,str); //显示字符串 (2)childview.cpp文件中定义全局的鼠标钩子函数。 LRESULT CALLBACK MouseProc (int nCode, WPARAM wParam, LPARAM lParam) {//是鼠标移动消息 if(wParam==WM_MOUSEMOVE||wParam ==WM_NCMOUSEMOVE) { point=((MOUSEHOOKSTRUCT *)lParam)->pt; //取鼠标信息 pView->Invalidate(); //窗口重画 } return CallNextHookEx(hHook,nCode,wParam,lParam); //传递钩子信息 } (3)CChildView类的构造函数中安装钩子。 CChildView::CChildView() { pView=this;//获得输出窗口指针 hHook=SetWindowsHookEx(WH_MOUSE,MouseProc,0,GetCurrentThreadId()); } (4)CChildView类的析构函数中卸载钩子。 CChildView::~CChildView() { if(hHook) UnhookWindowsHookEx(hHook); } 系统钩子的编程实例: 由于系统钩子要用到dll,所以先介绍下win32 dll的特点: Win32 DLL与 Win16 DLL有很大的区别,这主要是由操作系统的设计思想决定的。一方面,在Win16 DLL中程序入口点函数和出口点函数(LibMain和WEP)是分别实现的;而在Win32 DLL中却由同一函数DLLMain来实现。无论何时,当一个进程或线程载入和卸载DLL时,都要调用该函数,它的原型是BOOL WINAPI DllMain (HINSTANCE hinstDLL,DWORD fdwReason, LPVOID lpvReserved);,其中,第一个参数表示DLL的实例句柄;第三个参数系统保留;这里主要介绍一下第二个参数,它有四个可能的值: DLL_PROCESS_ATTACH(进程载入),DLL_THREAD_ATTACH(线程载入),DLL_THREAD_DETACH(线程卸载),DLL_PROCESS_DETACH(进程卸载),在DLLMain函数中可以对传递进来的这个参数的值进行判别,并根据不同的参数值对DLL进行必要的初始化或清理工作。举个例子来说,当有一个进程载入一个DLL时,系统分派给DLL的第二个参数为DLL_PROCESS_ATTACH,这时,你可以根据这个参数初始化特定的数据。另一方面,在Win16环境下,所有应用程序都在同一地址空间;而在Win32环境下,所有应用程序都有自己的私有空间,每个进程的空间都是相互独立的,这减少了应用程序间的相互影响,但同时也增加了编程的难度。大家知道,在Win16环境中,DLL的全局数据对每个载入它的进程来说都是相同的;而在Win32环境中,情况却发生了变化,当进程在载入DLL时,系统自动把DLL地址映射到该进程的私有空间,而且也复制该DLL的全局数据的一份拷贝到该进程空间,也就是说每个进程所拥有的相同的DLL的全局数据其值却并不一定是相同的。因此,在Win32环境下要想在多个进程中共享数据,就必须进行必要的设置。亦即把这些需要共享的数据分离出来,放置在一个独立的数据段里,并把该段的属性设置为共享。 在VC6中有三种形式的MFC DLL(在该DLL中可以使用和继承已有的MFC类)可供选择,即Regular statically linked to MFC DLL(标准静态链接MFC DLL)和Regular using the shared MFC DLL(标准动态链接MFC DLL)以及Extension MFC DLL(扩展MFC DLL)。第一种DLL的特点是,在编译时把使用的MFC代码加入到DLL中,因此,在使用该程序时不需要其他MFC动态链接类库的存在,但占用磁盘空间比较大;第二种DLL的特点是,在运行时,动态链接到MFC类库,因此减少了空间的占用,但是在运行时却依赖于MFC动态链接类库;这两种DLL既可以被 MFC程序使用也可以被Win32程序使用。第三种DLL的特点类似于第二种,做为MFC类库的扩展,只能被MFC程序使用。 下面说说在VC6中全局共享数据的实现 在主文件中,用#pragma data_seg建立一个新的数据段并定义共享数据,其具体格式为: #pragma data_seg ("shareddata") HWND sharedwnd=NULL;//共享数据 #pragma data_seg() 仅定义一个数据段还不能达到共享数据的目的,还要告诉编译器该段的属性,有两种方法可以实现该目的(其效果是相同的),一种方法是在.DEF文件中加入如下语句: SETCTIONS shareddata READ WRITE SHARED 另一种方法是在项目设置链接选项中加入如下语句: /SECTION:shareddata,rws 好了,准备知识已经学完了,让我们开始编写个全局的钩子程序吧! 由于全局钩子函数必须包含在动态链接库中,所以本例由两个程序体来实现。 1.建立钩子Mousehook.DLL (1)选择MFC AppWizard(DLL)创建项目Mousehook; (2)选择MFC Extension DLL(共享MFC拷贝)类型; (3)由于VC5没有现成的钩子类,所以要在项目目录中创建Mousehook.h文件,在其中建立钩子类: class AFX_EXT_CLASS Cmousehook:public CObject { public: Cmousehook(); //钩子类的构造函数 ~Cmousehook(); //钩子类的析构函数 BOOL starthook(HWND hWnd); //安装钩子函数 BOOL stophook(); 卸载钩子函数 }; (4)在Mousehook.app文件的顶部加入#include"Mousehook.h"语句; (5)加入全局共享数据变量: #pragma data_seg("mydata") HWND glhPrevTarWnd=NULL; //上次鼠标所指的窗口句柄 HWND glhDisplayWnd=NULL; //显示目标窗口标题编辑框的句柄 HHOOK glhHook=NULL; //安装的鼠标钩子句柄 HINSTANCE glhInstance=NULL; //DLL实例句柄 #pragma data_seg() (6)在DEF文件中定义段属性: SECTIONS mydata READ WRITE SHARED (7)在主文件Mousehook.cpp的DllMain函数中加入保存DLL实例句柄的语句: DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID lpReserved) { //如果使用lpReserved参数则删除下面这行 UNREFERENCED_PARAMETER(lpReserved); if (dwReason == DLL_PROCESS_ATTACH) { TRACE0("MOUSEHOOK.DLL Initializing!\n"); //扩展DLL仅初始化一次 if (!AfxInitExtensionModule(MousehookDLL, hInstance)) return 0; new CDynLinkLibrary(MousehookDLL); //把DLL加入动态MFC类库中 glhInstance=hInstance; //插入保存DLL实例句柄 } else if (dwReason == DLL_PROCESS_DETACH) { TRACE0("MOUSEHOOK.DLL Terminating!\n"); //终止这个链接库前调用它 AfxTermExtensionModule(MousehookDLL); } return 1; } (8)类Cmousehook的成员函数的具体实现: Cmousehook::Cmousehook() //类构造函数 { } Cmousehook::~Cmousehook() //类析构函数 { stophook(); } BOOL Cmousehook::starthook(HWND hWnd) //安装钩子并设定接收显示窗口句柄 { BOOL bResult=FALSE; glhHook=SetWindowsHookEx(WH_MOUSE,MouseProc,glhInstance,0); if(glhHook!=NULL) bResult=TRUE; glhDisplayWnd=hWnd; //设置显示目标窗口标题编辑框的句柄 return bResult; } BOOL Cmousehook::stophook() //卸载钩子 { BOOL bResult=FALSE; if(glhHook) { bResult= UnhookWindowsHookEx(glhHook); if(bResult) { glhPrevTarWnd=NULL; glhDisplayWnd=NULL;//清变量 glhHook=NULL; } } return bResult; } (9)钩子函数的实现: LRESULT WINAPI MouseProc(int nCode,WPARAM wparam,LPARAM lparam) { LPMOUSEHOOKSTRUCT pMouseHook=(MOUSEHOOKSTRUCT FAR *) lparam; if (nCode>=0) { HWND glhTargetWnd=pMouseHook->hwnd; //取目标窗口句柄 HWND ParentWnd=glhTargetWnd; while (ParentWnd !=NULL) { glhTargetWnd=ParentWnd; ParentWnd=GetParent(glhTargetWnd); //取应用程序主窗口句柄 } if(glhTargetWnd!=glhPrevTarWnd) { char szCaption[100]; GetWindowText(glhTargetWnd,szCaption,100); //取目标窗口标题 if(IsWindow(glhDisplayWnd)) SendMessage(glhDisplayWnd,WM_SETTEXT,0,(LPARAM)(LPCTSTR)szCaption); glhPrevTarWnd=glhTargetWnd; //保存目标窗口 } } return CallNextHookEx(glhHook,nCode,wparam,lparam); //继续传递消息 } (10)编译项目生成mousehook.dll。 2.创建钩子可执行程序 (1)用MFC的AppWizard(EXE)创建项目Mouse; (2)选择“基于对话应用”并按下“完成”键; (3)编辑对话框,删除其中原有的两个按钮,加入静态文本框和编辑框,用鼠标右键点击静态文本框,在弹出的菜单中选择“属性”,设置其标题为“鼠标所在的窗口标题”; (4)在Mouse.h中加入对Mousehook.h的包含语句#Include"..\Mousehook\Mousehook.h"; (5)在CMouseDlg.h的CMouseDlg类定义中添加私有数据成员: CMouseHook m_hook;//加入钩子类作为数据成员 (6)修改CmouseDlg::OnInitDialog()函数: BOOL CMouseDlg::OnInitDialog() { CDialog::OnInitDialog(); ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX); ASSERT(IDM_ABOUTBOX <0xF000); CMenu* pSysMenu = GetSystemMenu(FALSE); if (pSysMenu != NULL) { CString strAboutMenu; strAboutMenu.LoadString(IDS_ABOUTBOX); if (!strAboutMenu.IsEmpty()) { pSysMenu->AppendMenu(MF_SEPARATOR); pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu); } } SetIcon(m_hIcon, TRUE);//Set big icon SetIcon(m_hIcon, FALSE);//Set small icon //TODO: Add extra initialization here CWnd * pwnd=GetDlgItem(IDC_EDIT1); //取得编辑框的类指针 m_hook.starthook(pwnd->GetSafeHwnd()); //取得编辑框的窗口句柄并安装钩子 return TRUE; //return TRUE unless you set the focus to a control } (7)链接DLL库,即把..\Mousehook\debug\Mousehook.lib加入到项目设置链接标签中; (8)编译项目生成可执行文件; (9)把Mousehook.DLL拷贝到..\mouse\debug目录中; (10)先运行几个可执行程序,然后运行Mouse.exe程序,把鼠标在不同窗口中移动,在Mouse.exe程序窗口中的编辑框内将显示出鼠标所在的应用程序主窗口的标题。 September 03 生活就是无数个平行空间中个一个选择生活就是无数平行空间的一个选择,当我选择了这一个空间,我就要按照这个空间的法则生活,这是一个单行道; 我也可以选择切换到另一个空间,但是空间切换是要代价的;在你没有选择之前,这个代价是最小的,选择之后,这个代价就是随着时间增加而增加。你真的要付出这个代价去另一个空间吗,或许,你也可以通过改变这个空间规则让这个空间更合适你;生活,永远都充满了选择,生活永远都是一个选择接着一个选择,一个空间接着一个空间,没有人会知道下一刻会发生什么,没有人直到这个选择一定是对的吗?人太渺小,空间太浩瀚了。
〔cherish,好像在我的字典里失踪了很久,终于今天被翻出来了。最近好像是迷失了自己,找不到生活的方向,只剩下了一个挣钱的本能来维持现在的生活。应该好好反思一下了。〕 August 28 ORACLE的时间转换函数 Oracle的数据库比较特殊,不像Mysql的数据可以自动转换, 比如时间类型,如果用字符串赋值就会报错, 所以Oracle中就有TO_DATE函数来完成类型转换。 StrSql = "SELECT colum FROM tablename WHERE date_arg= TO_DATE('2004-09-25' , 'yyyy-mm-dd') 注意函数后面的部分: YYYY-MM-DD ,这是你提供的日期字符串的日期格式参数, ORACLE 将根据你的格式参数读取日期(表 1 中列出经常会用到的参数)。 如果要还原回来怎么办呢?没关系,我们还有另一个函数 TO_CHAR(date) ,它与 To_DATE 是一对反函数,使用的格式也与 TO_DATE 类似,这里也举一个简单的例子,假设我们要查询系统时间,那么格式如下: SELECT TO_CHAR(SYSDATE,'DD-MON-YYYY HH24:MI:SS') "Right Now" From Dual; 结果显示: Right Now ――――――――――――――――――― 16 - Nov - 2001 14 : 23 : 22 对照下面的参数表,相信你很快就能够掌握这两个函数的应用的 日期格式参数 含义说明 D 一周中的星期几 DAY 天的名字,使用空格填充到 9 个字符 DD 月中的第几天 DDD 年中的第几天 DY 天的简写名 IW ISO 标准的年中的第几周 IYYY ISO 标准的四位年份 YYYY 四位年份 YYY,YY,Y 年份的最后三位,两位,一位 HH 小时,按 12 小时计 HH24 小时,按 24 小时计 MI 分 SS 秒 MM 月 Mon 月份的简写 Month 月份的全名 W 该月的第几个星期 WW 年中的第几个星期 August 20 PC I/O端口功能表PC只用了10位地址线(A0-A9)进行译码,其寻址的范围为0H-3FFH,共有1024个I/O地址。 这1024个地址中前半段(A9=0,范围为0H-1FFH)是属于主机板I/O译码, 后半段(A9=1,范围为200H-3FFH)则是用来扩展插槽上的I/O译码用。 I/O端口功能表 ——————————————————————————— I/O地址 功能、用途 ——————————————————————————— 0 DMA通道0,内存地址寄存器(DMA控制器1(8237)) 1 DMA通道0, 传输计数寄存器 2 DMA通道1,内存地址寄存器 3 DMA通道1, 传输计数寄存器 4 DMA通道2,内存地址寄存器 5 DMA通道2, 传输计数寄存器 6 DMA通道3,内存地址寄存器 7 DMA通道3, 传输计数寄存器 8 DMA通道0-3的状态寄存器 0AH DMA通道0-3的屏蔽寄存器 0BH DMA通道0-3的方式寄存器 0CH DMA清除字节指针 0DH DMA主清除字节 0EH DMA通道0-3的清屏蔽寄存器 0FH DMA通道0-3的写屏蔽寄存器 19H DMA起始寄存器 20H-3FH 可编程中断控制器1(8259)使用 40H 可编程中断计时器(8253)使用,读/写计数器0 41H 可编程中断计时器寄存器 42H 可编程中断计时器杂项寄存器 43H 可编程中断计时器,控制字寄存器 44H 可编程中断计时器,杂项寄存器(AT) 47H 可编程中断计时器,计数器0的控制字寄存器 48H-5FH 可编程中断计时器使用 60H-61H 键盘输入数据缓冲区 61H AT:8042键盘控制寄存器/XT:8255输出寄存器 62H 8255输入寄存器 63H 8255命令方式寄存器 64H 8042键盘输入缓冲区/8042状态 65H-6FH 8255/8042专用 70H CMOS RAM地址寄存器 71H CMOS RAM数据寄存器 80H 生产测试端口 81H DMA通道2,页表地址寄存器 82H DMA通道3,页表地址寄存器 83H DMA通道1,页表地址寄存器 87H DMA通道0,页表地址寄存器 89H DMA通道6,页表地址寄存器 8AH DMA通道7,页表地址寄存器 8BH DMA通道5,页表地址寄存器 8FH DMA通道4,页表地址寄存器 93H-9FH DMA控制器专用 0A0H NM1屏蔽寄存器/可编程中断控制器2 0A1H 可编程中断控制器2屏蔽 0C0H DMA通道0,内存地址寄存器(DMA控制器2(8237)) 0C2H DMA通道0, 传输计数寄存器 0C4H DMA通道1,内存地址寄存器 0C6H DMA通道1, 传输计数寄存器 0C8H DMA通道2,内存地址寄存器 0CAH DMA通道2, 传输计数寄存器 0CCH DMA通道3,内存地址寄存器 0CEH DMA通道3, 传输计数寄存器 0D0H DMA状态寄存器 0D2H DMA写请求寄存器 0D4H DMA屏蔽寄存器 0D6H DMA方式寄存器 0D8H DMA清除字节指针 0DAH DMA主清 0DCH DMA清屏蔽寄存器 0DEH DMA写屏蔽寄存器 0DFH-0EFH 保留 0F0H-0FFH 协处理器使用 100H-16FH保留 170H 1号硬盘数据寄存器 171H 1号硬盘错误寄存器 172H 1号硬盘数据扇区计数 173H 1号硬盘扇区数 174H 1号硬盘柱面(低字节) 175H 1号硬盘柱面(高字节) 176H 1号硬盘驱动器/磁头寄存器 177H 1号硬盘状态寄存器 1F0H 0号硬盘数据寄存器 1F1H 0号硬盘错误寄存器 1F2H 0号硬盘数据扇区计数 1F3H 0号硬盘扇区数 1F4H 0号硬盘柱面(低字节) 1F5H 0号硬盘柱面(高字节) 1F6H 0号硬盘驱动器/磁头寄存器 1F7H 0号硬盘状态寄存器 1F9H-1FFH保留 200H-20FH游戏控制端口 210H-21FH扩展单元 278H 3号并行口,数据端口 279H 3号并行口,状态端口 27AH 3号并行口,控制端口 2B0H-2DFH保留 2E0H EGA/VGA使用 2E1H GPIP(0号适配器) 2E2H 数据获取(0号适配器) 2E3H 数据获取(1号适配器) 2E4H-2F7H保留 2F8H 2号串行口,发送/保持寄存器(RS232接口卡2) 2F9H 2号串行口,中断有效寄存器 2FAH 2号串行口,中断ID寄存器 2FBH 2号串行口,线控制寄存器 2FCH 2号串行口,调制解调控制寄存器 2FDH 2号串行口,线状态寄存器 2FEH 2号串行口,调制解调状态寄存器 2FFH 保留 300H-31FH原形卡 320H 硬盘适配器寄存器 322H 硬盘适配器控制/状态寄存器 324H 硬盘适配器提示/中断状态寄存器 325H-347H保留 348H-357H DCA3278 366H-36FH PC网络 372H 软盘适配器数据输出/状态寄存器 375H-376H 软盘适配器数据寄存器 377H 软盘适配器数据输入寄存器 378H 2号并行口,数据端口 379H 2号并行口,状态端口 37AH 2号并行口,控制端口 380H-38FH SDLC及BSC通讯 390H-393H Cluster适配器0 3A0H-3AFH BSC通讯 3B0H-3B H MDA视频寄存器 3BCH 1号并行口,数据端口 3BDH 1号并行口,状态端口 3BEH 1号并行口,控制端口 3C0H-3CFH EGA/VGA视频寄存器 3D0H-3D7H CGA视频寄存器 3F0H-3F7H 软盘控制器寄存器 3F8H 1号串行口,发送/保持寄存器(RS232接口卡1) 3F9H 1号串行口,中断有效寄存器 3FAH 1号串行口,中断ID寄存器 3FBH 1号串行口,线控制寄存器 3FCH 1号串行口,调制解调控制寄存器 3FDH 1号串行口,线状态寄存器 3FEH 1号串行口,调制解调状态寄存器 3FFH 保留 August 19 转载 键盘 缓存 模拟输入键盘是我们使用计算机的一个很重要的输入设备了,即使在鼠标大行其道的今天,很多程序依然离不开键盘来操作。但是有时候,一些重复性的,很繁琐的键盘操作总会让人疲惫,于是就有了用程序来代替人们按键的方法,这样可以把很多重复性的键盘操作交给程序来模拟,省了很多精力,按键精灵就是这样的一个软件。那么我们怎样才能用VB来写一个程序,达到与按键精灵类似的功能呢?那就让我们来先了解一下windows中响应键盘事件的机制。 1.局部级模拟 从上面的流程可以看出,键盘事件是最终被送到活动窗口,然后才引起目标程序响应的。那么最直接的模拟方法就是:直接伪造一个键盘消息发给目标程序。哈哈,这实在是很简单,windows提供了几个这样的API函数可以实现直接向目标程序发送消息的功能,常用的有SendMessage和 PostMessage,它们的区别是PostMessage函数直接把消息仍给目标程序就不管了,而SendMessage把消息发出去后,还要等待目标程序返回些什么东西才好。这里要注意的是,模拟键盘消息一定要用PostMessage函数才好,用SendMessage是不正确的(因为模拟键盘消息是不需要返回值的,不然目标程序会没反应),切记切记!PostMessage函数的VB声明如下: Function MakeKeyLparam(ByVal VirtualKey As Long, ByVal flag As Long) As Long 这个函数像这样调用,比如按下A键,那么lParam= MakeKeyLparam(VK_A,WM_KEYDOWN) ,很简单吧。值得注意的是,即使你发送消息时设置了lParam参数的值,但是系统在传递消息时仍然可能会根据当时的情况重新设置该参数,那么目标程序收到的消息中lParam的值可能会和你发送时的有所不同。所以,如果你很懒的话,还是直接把它设为0吧,对大多数程序不会有影响的,呵呵。 Public Const WM_KEYDOWN = &H100 Function MakeKeyLparam(ByVal VirtualKey As Long, ByVal flag As Long) As Long Private Sub Form_Load() 这就是通过局部键盘消息来模拟按键。这个方法有一个极大的好处,就是:它可以实现后台按键,也就是说他对你的前台操作不会有什么影响。比如,你可以用这个方法做个程序在游戏中模拟按键来不断地执行某些重复的操作,而你则一边喝茶一边与 QQ上的MM们聊得火热,它丝毫不会影响你的前台操作。无论目标程序是否获得焦点都没有影响,这就是后台模拟按键的原理啦~~~~
你会发现,用上面的方法模拟按键并不是对所有程序都有效的,有的程序啊,你向它发了一大堆消息,可是它却一点反应也没有。这是怎么回事呢?这就要看具体的情况了,有些程序(特别是一些游戏)出于某些原因,会禁止用户对它使用模拟按键程序,这个怎么实现呢?比如可以在程序中检查一下,如果发现自己不是活动窗口,就不接受键盘消息。或者仔细检查一下收到的键盘消息,你会发现真实的按键和模拟的按键消息总是有一些小差别,从这些小差别上,目标程序就能判断出:这是假的!是伪造的!!因此,如果用PostMessage发送局部消息模拟按键不成功的话,你可以试一试全局级的键盘消息,看看能不能骗过目标程序。 Type KEYBDINPUT Const INPUT_KEYBOARD = 1 Sub MySendKey(bkey As Long) 除了以上这些,用全局钩子也可以模拟键盘消息。如果你对windows中消息钩子的用法已经有所了解,那么你可以通过设置一个全局HOOK来模拟键盘消息,比如,你可以用WH_JOURNALPLAYBACK这个钩子来模拟按键。WH_JOURNALPLAYBACK是一个系统级的全局钩子,它和 WH_JOURNALRECORD的功能是相对的,常用它们来记录并回放键盘鼠标操作。WH_JOURNALRECORD钩子用来将键盘鼠标的操作忠实地记录下来,记录下来的信息可以保存到文件中,而WH_JOURNALPLAYBACK则可以重现这些操作。当然亦可以单独使用 WH_JOURNALPLAYBACK来模拟键盘操作。你需要首先声明SetWindowsHookEx函数,它可以用来安装消息钩子: 如果上面的方法你都试过了,可是你发现目标程序却仍然顽固的不接受你模拟的消息,寒~~~~~~~~~还好,我还剩下最后一招,这就是驱动级模拟:直接读写键盘的硬件端口! Declare Function MapPhysToLin Lib "WinIo.dll" (ByVal PhysAddr As Long, ByVal PhysSize As Long, ByRef PhysMemHandle) As Long ' ------------------------------------以上是WINIO函数声明------------------------------------------- Declare Function MapVirtualKey Lib "user32" Alias "MapVirtualKeyA" (ByVal wCode As Long, ByVal wMapType As Long) As Long '-----------------------------------以上是WIN32 API函数声明----------------------------------------- 再添加下面这个过程: Public Const KBC_KEY_CMD = &H64 '键盘命令端口 Sub MyKeyDown(ByVal vKeyCoad As Long) Sub MyKeyUp(ByVal vKeyCoad As Long) |
|
|