<?xml version="1.0" encoding="utf-8"?><?xml-stylesheet type='text/xsl' href='http://skywolfstudio.spaces.live.com/mmm2008-07-24_12.50/rsspretty.aspx?rssquery=en-US;http%3a%2f%2fskywolfstudio.spaces.live.com%2ffeed.rss' version='1.0'?><rss version="2.0" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:msn="http://schemas.microsoft.com/msn/spaces/2005/rss" xmlns:live="http://schemas.microsoft.com/live/spaces/2006/rss" xmlns:dcterms="http://purl.org/dc/terms/" xmlns:cf="http://www.microsoft.com/schemas/rss/core/2005" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>阿福台</title><description>[活着的理由] http://www.youngcore.com  |  http://www.afutai.com</description><link>http://skywolfstudio.spaces.live.com/</link><language>en-US</language><pubDate>Sun, 28 Sep 2008 15:25:56 GMT</pubDate><lastBuildDate>Sun, 28 Sep 2008 15:25:56 GMT</lastBuildDate><generator>Microsoft Spaces v1.1</generator><docs>http://www.rssboard.org/rss-specification</docs><ttl>60</ttl><live:identity><live:id>-3393211484310952491</live:id><live:alias>skywolfstudio</live:alias></live:identity><image><title>阿福台</title><url>http://blufiles.storage.live.com/y1pTcdtbX8jyeKV1rXAXy1SvgP9pyEdJAOD6YxL2-XomUdMq2uoLrZ_hDVg2LDgr53S</url><link>http://skywolfstudio.spaces.live.com/</link></image><cf:listinfo><cf:group ns="http://schemas.microsoft.com/live/spaces/2006/rss" element="typelabel" label="Type" /><cf:group ns="http://schemas.microsoft.com/live/spaces/2006/rss" element="tag" label="Tag" /><cf:group element="category" label="Category" /><cf:sort element="pubDate" label="Date" data-type="date" default="true" /><cf:sort element="title" label="Title" data-type="string" /><cf:sort ns="http://purl.org/rss/1.0/modules/slash/" element="comments" label="Comments" data-type="number" /></cf:listinfo><item><title>[转载]我所知道的奶业内幕！(不知真的假的)</title><link>http://skywolfstudio.spaces.live.com/Blog/cns!D0E8E4220DDEA5D5!1188.entry</link><description>我不想再忍了，我所知道的奶业内幕！ &lt;br&gt;我所学的专业是乳品工艺，刚毕业曾在某国内老大级乳业集团工作。职位——收奶员。 &lt;br&gt;  这几天的三鹿事件，沸沸扬扬。其实在我看来，没什么奇怪的，事情总是要被揭穿的，只不过是时间问题，以及是哪一家企业成为那个撞上枪口的倒霉蛋。三聚氰胺————冰山的一角。也许这个事件就要告下一个段落，也许仅仅是个序幕的开始……&lt;br&gt;离职的员工到处去说原来公司的“坏话”，这个员工一定个没有道德的人。曾经我也是这么认为的，可最近我的想法变了，一个知道内情而不去告诉别人，眼看着别人吃亏上当的人，那才是个彻底道德败坏的人。&lt;br&gt;离职后，我没喝过一滴奶！&lt;br&gt;我先讲一下，收奶的过程。奶农的牛奶由当地附近村镇的奶站化验收集，按品质高低，分等级付给奶农钱。品质的指标不外乎PH值，蛋白质，干物质这几项。然后由奶站（当然了奶站是私人老板的）用罐装车混装后运到工厂，然后由工厂取样化验，测算指标同样按品质高低，分等级付给奶站钱。不知道大家看没看出来，想没想到这种操作模式会出现什么问题？有人说了，不是“天然牧场”“工业化收集吗”？有，的确有。但是我只能说：兄弟，你很傻，很天真！&lt;br&gt;奶农想多赚钱怎么办呢？简单啊，掺水啊。那掺水指标降低就卖不上好价了怎么办？简单啊掺****啊。奶站想多赚钱怎么办呢？简单啊……。奶站的奶是从各个散户收来混装到罐车的，有一家的突然变质了，怎么办啊，全车都倒了吗？几十吨一罐的奶，蛋白质低了怎么办？干物质低了怎么办？PH值低了怎么办？有的牛病了打过抗生素怎么办？有的牛催奶打激素怎么办？&lt;br&gt;话说回来了，奶农那点小计量能瞒奶站吗？奶站那点小九九能瞒工厂吗？如果我说，奶站不知情，工厂不知情。都是“不法奶农”干的坏事，全国人民要把矛头指向他们批判。那我可就真的，很傻，很天真。 &lt;br&gt;  我们从来不拒收奶，因为我们知道，一件东西是要充分利用的，这样才能取得最大的价值，获得最大的利润。我们分罐储藏。最好的奶，供到车间做酸奶（发酵型酸奶或搅拌型酸奶），因为不是好奶做不出来。其次，做纯牛奶，高钙奶之类的。再差的奶做花色奶即花生奶，早餐奶等。还有那些发酸的奶怎么办呢，当然不能倒了，做酸性乳饮料，就是广告狂哄乱炸的，女人小孩都喝的***。这是本公司最大的利润所在，一盒奶的成本，还没有哪个包装盒值钱。还有那种臭的熏人的奶怎么办呢，简单，做冰激凌味道最好。还有那些又臭成粘稠状的怎么办呢，做奶粉。当然这叫工业粉，它有它的用途，不是装袋子就上市场的。 &lt;br&gt;我们有全球最大最先进的立体式仓库，媒体都赞扬过，可是你就没想想这快速消费品，生产出来就要卖的，搞那么大仓库什么用？酸性乳饮料越存放味道越好。那有人问了，生产日期怎么办？简单啊，提前打一个月，你也许不信吧，因为在你心中那是小黑工厂做的事。那又有人问了，市场上卖的岂不是过期奶？ 我就这么告诉你吧，你手中那盒奶就是过期一周了，你喝也没问题。因为你所卖的奶是UHT超高温灭菌液态奶。 &lt;br&gt;关于UHT超高温灭乳到底有没有营养，我不想再说了，因为这个涉及到某人在某年为中国提出的一个口号，我们正向这个口号迈进，别管你喝的是什么奶，反正是牛奶。&lt;br&gt;有个广告，中国某企业已经是这种超高温灭菌乳全球产销量第一，难道是那些乳业发达国家真的比不上我们了吗？其实是人家不生产这种乳品了。这笑话有点冷是吧。 &lt;br&gt;那有人说了，我们以后喝高端奶吧，广告都说想过有品位的生活就和那种奶。是啊，那奶是贵啊，贵的东西就好啊，那奶蛋白质高啊，高，实在是高，这一点澳大利亚人都服我们啊。&lt;br&gt;我就不相信地球上的奶牛能挤出那么高蛋白质的奶…… &lt;br&gt;此言一出，某些专家就会来“辟谣”又得列出一套数据理论，来“引导”大家。&lt;br&gt;是啊，我嘴没人家的大，钱更没人家拿的多……&lt;br&gt;还有很多关键的还是不说为好，知道了对大家谁都不好。生活是美好的。 &lt;br&gt;  &lt;br&gt;真实案例看三鹿奶粉背后的恐怖的行业潜规则  &lt;br&gt;目前闹得沸沸扬扬的三鹿奶粉事件，作为一个可能的知情者和懂点化学的人，我也来谈谈我的观点：  &lt;br&gt;1、媒体也好，厂家也好，国*家质量监督也好，还是在忽悠大家，为什么我敢这么说，因为三聚氰氨根本不可能直接加入牛奶中，三聚氰氨的市场售价并不低，奶农不可能不计成本的提高浓度，其次，三聚氰氨水溶性较差，要想完全溶于牛奶比较麻烦；那为什么媒体，厂家，国*家质量监督要异口同声的说是不法之徒加入了三聚氰氨，其实就是为为了掩盖一个更可怕的问题，那就是加入的其他毒性更大的东西，说穿了就是尿素，尿素作为一种便宜的农家化肥，真是经济实惠的“好添加剂”。  &lt;br&gt;2、为什么要加尿素，因为各乳品公司收购鲜奶，测试的标准主要是奶的蛋白质含量，说穿了就是氮的含量，尿素作为一种最普遍的氮肥，由于它独特的分子结构，记得好象是两个氮分子配个什么我忘了，氮的含量当然高了，混入奶中，提高氮浓度，价格自然也卖得高了；  &lt;br&gt;3、尿素怎么转化为三聚氰氨的，很简单，奶粉的生产过程就是将鲜奶放在封闭的环境高温环境下，然后采取喷雾的方式直接转化成粉状就成了奶粉，而尿素在高温下会产生变化，生成三聚氰氨，OK，有毒的奶粉就这样生成了。  &lt;br&gt;最后，我在谈谈我怎么知道这些内幕的，前几年，是01年还是02年，我记不太清楚了，在办理一件带黑社会性质的案件时，他们主要罪状之一就是把持我市某区的牛奶收购市场，长期以次冲好，我们在办案中就了解到，他们在牛奶中加入尿素、少量食用油，然后加大量水（良心好的加自来水，不好的就直接加池塘或者田里的水），最后用专用的搅拌机进行搅拌，一批蛋白质浓度高的鲜奶诞生了，但最后几个犯罪分子都翻供，说他们这种做法是普遍的，并不是他们发明的，后来我们专门去天友了解，确实如此，他们对牛奶收购中出现的这些问题根本没有比较有效的检测措施或者是因为收购站点太多，没有精力和金钱来负担这么大的检测开销，所以对广大奶农的行为基本采取的是默认的态度，而且据在天友的了解，这种现象在全国的乳制品行业是普遍的，只要存在向奶农收购牛奶，就普遍存在次类现象，所以三鹿事件的发生就是必然的，而且这次三鹿出了事，全国其他所有奶制品企业都保持沉默，没有一家跳出来指责，什么原因大家看了我的帖应该心里有数了吧，最后弱弱的问大家一句，这样的牛奶你们敢喝吗？
&lt;div&gt;&lt;/div&gt;&lt;img src="http://c.services.spaces.live.com/CollectionWebService/c.gif?cid=-3393211484310952491&amp;page=RSS%3a+%5b%e8%bd%ac%e8%bd%bd%5d%e6%88%91%e6%89%80%e7%9f%a5%e9%81%93%e7%9a%84%e5%a5%b6%e4%b8%9a%e5%86%85%e5%b9%95%ef%bc%81(%e4%b8%8d%e7%9f%a5%e7%9c%9f%e7%9a%84%e5%81%87%e7%9a%84)&amp;referrer=" width="1px" height="1px" border="0" alt=""&gt;&lt;img style="position:absolute" alt="" width="0px" height="0px" src="http://c.live.com/c.gif?NC=31263&amp;amp;NA=1149&amp;amp;PI=73329&amp;amp;RF=&amp;amp;DI=3919&amp;amp;PS=85545&amp;amp;TP=skywolfstudio.spaces.live.com&amp;amp;GT1=skywolfstudio"&gt;</description><category>健康与保健</category><comments>http://skywolfstudio.spaces.live.com/Blog/cns!D0E8E4220DDEA5D5!1188.entry#comment</comments><guid isPermaLink="true">http://skywolfstudio.spaces.live.com/Blog/cns!D0E8E4220DDEA5D5!1188.entry</guid><pubDate>Fri, 19 Sep 2008 03:15:14 GMT</pubDate><slash:comments>0</slash:comments><msn:type>blogentry</msn:type><live:type>blogentry</live:type><live:typelabel>Blog entry</live:typelabel><wfw:commentRss>http://skywolfstudio.spaces.live.com/blog/cns!D0E8E4220DDEA5D5!1188/comments/feed.rss</wfw:commentRss><wfw:comment>http://skywolfstudio.spaces.live.com/Blog/cns!D0E8E4220DDEA5D5!1188.entry#comment</wfw:comment><dcterms:modified>2008-09-19T03:15:14Z</dcterms:modified></item><item><title>社会保险的构成</title><link>http://skywolfstudio.spaces.live.com/Blog/cns!D0E8E4220DDEA5D5!1186.entry</link><description>&lt;div&gt;社会保险的构成 &lt;br&gt; 养老保险 &lt;br&gt; 失业保险 &lt;br&gt; 工伤保险 &lt;br&gt; 医疗保险 &lt;br&gt; 生育保险 &lt;br&gt;一、养老保险 &lt;br&gt;1、基本养老保险 &lt;br&gt;基本养老保险是由国家通过立法强制实行，保证劳动者在年老丧失劳动能力时，给予基本生活保障的制度 &lt;br&gt;它适用于各类企业于职工，标准基本统一，费用实行国家、企业、个人三方面共同负担 &lt;br&gt;社会统筹于与个人账户相结合 &lt;br&gt;每个职工都有一个终身不变的养老保险账户，将个人缴费部分和用人单位缴纳退休统筹费的一部分，一并计入个人账户，不管职工到哪里工作，只要个人和单位缴了费，都计入个人账户，到退休时，按个人账户的累计储额计发放养老金 &lt;br&gt;个人账户包括： &lt;br&gt;1、个人缴纳的全部基本养老保险费； &lt;br&gt;2、企业缴纳基本养老保险费中按被保险人个人缴费工资基数的一定比例划入的部分； &lt;br&gt;3、个人账户存储额的利息 &lt;br&gt;个人账户储存额的存储方式和使用范围？ &lt;br&gt;1、购买国家社会保险基金特种定向债券 &lt;br&gt;2、存入银行养老保险基金专户 &lt;br&gt;个人账户存储额只能用于养老，不得要求提前支取，用于购房、医疗或子女教育等。 &lt;br&gt;个人账户能否继承？ &lt;br&gt;职工在职死亡或离退休后死亡，其个人账户可以继承 &lt;br&gt; 在职死亡：继承额为个人账户储存额中的个人缴费部分本息 &lt;br&gt; 离退休后死亡： &lt;br&gt;继承额=个人账户余额×个人缴费本息占个人账户全部储存额的比例 &lt;br&gt;什么是缴费工资 &lt;br&gt; 缴费工资是指单位及个人按规定比例计算的缴纳养老保险费的基数，是个人计算养老水平的重要依据。 &lt;br&gt;基本养老保险费缴纳标准 &lt;br&gt;1、个人：以本人上一年月平均工资为缴费工资基数，缴费比例为8%； &lt;br&gt;2、单位按全部被保险人缴费工资基数之和的19%缴纳基本养老保险费（自2003年起调整为20%） &lt;br&gt;个人账户中企业划入比例如何确定？ &lt;br&gt;1998年7月《规定》要求：为被保险人按其缴费工资基数的11%建立基本养老保险个人账户 &lt;br&gt;企业缴费划入比例为3% &lt;br&gt;哪些人可以按月领取基本养老金？ &lt;br&gt; 在达到国家规定的退休年龄时，累计缴纳基本养老保险费满15年以上； &lt;br&gt; 1988年7月日《规定》实施前参加工作、实施后退休的人员，累计缴纳基本养老保险费满10年以上。 &lt;br&gt;基本养老保险待遇 &lt;br&gt; 基本养老由基础养老金和个人账户养老金组成 &lt;br&gt;1、基础养老金月标准：上一年本市职工月平均工资的20%； &lt;br&gt;2、个人账户养老金标准：本人账户储存额的1/120； &lt;br&gt; 个人缴费年限不满15年的，退休后不享受按月领取基本养老金待遇，其个人账户储存额一次支付给本人。 &lt;br&gt;二、失业保险 &lt;br&gt;什么是失业保险？ &lt;br&gt; 失业保险是由国家通过立法强制实行，由社会集中建立基金，对因失业而暂时中断生活来源的劳动者提供物质帮助的制度。 &lt;br&gt;1、强制原则 &lt;br&gt;2、统一原则 &lt;br&gt;3、三方负担原则 &lt;br&gt;失业保险费缴纳标准？ &lt;br&gt; 单位：按本单位上年职工月月平均工资总额的1.5%缴纳失业保险费； &lt;br&gt; 个人：个人按本人上年月平均工资的0.5%缴纳失业保险费。 &lt;br&gt;享受失业保险金的条件？ &lt;br&gt;1、已参加失业保险，并按规定缴费； &lt;br&gt;2、非本人意愿中断就业； &lt;br&gt;3、已办理失业登记，并有求职要求。 &lt;br&gt;失业人员的待遇？ &lt;br&gt;1、医疗补助金； &lt;br&gt;2、一次性医疗补助金； &lt;br&gt;3、计划生育补助金； &lt;br&gt;4、丧葬补助金； &lt;br&gt;5、抚恤金 &lt;br&gt;失业保险的发放期限？ &lt;br&gt; 1-2年，领3个月； &lt;br&gt; 2-3年，领6个月； &lt;br&gt; 3-4年，领9个月； &lt;br&gt; 4-5年，领12个月； &lt;br&gt; 5年以上，每满1年增发1个月，最长不超过24个月。 &lt;br&gt;失业标准金的领取标准？ &lt;br&gt;1、缴费&amp;lt;5年，按最低工资的70%； &lt;br&gt;2、5-10年，按最低工资的75%； &lt;br&gt;3、…… &lt;br&gt;从第13个月起，按最低工资的70% &lt;br&gt;三、工伤保险 &lt;br&gt;什么是工伤保险？ &lt;br&gt;工伤保险是由国家通过立法，对在保险范围之内的劳动者因工作意外事故和职业病遭受意外伤害，丧失劳动能力的，提供医疗救治，职业康复、经济补偿和基本生活保障；对因工伤死亡的，对其遗属提供抚恤等物质帮助的社会保险制度。 &lt;br&gt;享受工伤保险金的条件？ &lt;br&gt; 因工伤身体呈疾病状态者 &lt;br&gt; 因工伤丧失劳动能力并因此中断工资收入者 &lt;br&gt; 永久或暂时丧失劳动能力而完全丧失或部分丧失工资收入者 &lt;br&gt; 遗属由于供养者死亡而失去生活费来源者 &lt;br&gt;工伤保险的待遇？ &lt;br&gt;1、工伤医疗待遇 &lt;br&gt;2、工伤津贴待遇 &lt;br&gt;3、伤残待遇 &lt;br&gt;4、职业康复待遇 &lt;br&gt;5、因工死亡待遇 &lt;br&gt;无责任补偿 &lt;br&gt;劳动者在生产工作中发生工伤事故时，无论事故责任是否属于劳动者本人，受职业伤害者都应无条件得到必要的经济补偿 &lt;br&gt;工伤保险费全由企业负担，个人不缴费 &lt;br&gt;四、医疗保险 &lt;br&gt;1、基本医疗保险 &lt;br&gt;1、基本医疗保险是政府举办，用人单位和职工共同参加，按照财政，用人单位和职工个人的承受能力来确定参保人员医疗待遇水平。 &lt;br&gt;2、基本医疗保险实行个人账户与统筹基金相结合，保障广大参保人的基本医疗要求 &lt;br&gt;什么是大额医疗互助制度？ &lt;br&gt;为了解决住院大病和门诊慢性病职工个人负担过重问题，由政府举办的一种补充医疗保险，参加医疗保险的企业和不享受公务员以来补助的事业单位必须参加，是基本医疗保险的必要补充部分 &lt;br&gt;基本医疗保险缴费标准 &lt;br&gt;基本医疗保险费 大额医疗费用 &lt;br&gt;参保职工 2% 5元 &lt;br&gt;退休人员 / 3元 &lt;br&gt;用人单位 9% 1% &lt;br&gt;职工以本人上一年月平均工资、企业以全部职工缴费工资和为基数 &lt;br&gt;基本医疗保险缴费标准说明 &lt;br&gt; 职工本人上一年月平均工资低于本市月平均工资的60%的，以上年本市职工月平均工资的60%作为缴费工资基数 &lt;br&gt; 月平均工资膏腴本市平均工资的300%以上标准部分不作为缴费基数 &lt;br&gt;个人账户 &lt;br&gt; 个人账户是经办机构通过银行为参保人设立的一个特殊账户，用于纪录、储存个人缴纳的医疗保险费和单位缴费中划入的保费的使用情况。 &lt;br&gt; 个人账户的资金属于个人所有，只能用于支付医疗费用，个人不能向账户存钱 &lt;br&gt;个人账户资金的来源 &lt;br&gt;1、个人缴费全部计入个人账户 &lt;br&gt;2、单位缴费按比例划入个人账户 &lt;br&gt; 不满35周岁的按本人与缴费工资的0.8%划入； &lt;br&gt; 35-44周岁按1%划入； &lt;br&gt; 45周岁以上按2%划入； &lt;br&gt; 不满70周岁的退休人员按上年市平均工资的4.3%划入 &lt;br&gt; 70周岁以上按4.8%划入 &lt;br&gt;个人账户支付范围 &lt;br&gt;1、门诊、急诊费用； &lt;br&gt;2、定点药店够要费用； &lt;br&gt;3、统筹基金起付钱以下的费用； &lt;br&gt;4、起付线上按比例由个人负担的费用 &lt;br&gt;统筹基金不支付的医疗费用 &lt;br&gt;1、非定点医疗机构就诊的（急诊除外） &lt;br&gt;2、非定点药店购药的（急诊除外） &lt;br&gt;3、因交通事故、医疗事故或其它责任事故造成伤害的 &lt;br&gt;4、本人吸毒、打架斗殴或因其它违法行为造成伤害的 &lt;br&gt;5、因自杀、自残、酗酒等原因进行治疗的 &lt;br&gt;6、在国外或香港、澳门特区及台湾地区治疗的 &lt;br&gt;7、按照国家和本市规定应当由个人自付的 &lt;br&gt;基本医疗保险：起付标准（单位元） &lt;br&gt;医院等级 起付标准 &lt;br&gt;在职职工 退休职工 &lt;br&gt;一级医院 500（759） 350（531） &lt;br&gt;二级医院 1000（1138） 700（797） &lt;br&gt;三级医院 2000（1897） 1400（1328） &lt;br&gt;注：起付标准为2005年7月1日后的标准，括号是7月1日前的标准 &lt;br&gt;基本医疗保险：支付比例 &lt;br&gt;医院等级 在职职工 退休职工 &lt;br&gt;统筹基金支付 个人支付 统筹基金支付 个人支付 &lt;br&gt;一级医院 90% 10% 93% 7% &lt;br&gt;二级医院 85% 15% 89.5% 10.5% &lt;br&gt;三级医院 80% 20% 86% 14% &lt;br&gt;基本医疗保险：封顶线 &lt;br&gt;封顶线（统筹基金最高支付限额）： &lt;br&gt;按年度累计机为上半年度本市职工平均工资的4倍计算 &lt;br&gt;例：上年度平均工资为：31020元 &lt;br&gt;封顶线为124080 &lt;br&gt;基本医疗保险：重疾补助 &lt;br&gt;重大疾病医疗补助支付费用 重大疾病医疗补助支付比例 个人支付比例 &lt;br&gt;0至10万元 90% 10% &lt;br&gt;10万元以上15万元以下 95% 5% &lt;br&gt;五、生育保险 &lt;br&gt;社会生育保险是国家针对女性生育行为、生育特点，通过国家强制手段征集生育基金，为怀孕和分娩的职业妇女及时提供经济帮助，保障参保母子的基本生活和健康，确保社会人口再生产和妇女、儿童权益的一项社会保障制度。 &lt;br&gt;哪些人适用生育保险？ &lt;br&gt; （一）国家机关、事业单位、国有企业、市属集体企业、社会团体、民办非企业单位、市属外商投资企业及其按规定参加我市养老保险的职工，中央、省和其他驻莞企业、机构及其参加综合基本医疗保险的职工，须同时参加生育保险。 &lt;br&gt; （二）镇区属集体企业、镇区外商投资企业私营企业及其职工，城镇个体经济组织及其从业人员，按我市养老保险的实施范围，在参加养老保险和住院基本医疗保险的同时，须以镇区为单位参加生育保险。 &lt;br&gt;缴交办法 &lt;br&gt; 职工生育保险根据“以支定收、略有节余”的原则筹集基金。 &lt;br&gt; 上述第二条第 （一）项中单位职工的生育保险费由单位按全部在职职工上年度月平均工资总额的0.5%逐月缴纳； &lt;br&gt; 第（二）项中单位职工的生育保险费由单位按本市（镇）上年度职工月平均工资的0.5%乘以在职职工人数逐月缴纳。职工个人不缴纳生育保险费。 &lt;br&gt;生育保险待遇 &lt;br&gt; 参加生育保险的职工，在投保两个月后，符合省、市计划生育规定的生育或计划内怀孕流产的，根据其参加综合基本医疗保险或住院基本医疗保险，分别按以下标准，一次性享受定额的生育津贴和生育医疗费待遇： &lt;br&gt; 参保产妇生育出院后，若在产褥期（产后六周内）患生育引起的疾病时，其住院基本医疗费分别按以下办法支付（其他疾病按医疗保险规定处理）： &lt;br&gt; 参加综合基本医疗保险及生育保险的女职工可由生育保险基金报销90%，个人负担10%；参加住院基本医疗保险及生育保险的女职工，由生育保险基金支付80%，个人负担20%。 &lt;br&gt;参保夫妻自愿终生只生一个孩子，符合《广东省计划生育条例》有关规定，并在计划生育部门领取有效的独生子女证明后，可一次性享受280元&lt;/div&gt;&lt;img src="http://c.services.spaces.live.com/CollectionWebService/c.gif?cid=-3393211484310952491&amp;page=RSS%3a+%e7%a4%be%e4%bc%9a%e4%bf%9d%e9%99%a9%e7%9a%84%e6%9e%84%e6%88%90&amp;referrer=" width="1px" height="1px" border="0" alt=""&gt;&lt;img style="position:absolute" alt="" width="0px" height="0px" src="http://c.live.com/c.gif?NC=31263&amp;amp;NA=1149&amp;amp;PI=73329&amp;amp;RF=&amp;amp;DI=3919&amp;amp;PS=85545&amp;amp;TP=skywolfstudio.spaces.live.com&amp;amp;GT1=skywolfstudio"&gt;</description><category>健康与保健</category><comments>http://skywolfstudio.spaces.live.com/Blog/cns!D0E8E4220DDEA5D5!1186.entry#comment</comments><guid isPermaLink="true">http://skywolfstudio.spaces.live.com/Blog/cns!D0E8E4220DDEA5D5!1186.entry</guid><pubDate>Fri, 12 Sep 2008 08:29:59 GMT</pubDate><slash:comments>0</slash:comments><msn:type>blogentry</msn:type><live:type>blogentry</live:type><live:typelabel>Blog entry</live:typelabel><wfw:commentRss>http://skywolfstudio.spaces.live.com/blog/cns!D0E8E4220DDEA5D5!1186/comments/feed.rss</wfw:commentRss><wfw:comment>http://skywolfstudio.spaces.live.com/Blog/cns!D0E8E4220DDEA5D5!1186.entry#comment</wfw:comment><dcterms:modified>2008-09-12T08:29:59Z</dcterms:modified></item><item><title>人生</title><link>http://skywolfstudio.spaces.live.com/Blog/cns!D0E8E4220DDEA5D5!1163.entry</link><description>&lt;div&gt;想法总是很多，现实总很无奈；只要尽你全力，人生定会精彩。&lt;/div&gt;&lt;img src="http://c.services.spaces.live.com/CollectionWebService/c.gif?cid=-3393211484310952491&amp;page=RSS%3a+%e4%ba%ba%e7%94%9f&amp;referrer=" width="1px" height="1px" border="0" alt=""&gt;&lt;img style="position:absolute" alt="" width="0px" height="0px" src="http://c.live.com/c.gif?NC=31263&amp;amp;NA=1149&amp;amp;PI=73329&amp;amp;RF=&amp;amp;DI=3919&amp;amp;PS=85545&amp;amp;TP=skywolfstudio.spaces.live.com&amp;amp;GT1=skywolfstudio"&gt;</description><category>小狼作品</category><comments>http://skywolfstudio.spaces.live.com/Blog/cns!D0E8E4220DDEA5D5!1163.entry#comment</comments><guid isPermaLink="true">http://skywolfstudio.spaces.live.com/Blog/cns!D0E8E4220DDEA5D5!1163.entry</guid><pubDate>Mon, 16 Jun 2008 13:18:57 GMT</pubDate><slash:comments>0</slash:comments><msn:type>blogentry</msn:type><live:type>blogentry</live:type><live:typelabel>Blog entry</live:typelabel><wfw:commentRss>http://skywolfstudio.spaces.live.com/blog/cns!D0E8E4220DDEA5D5!1163/comments/feed.rss</wfw:commentRss><wfw:comment>http://skywolfstudio.spaces.live.com/Blog/cns!D0E8E4220DDEA5D5!1163.entry#comment</wfw:comment><dcterms:modified>2008-06-16T13:18:57Z</dcterms:modified></item><item><title>Asprotect V2.X 的脱壳与修复的总结及练习</title><link>http://skywolfstudio.spaces.live.com/Blog/cns!D0E8E4220DDEA5D5!1161.entry</link><description>&lt;p&gt;作 者: blackeyes&lt;br&gt;关于Asprotect V2.X 的脱壳与修复, loveboom的《ASPROTECT 2.x 脱壳系列》已经非常的全面与经典. &lt;br&gt;本人在此只是依葫芦画瓢, 并将有些地方再详细的解释一下, 给菜鸟们脱Asprotect V2.X时进行参考, 高手就不要看了.&lt;br&gt;先在理论上研讨一下, 由于编译器的不一样, C 与 Delphi 所编译的汇编结果有差别, Asprotect 加壳时处理的也不一样.&lt;br&gt;先假设有一程序:&lt;br&gt;OEP: 00401000&lt;br&gt;IAT: 00407000 - 00407FFF&lt;br&gt;在00401100 CALL DLL1.API1&lt;br&gt;在00401180 CALL DLL1.API2&lt;br&gt;Ospr 加壳后, 好多的API CALL 被改成 CALL 12000000&lt;br&gt;然后开始研究.&lt;br&gt;1. C/C++ Program&lt;br&gt;1.1) 未被加壳的程序&lt;br&gt;00401000 55 PUSH EBP ; 程序 OEP&lt;br&gt;00401001 8BEC MOV EBP, ESP&lt;br&gt;...&lt;br&gt;00401100 FF15 00704000 CALL DWORD PTR DS:[00407000] ; DLL1.API1&lt;br&gt;00401106 ...&lt;br&gt;00401180 FF15 04704000 CALL DWORD PTR DS:[00407004] ; DLL1.API2&lt;br&gt;00401186 ...&lt;br&gt;********* IAT 可能是这样的 ************&lt;br&gt;00407000 DD 7C571000 // DLL1.API1&lt;br&gt;00407004 DD 7C572000 // DLL1.API2&lt;br&gt;...&lt;br&gt;004070FC DD 00000000&lt;br&gt;00407100 DD 7D00XXXX // DLL2.API1&lt;br&gt;...&lt;br&gt;004071FC DD 00000000&lt;br&gt;...&lt;br&gt;00407F00 DD 7F00XXXX // DLLn.API1&lt;br&gt;...&lt;br&gt;00407FFC DD 00000000 
&lt;p&gt;1.2) 被 Asprotect 加壳后的程序在OEP&lt;br&gt;00401000 55 PUSH EBP ; 程序 OEP&lt;br&gt;00401001 8BEC MOV EBP, ESP&lt;br&gt;...&lt;br&gt;00401100 E8 FBEEBF11 CALL 12000000 ; 壳&lt;br&gt;00401105 ??&lt;br&gt;00401106 ...&lt;br&gt;00401180 E8 7BEEBF11 CALL 12000000 ; 壳&lt;br&gt;00401185 ??&lt;br&gt;00401186 ...&lt;br&gt;*************IAT************************&lt;br&gt;00407000 DD ???????? // 被加密的 DLL1.API1 信息&lt;br&gt;00407004 DD 7C572000 // 未加密的 DLL1.API2&lt;br&gt;ASPR 将许多的API CALL 都改成了统一的 CALL 12000000 &lt;br&gt;即改 CALL DWORD PTR DS:[xxxxx] 成 CALL 12000000&lt;br&gt;作 者: blackeyes&lt;br&gt;关于Asprotect V2.X 的脱壳与修复, loveboom的《ASPROTECT 2.x 脱壳系列》已经非常的全面与经典. &lt;br&gt;本人在此只是依葫芦画瓢, 并将有些地方再详细的解释一下, 给菜鸟们脱Asprotect V2.X时进行参考, 高手就不要看了.&lt;br&gt;先在理论上研讨一下, 由于编译器的不一样, C 与 Delphi 所编译的汇编结果有差别, Asprotect 加壳时处理的也不一样.&lt;br&gt;先假设有一程序:&lt;br&gt;OEP: 00401000&lt;br&gt;IAT: 00407000 - 00407FFF&lt;br&gt;在00401100 CALL DLL1.API1&lt;br&gt;在00401180 CALL DLL1.API2&lt;br&gt;Ospr 加壳后, 好多的API CALL 被改成 CALL 12000000&lt;br&gt;然后开始研究.&lt;br&gt;1. C/C++ Program&lt;br&gt;1.1) 未被加壳的程序&lt;br&gt;00401000 55 PUSH EBP ; 程序 OEP&lt;br&gt;00401001 8BEC MOV EBP, ESP&lt;br&gt;...&lt;br&gt;00401100 FF15 00704000 CALL DWORD PTR DS:[00407000] ; DLL1.API1&lt;br&gt;00401106 ...&lt;br&gt;00401180 FF15 04704000 CALL DWORD PTR DS:[00407004] ; DLL1.API2&lt;br&gt;00401186 ...&lt;br&gt;********* IAT 可能是这样的 ************&lt;br&gt;00407000 DD 7C571000 // DLL1.API1&lt;br&gt;00407004 DD 7C572000 // DLL1.API2&lt;br&gt;...&lt;br&gt;004070FC DD 00000000&lt;br&gt;00407100 DD 7D00XXXX // DLL2.API1&lt;br&gt;...&lt;br&gt;004071FC DD 00000000&lt;br&gt;...&lt;br&gt;00407F00 DD 7F00XXXX // DLLn.API1&lt;br&gt;...&lt;br&gt;00407FFC DD 00000000 
&lt;p&gt;1.2) 被 Asprotect 加壳后的程序在OEP&lt;br&gt;00401000 55 PUSH EBP ; 程序 OEP&lt;br&gt;00401001 8BEC MOV EBP, ESP&lt;br&gt;...&lt;br&gt;00401100 E8 FBEEBF11 CALL 12000000 ; 壳&lt;br&gt;00401105 ??&lt;br&gt;00401106 ...&lt;br&gt;00401180 E8 7BEEBF11 CALL 12000000 ; 壳&lt;br&gt;00401185 ??&lt;br&gt;00401186 ...&lt;br&gt;*************IAT************************&lt;br&gt;00407000 DD ???????? // 被加密的 DLL1.API1 信息&lt;br&gt;00407004 DD 7C572000 // 未加密的 DLL1.API2&lt;br&gt;ASPR 将许多的API CALL 都改成了统一的 CALL 12000000 &lt;br&gt;即改 CALL DWORD PTR DS:[xxxxx] 成 CALL 12000000 
&lt;div&gt;&lt;/div&gt;&lt;img src="http://c.services.spaces.live.com/CollectionWebService/c.gif?cid=-3393211484310952491&amp;page=RSS%3a+Asprotect+V2.X+%e7%9a%84%e8%84%b1%e5%a3%b3%e4%b8%8e%e4%bf%ae%e5%a4%8d%e7%9a%84%e6%80%bb%e7%bb%93%e5%8f%8a%e7%bb%83%e4%b9%a0&amp;referrer=" width="1px" height="1px" border="0" alt=""&gt;&lt;img style="position:absolute" alt="" width="0px" height="0px" src="http://c.live.com/c.gif?NC=31263&amp;amp;NA=1149&amp;amp;PI=73329&amp;amp;RF=&amp;amp;DI=3919&amp;amp;PS=85545&amp;amp;TP=skywolfstudio.spaces.live.com&amp;amp;GT1=skywolfstudio"&gt;</description><category>软件破解</category><comments>http://skywolfstudio.spaces.live.com/Blog/cns!D0E8E4220DDEA5D5!1161.entry#comment</comments><guid isPermaLink="true">http://skywolfstudio.spaces.live.com/Blog/cns!D0E8E4220DDEA5D5!1161.entry</guid><pubDate>Fri, 06 Jun 2008 12:05:19 GMT</pubDate><slash:comments>1</slash:comments><msn:type>blogentry</msn:type><live:type>blogentry</live:type><live:typelabel>Blog entry</live:typelabel><wfw:commentRss>http://skywolfstudio.spaces.live.com/blog/cns!D0E8E4220DDEA5D5!1161/comments/feed.rss</wfw:commentRss><wfw:comment>http://skywolfstudio.spaces.live.com/Blog/cns!D0E8E4220DDEA5D5!1161.entry#comment</wfw:comment><dcterms:modified>2008-06-06T12:05:37Z</dcterms:modified></item><item><title>[转]手动脱壳ASProtect V2.X Registered</title><link>http://skywolfstudio.spaces.live.com/Blog/cns!D0E8E4220DDEA5D5!1158.entry</link><description>&lt;div&gt;
&lt;div style="font-size:12px"&gt;【PYG官方论坛】&lt;a href="http://bbs.chinapyg.com/" target="_blank"&gt;&lt;u&gt;&lt;font color="#0000ff"&gt;http://bbs.chinapyg.com&lt;/font&gt;&lt;/u&gt;&lt;/a&gt; &lt;br&gt;大家有空去看看&lt;br&gt;&lt;br&gt;================&lt;br&gt;&lt;br&gt;&lt;br&gt;我是个菜鸟，想跟大家学习点技术。&lt;br&gt;&lt;br&gt;第一次做动画，有什么错误的地方望高手指正。&lt;br&gt;&lt;br&gt;今天和大家讨论一下&lt;br&gt;&lt;br&gt;手动脱壳之ASProtect V2.X Registered -&amp;gt; Alexey Solodovnikov *&lt;br&gt;&lt;br&gt;//////////////////////////&lt;br&gt;设置Ollydbg忽略除了“内存访问异常”之外的所有其他异常选项。&lt;br&gt;用插件去掉Ollydbg的调试器标志。&lt;br&gt;&lt;br&gt;////////////////////////////////////////&lt;br&gt;OD载入后停在这里：&lt;br&gt;00401000 &amp;gt;  68 01B05600     PUSH csetup.0056B001  ===》壳的入口,F9运行&lt;br&gt;00401005    E8 01000000     CALL csetup.0040100B&lt;br&gt;0040100A    C3              RETN&lt;br&gt;0040100B    C3              RETN&lt;br&gt;0040100C    0D 6F2F026F     OR EAX,6F022F6F&lt;br&gt;00401011    5B              POP EBX&lt;br&gt;&lt;br&gt;===============&lt;br&gt;Shift+F9按N次，注意右下角堆栈&lt;br&gt;00AFFAFF    C601 9E         MOV BYTE PTR DS:[ECX],9E&lt;br&gt;00AFFB02    BB 71FE8A67     MOV EBX,678AFE71&lt;br&gt;00AFFB07    64:8F06         POP DWORD PTR FS:[ESI]&lt;br&gt;00AFFB0A    0000            ADD BYTE PTR DS:[EAX],AL&lt;br&gt;00AFFB0C    83C4 04         ADD ESP,4&lt;br&gt;00AFFB0F    8D0C07          LEA ECX,DWORD PTR DS:[EDI+EAX]&lt;br&gt;00AFFB12    59              POP ECX&lt;br&gt;&lt;br&gt;=====================&lt;br&gt;&lt;br&gt;0012FF50   0012FF5C  指向下一个 SEH 记录的指针&lt;br&gt;0012FF54   00AFFA50  SE处理程序&lt;br&gt;0012FF58   00000002&lt;br&gt;0012FF5C   0012FF80  指向下一个 SEH 记录的指针&lt;br&gt;0012FF60   00AFFFE8  SE处理程序&lt;br&gt;0012FF64   0012FF78&lt;br&gt;0012FF68   00A80000&lt;br&gt;0012FF6C   00AFF62C&lt;br&gt;0012FF70   00000000&lt;br&gt;0012FF74   00B3D84C  ASCII &amp;quot;FECE69A1-E37D&amp;quot;  ====》硬盘特征指纹&lt;br&gt;0012FF78   0012FF98&lt;br&gt;0012FF7C   00ADE2D0&lt;br&gt;0012FF80   0012FFE0  指向下一个 SEH 记录的指针&lt;br&gt;0012FF84   00AFF854  SE处理程序&lt;br&gt;0012FF88   0012FF98&lt;br&gt;&lt;br&gt;Shift+F9经过=23次异常后,堆栈出现硬盘特征指纹&lt;br&gt;=================&lt;br&gt;Shift+F9按5次，堆栈硬盘特征指纹消失，再按1次Shift+F9&lt;br&gt;00AFE8F9    C601 9E         MOV BYTE PTR DS:[ECX],9E&lt;br&gt;00AFE8FC    BB 71FE8A67     MOV EBX,678AFE71&lt;br&gt;00AFE901    64:8F06         POP DWORD PTR FS:[ESI]&lt;br&gt;00AFE904    0000            ADD BYTE PTR DS:[EAX],AL&lt;br&gt;00AFE906    83C4 04         ADD ESP,4&lt;br&gt;00AFE909    8D0C07          LEA ECX,DWORD PTR DS:[EDI+EAX]&lt;br&gt;00AFE90C    59              POP ECX&lt;br&gt;00AFE90D    A1 4848B000     MOV EAX,DWORD PTR DS:[B04848]&lt;br&gt;==================&lt;br&gt;向上找到这里：&lt;br&gt;00AFE8E3    C3              RETN&lt;br&gt;00AFE8E4    EB 01           JMP SHORT 00AFE8E7&lt;br&gt;00AFE8E6    9A C1D19D36 EB0&amp;gt;CALL FAR 01EB:369DD1C1                   ; 远调用&lt;br&gt;00AFE8ED    9A 83F1102B C96&amp;gt;CALL FAR 64C9:2B10F183                   ; 远调用&lt;br&gt;00AFE8F4    FF31            PUSH DWORD PTR DS:[ECX]&lt;br&gt;00AFE8F6    64:8921         MOV DWORD PTR FS:[ECX],ESP&lt;br&gt;00AFE8F9    C601 9E         MOV BYTE PTR DS:[ECX],9E&lt;br&gt;&lt;br&gt;在00AFE8E3    C3              RETN按F2下断，Shift+F9断下，取消断点，F8单步&lt;br&gt;&lt;br&gt;7C9237BF    64:8B25 0000000&amp;gt;MOV ESP,DWORD PTR FS:[0]&lt;br&gt;7C9237C6    64:8F05 0000000&amp;gt;POP DWORD PTR FS:[0]&lt;br&gt;7C9237CD    8BE5            MOV ESP,EBP&lt;br&gt;7C9237CF    5D              POP EBP&lt;br&gt;7C9237D0    C2 1400         RETN 14&lt;br&gt;&lt;br&gt;Alt+M查看内存在00401000按F2下断，F9运行&lt;br&gt;004B02B8    55              PUSH EBP&lt;br&gt;004B02B9    8BEC            MOV EBP,ESP&lt;br&gt;004B02BB    83C4 E4         ADD ESP,-1C&lt;br&gt;004B02BE    53              PUSH EBX&lt;br&gt;004B02BF    56              PUSH ESI&lt;br&gt;004B02C0    33C0            XOR EAX,EAX&lt;br&gt;004B02C2    8945 E4         MOV DWORD PTR SS:[EBP-1C],EAX&lt;br&gt;&lt;br&gt;004B02B8程序OEP脱壳之。是Borland Delphi 6.0 - 7.0&lt;br&gt;==================&lt;br&gt;&lt;br&gt;脱壳之后如何修复请高手指教。&lt;br&gt;&lt;br&gt;动画下载&lt;br&gt;&lt;a href="http://free.ys168.com/?a3chenming" target="_blank"&gt;&lt;u&gt;&lt;font color="#0000ff"&gt;http://free.ys168.com/?a3chenming&lt;/font&gt;&lt;/u&gt;&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;img src="http://c.services.spaces.live.com/CollectionWebService/c.gif?cid=-3393211484310952491&amp;page=RSS%3a+%5b%e8%bd%ac%5d%e6%89%8b%e5%8a%a8%e8%84%b1%e5%a3%b3ASProtect+V2.X+Registered&amp;referrer=" width="1px" height="1px" border="0" alt=""&gt;&lt;img style="position:absolute" alt="" width="0px" height="0px" src="http://c.live.com/c.gif?NC=31263&amp;amp;NA=1149&amp;amp;PI=73329&amp;amp;RF=&amp;amp;DI=3919&amp;amp;PS=85545&amp;amp;TP=skywolfstudio.spaces.live.com&amp;amp;GT1=skywolfstudio"&gt;</description><category>软件破解</category><comments>http://skywolfstudio.spaces.live.com/Blog/cns!D0E8E4220DDEA5D5!1158.entry#comment</comments><guid isPermaLink="true">http://skywolfstudio.spaces.live.com/Blog/cns!D0E8E4220DDEA5D5!1158.entry</guid><pubDate>Fri, 06 Jun 2008 09:10:57 GMT</pubDate><slash:comments>3</slash:comments><msn:type>blogentry</msn:type><live:type>blogentry</live:type><live:typelabel>Blog entry</live:typelabel><wfw:commentRss>http://skywolfstudio.spaces.live.com/blog/cns!D0E8E4220DDEA5D5!1158/comments/feed.rss</wfw:commentRss><wfw:comment>http://skywolfstudio.spaces.live.com/Blog/cns!D0E8E4220DDEA5D5!1158.entry#comment</wfw:comment><dcterms:modified>2008-06-06T09:10:57Z</dcterms:modified></item><item><title>破解常用断点大全</title><link>http://skywolfstudio.spaces.live.com/Blog/cns!D0E8E4220DDEA5D5!1157.entry</link><description>&lt;div&gt;&lt;br&gt;
&lt;div&gt;
&lt;table cellspacing=0 cellpadding=0 border=0&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td width=14&gt;
&lt;td background="/images/plus/top_c.gif"&gt;
&lt;td width=16&gt;&lt;img style="cursor:pointer" src="http://bbs.chinapyg.com/images/plus/top_r.gif" width=16&gt;
&lt;tr&gt;
&lt;td valign=top width=10 background="/images/plus/center_l.gif"&gt;
&lt;td valign=top bgcolor="#fffff1"&gt;
&lt;div style="font-size:12px"&gt;断点大全&lt;br&gt;&lt;br&gt;断点大全&lt;br&gt;密码常用中断&lt;br&gt;Hmemcpy (win9x专用)&lt;br&gt;GetDlgItemTextA &lt;br&gt;GetDlgItemInt&lt;br&gt;vb:&lt;br&gt;getvolumeinformationa 　&lt;br&gt;&lt;br&gt;vbastrcomp (trw)&lt;br&gt;Bpx __vbaStrComp (记得是两个 '_')&lt;br&gt;MSVBVM60!_vbastrcomp|sofice&lt;br&gt;MSVBVM50!           |　&lt;br&gt;&lt;br&gt;VBAI4STR　&lt;br&gt;&lt;br&gt;Ctrl+D &lt;br&gt;bpx msvbvm60!__vbastrcomp do &amp;quot;d *(esp+0c)&amp;quot;(softice) &lt;br&gt;按几次F5出册码出来了。 &lt;br&gt;bpx regqueryvalueexa do “d esp－&amp;gt;8”(trw)　&lt;br&gt;&lt;br&gt;vbaVarTstEq 判断是否注册的函数&lt;br&gt;(0042932F 66898580FEFFFF          mov word ptr [ebp+FFFFFE80], ax&lt;br&gt;改为0042932F 66898580FEFFFF       mov word ptr [ebp+FFFFFE80], bx)&lt;br&gt;&lt;br&gt;时间常用中断&lt;br&gt;GetSystemTime&lt;br&gt;GetLocalTime&lt;br&gt;GetTickCount&lt;br&gt;vb:&lt;br&gt;rtcGetPresentDate          //取得当前日期　&lt;br&gt;&lt;br&gt;杀窗常用中断&lt;br&gt;Lockmytask (win9x专用)&lt;br&gt;DestroyWindow&lt;br&gt;mouse_event (鼠标中断)&lt;br&gt;postquitmessage (Cracking足彩xp,很有用^_^)&lt;br&gt;vb:&lt;br&gt;_rtcMsgBox　&lt;br&gt;&lt;br&gt;ini文件内容常用中断&lt;br&gt;GetPrivateProfileStringA&lt;br&gt;GetPrivateProfileProfileInt　&lt;br&gt;&lt;br&gt;key文件:&lt;br&gt;getprivateprofileint&lt;br&gt;ReadFile&lt;br&gt;CreateFileA　&lt;br&gt;&lt;br&gt;注册表常用中断&lt;br&gt;RegQueryvalueA&lt;br&gt;RegQueryvalueExA　&lt;br&gt;&lt;br&gt;狗加密中断&lt;br&gt;BPIO -h 278 R&lt;br&gt;BPIO -h 378 R 　&lt;br&gt;&lt;br&gt;其它常用函数断点&lt;br&gt;CreateFileA (读狗驱动程序), &lt;br&gt;DeviceIOControl, &lt;br&gt;FreeEnvironmentStringsA (对付HASP非常有效). &lt;br&gt;Prestochangoselector (16-bit HASP's), '7242' 查找字符串 (对付圣天诺).具体含义参考下面的范例。　&lt;br&gt;&lt;br&gt;光盘破解中断&lt;br&gt;16:&lt;br&gt;getvolumeinformation&lt;br&gt;getdrivetype&lt;br&gt;int 2fh (dos)&lt;br&gt;32:&lt;br&gt;GetDriveTypeA  &lt;br&gt;GetFullPathNameA&lt;br&gt;GetWindowsDirectoryA　&lt;br&gt;&lt;br&gt;读磁盘中断&lt;br&gt;GETLASTERROR 返回扩充出错代码 　&lt;br&gt;&lt;br&gt;限制中断&lt;br&gt;EnableMenuItem 允许、禁止或变灰指定的菜单条目 &lt;br&gt;EnableWindow 允许或禁止鼠标和键盘控制指定窗口和条目（禁止时菜单变灰） 　&lt;br&gt;&lt;br&gt;不知道软盘中断是什么了？还有其它特殊中断，不知道其他朋友可否说一下了？&lt;br&gt;如:Lockmytask and mouse_event，这些就不是api32函数？&lt;br&gt;win9x 与 win2k进行破解，以上中断有部分已经不能用了？&lt;br&gt;不知道在win2k上，以上常用中断函数是什么了？&lt;br&gt;也就是问密码、时间、窗口、ini、key、注册表、加密狗、光盘、软盘、限制等！&lt;br&gt;了解常用的中断，对破解分析可以做到事半功倍！&lt;br&gt;请大家说一下！还有如何破解了某个软件时，一重启就打回原形？&lt;br&gt;不知道下什么中断了？可以分为三种情况：&lt;br&gt;1.比较可能在注册表中&lt;br&gt;2.比较在特殊文件(*.key *.ini *.dat等)&lt;br&gt;3.比较在程序中，没有任何错误提示或者反译也找不到明显字符(这个就是我想问的)　&lt;br&gt;&lt;br&gt;还有一个是最难的，就是去掉水印！&lt;br&gt;也可以三种情况：&lt;br&gt;A.水印是位图文件(bitblt,creatBITMAP等位图函数)&lt;br&gt;B.水印是明显字符(反译分析)&lt;br&gt;C.水印不是明显字符(如：This a demo!它只是显示在另一个制作文件上,可是*.htm *.exe等)&lt;br&gt;C.才是最难搞，也是很多人想知道的！包括我在内。不知道高手们有何提示了？　&lt;br&gt;&lt;br&gt;广告条：&lt;br&gt;可以分两种情况:&lt;br&gt;A.从创建窗口进手,可以用到movewindow或者其它窗口函数!&lt;br&gt;B.从位图进手,也可以用到bitblt或者其它位图函数!&lt;br&gt;最后可以借助一些现有工具(如:api27,vwindset,freespy之类的工具)　&lt;br&gt;&lt;br&gt;葡萄虽无树，藤生棚中秧。&lt;br&gt;人处凡尘中，岂不惹尘埃?　&lt;br&gt;&lt;br&gt;小球[CCG] &lt;br&gt;那要看是在哪作的标记，通常是在注册表中留下信息！ &lt;br&gt;在softice中就要用bpx regqueryvalueexa do &amp;quot;d esp-&amp;gt;8&amp;quot;来中断看看，&lt;br&gt;在trw中要用bpx regqueryvalueexa do &amp;quot;d*(esp+8)&amp;quot;来中断看看。&lt;br&gt;还有的是在本目录下留下注册信息，常见的有.dat .ini .dll等等，&lt;br&gt;我是用bpx readfile来中断的，还有的是在windows目录下留下注册信息。&lt;br&gt;你可以借助专用的工具帮助你查看，入filemon等！ 　&lt;br&gt;&lt;br&gt;vb:　&lt;br&gt;&lt;br&gt;1、__vbaVarTstNe              //比较两个变量是否不相等 &lt;br&gt;2、rtcR8ValFromBstr            //把字符串转换成浮点数 &lt;br&gt;3、rtcMsgBox  显示一信息对话框  &lt;br&gt;4、rtcBeep                    //让扬声器叫唤 &lt;br&gt;5、rtcGetPresentDate          //取得当前日期 　&lt;br&gt;&lt;br&gt;针对字串: &lt;br&gt;__vbaStrComp &lt;br&gt;__vbaStrCmp &lt;br&gt;__vbaStrCompVar &lt;br&gt;__vbaStrLike &lt;br&gt;__vbaStrTextComp &lt;br&gt;__vbaStrTextLike &lt;br&gt;针对变量: &lt;br&gt;__vbaVarCompEq &lt;br&gt;__vbaVarCompLe &lt;br&gt;__vbaVarCompLt &lt;br&gt;__vbaVarCompGe &lt;br&gt;__vbaVarCompGt &lt;br&gt;__vbaVarCompNe 　&lt;br&gt;&lt;br&gt;VB的指针:&lt;br&gt;THROW 　&lt;br&gt;&lt;br&gt;VB DLL还调用了oleauto32.dll中的部分函数。oleauto32.dll是个通用的proxy/stub DLL，其每个函数的原型在&amp;lt;oleauto.h&amp;gt;中定义，并在MSDN中有详细描述。这也有助于理解VB DLL中的函数的作用。 　&lt;br&gt;&lt;br&gt;举例： 　&lt;br&gt;&lt;br&gt;LEA EAX, [EBP-58] &lt;br&gt;PUSH EAX &lt;br&gt;CALL [MSVBVM60!__vbaI4Var] 　&lt;br&gt;&lt;br&gt;执行call之前敲dd eax+8，得到的值为3； &lt;br&gt;执行完call之后，eax = 3 &lt;br&gt;从而可知__vbaI4Var的作用是将一个VARIANT转换为I4（即一个长整数）。　&lt;br&gt;&lt;br&gt;__vbaVarTstNe似乎是用来进行自校验的，正常情况下返回值为0。 &lt;br&gt;已知适用的软件有：网络三国智能机器人、音乐贺卡厂。当这两个软件被脱壳后都回出错，网络三国智能机器人会产生非法*作，而音乐贺卡厂会告诉你是非法拷贝，通过修改__vbaVarTstNe的返回值都可让它们正常运行。 &lt;br&gt;所以当您遇到一个VB软件，脱壳后无法正常运行，而又找不出其它问题时，可试试拦截这个函数，说不定会有用哦。8-）　&lt;br&gt;&lt;br&gt;API不太知道,也许可以通过BIOS在98平台上读写扇区,不过在2000/NT下可以通过内黑ATAPI,HAL写扇区 &lt;br&gt;machoman[CCG]&lt;br&gt;bpx WRITE_PORT_BUFFER_USHORT &lt;br&gt;NT/2000下这个断点,当edx=1f0h,时,可以看见EDI地址内数据为扇区位置数据,必须先 在winice.dat 中装入hal.sys 详细内容看ATAPI手册 　&lt;br&gt;&lt;br&gt;补充篇:&lt;br&gt;关于对VB程序和时间限制程序的断点&lt;br&gt;CrackerABC&lt;br&gt;先给出修改能正确反编译VB程序的W32DASM的地址： &lt;br&gt;====================== &lt;br&gt;offsets 0x16B6C-0x16B6D 　&lt;br&gt;&lt;br&gt;修改机器码为： 98 F4 &lt;br&gt;====================== 　&lt;br&gt;&lt;br&gt;VB程序的跟踪断点： 　&lt;br&gt;&lt;br&gt;============ &lt;br&gt;MultiByteToWideChar, &lt;br&gt;rtcR8ValFromBstr, &lt;br&gt;WideCharToMultiByte, &lt;br&gt;__vbaStrCmp &lt;br&gt;__vbaStrComp &lt;br&gt;__vbaStrCopy &lt;br&gt;__vbaStrMove &lt;br&gt;__vbaVarTstNe &lt;br&gt;rtcBeep &lt;br&gt;rtcGetPresentDate (时间API) &lt;br&gt;rtcMsgBox &lt;br&gt;========= 　&lt;br&gt;&lt;br&gt;时间限制断点： 　&lt;br&gt;&lt;br&gt;================ &lt;br&gt;CompareFileTime &lt;br&gt;GetLocalTime &lt;br&gt;GetSystemTime &lt;br&gt;GetTimeZoneInformation &lt;br&gt;msvcrt.diffTime() &lt;br&gt;msvcrt.Time() &lt;br&gt;================ 　&lt;br&gt;&lt;br&gt;一般处理&lt;br&gt;&lt;br&gt;bpx hmemcpy&lt;br&gt;bpx MessageBox&lt;br&gt;bpx MessageBoxExA&lt;br&gt;bpx MessageBeep&lt;br&gt;bpx SendMessage　&lt;br&gt;&lt;br&gt;bpx GetDlgItemText&lt;br&gt;bpx GetDlgItemInt&lt;br&gt;bpx GetWindowText&lt;br&gt;bpx GetWindowWord&lt;br&gt;bpx GetWindowInt&lt;br&gt;bpx DialogBoxParamA&lt;br&gt;bpx CreateWindow&lt;br&gt;bpx CreateWindowEx&lt;br&gt;bpx ShowWindow&lt;br&gt;bpx UpdateWindow　&lt;br&gt;&lt;br&gt;bmsg xxxx wm_move&lt;br&gt;bmsg xxxx wm_gettext&lt;br&gt;bmsg xxxx wm_command&lt;br&gt;bmsg xxxx wm_activate  　&lt;br&gt;&lt;br&gt;时间相关 &lt;br&gt;bpint 21 if ah==2A (DOS)&lt;br&gt;bpx GetLocalTime&lt;br&gt;bpx GetFileTime&lt;br&gt;bpx GetSystemtime  　&lt;br&gt;&lt;br&gt;CD-ROM 或 磁盘相关 &lt;br&gt;bpint 13 if ah==2 (DOS)&lt;br&gt;bpint 13 if ah==3 (DOS)&lt;br&gt;bpint 13 if ah==4 (DOS)&lt;br&gt;bpx GetFileAttributesA&lt;br&gt;bpx GetFileSize&lt;br&gt;bpx GetDriveType&lt;br&gt;bpx GetLastError&lt;br&gt;bpx ReadFile&lt;br&gt;bpio -h (Your CD-ROM Port Address) R  　&lt;br&gt;&lt;br&gt;软件狗相关 &lt;br&gt;bpio -h 278 R&lt;br&gt;bpio -h 378 R  　&lt;br&gt;&lt;br&gt;键盘输入相关 &lt;br&gt;bpint 16 if ah==0 (DOS)&lt;br&gt;bpint 21 if ah==0xA (DOS)  　&lt;br&gt;&lt;br&gt;文件访问相关 &lt;br&gt;bpint 21 if ah==3dh (DOS)&lt;br&gt;bpint 31 if ah==3fh (DOS)&lt;br&gt;bpint 21 if ah==3dh (DOS)&lt;br&gt;bpx ReadFile&lt;br&gt;bpx WriteFile&lt;br&gt;bpx CreateFile&lt;br&gt;bpx SetFilePointer&lt;br&gt;bpx GetSystemDirectory 　&lt;br&gt;&lt;br&gt;INI 初始化文件相关 &lt;br&gt;bpx GetPrivateProfileString&lt;br&gt;bpx GetPrivateProfileInt&lt;br&gt;bpx WritePrivateProfileString&lt;br&gt;bpx WritePrivateProfileInt 　&lt;br&gt;&lt;br&gt;注册表相关 &lt;br&gt;bpx RegCreateKey&lt;br&gt;bpx RegDeleteKey&lt;br&gt;bpx RegQueryvalue&lt;br&gt;bpx RegCloseKey&lt;br&gt;bpx RegOpenKey 　&lt;br&gt;&lt;br&gt;注册标志相关 &lt;br&gt;bpx cs:eip if EAX==0 　&lt;br&gt;&lt;br&gt;内存标准相关 &lt;br&gt;bpmb cs:eip rw if 0x30:0x45AA==0 　&lt;br&gt;&lt;br&gt;显示相关 &lt;br&gt;bpx 0x30:0x45AA do &amp;quot;d 0x30:0x44BB&amp;quot;&lt;br&gt;bpx CS:0x66CC do &amp;quot;? EAX&amp;quot;&lt;/div&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;/div&gt;&lt;img src="http://c.services.spaces.live.com/CollectionWebService/c.gif?cid=-3393211484310952491&amp;page=RSS%3a+%e7%a0%b4%e8%a7%a3%e5%b8%b8%e7%94%a8%e6%96%ad%e7%82%b9%e5%a4%a7%e5%85%a8&amp;referrer=" width="1px" height="1px" border="0" alt=""&gt;&lt;img style="position:absolute" alt="" width="0px" height="0px" src="http://c.live.com/c.gif?NC=31263&amp;amp;NA=1149&amp;amp;PI=73329&amp;amp;RF=&amp;amp;DI=3919&amp;amp;PS=85545&amp;amp;TP=skywolfstudio.spaces.live.com&amp;amp;GT1=skywolfstudio"&gt;</description><category>软件破解</category><comments>http://skywolfstudio.spaces.live.com/Blog/cns!D0E8E4220DDEA5D5!1157.entry#comment</comments><guid isPermaLink="true">http://skywolfstudio.spaces.live.com/Blog/cns!D0E8E4220DDEA5D5!1157.entry</guid><pubDate>Fri, 06 Jun 2008 09:05:02 GMT</pubDate><slash:comments>0</slash:comments><msn:type>blogentry</msn:type><live:type>blogentry</live:type><live:typelabel>Blog entry</live:typelabel><wfw:commentRss>http://skywolfstudio.spaces.live.com/blog/cns!D0E8E4220DDEA5D5!1157/comments/feed.rss</wfw:commentRss><wfw:comment>http://skywolfstudio.spaces.live.com/Blog/cns!D0E8E4220DDEA5D5!1157.entry#comment</wfw:comment><dcterms:modified>2008-06-06T09:05:02Z</dcterms:modified></item><item><title>[转]ASProtect V2.X脱壳+处理附加数据+去自校验~ASProtect V2.X脱壳+处理附加数据+去自校验~</title><link>http://skywolfstudio.spaces.live.com/Blog/cns!D0E8E4220DDEA5D5!1156.entry</link><description>&lt;div&gt;------------------------------------------------------------------&lt;br&gt;&lt;b style="color:black;background-color:#ff66ff"&gt;ASProtect&lt;/b&gt; &lt;b style="color:white;background-color:#880000"&gt;V2.X&lt;/b&gt;脱壳+处理附加数据+去自校验 &lt;br&gt;作者：Hmily &lt;br&gt;博客：&lt;a href="http://blog.52hmily.cn/" target="_blank"&gt;&lt;u&gt;&lt;font color="#0000ff"&gt;Http://Blog.52Hmily.Cn&lt;/font&gt;&lt;/u&gt;&lt;/a&gt; &lt;br&gt;QQ群：39940458 &lt;br&gt;------------------------------------------------------------------- &lt;br&gt;大家好，我是Hmily，今天给大家带来 Q宠保姆VC版 2.23 SP8版2007.09.13脱壳教程,需要的工具有： &lt;br&gt;PEiD，OD，Volx大侠&lt;b style="color:black;background-color:#ff66ff"&gt;ASProtect&lt;/b&gt;脚本（&lt;a href="http://www.unpack.cn/viewthread.php?tid=9487" target="_blank"&gt;&lt;u&gt;&lt;font color="#0000ff"&gt;http://www.unpack.cn/viewthread.php?tid=9487&lt;/font&gt;&lt;/u&gt;&lt;/a&gt;），ImportREC，Overlay 最终版，Resource Binder......（这些网上都能下到，就不提供了） &lt;br&gt;这个是我上次脱Q宠保姆VC版 2.23 SP7版 2007.09.06的记录：&lt;a href="http://hi.baidu.com/52hmily/blog" target="_blank"&gt;&lt;u&gt;&lt;font color="#0000ff"&gt;http://hi.baidu.com/52hmily/blog&lt;/font&gt;&lt;/u&gt;&lt;/a&gt; ... 7a120b28388a04.html &lt;br&gt;好，开始，先查下壳 &lt;br&gt;普通扫描：&lt;b style="color:black;background-color:#ff66ff"&gt;ASProtect&lt;/b&gt; &lt;b style="color:white;background-color:#880000"&gt;V2.X&lt;/b&gt; &lt;b style="color:white;background-color:#00aa00"&gt;Registered&lt;/b&gt; -&amp;gt; &lt;b style="color:white;background-color:#886800"&gt;Alexey&lt;/b&gt; &lt;b style="color:white;background-color:#004699"&gt;Solodovnikov&lt;/b&gt;          * Sign.By.fly [Overlay] *注意是有附加数据的 &lt;br&gt;用插件VerA 0.15扫描:Version: &lt;b style="color:black;background-color:#ff66ff"&gt;ASProtect&lt;/b&gt; 2.3 SKE build 06.26 Beta [Extract] &lt;br&gt;&lt;br&gt;第一步：脱壳 &lt;br&gt;先OD载入吧，运行脚本，就会自动脱壳了，脱完先修复，先查看OD运行记录，再打开ImportREC，然后对照着填OEP地址，点获取输入表，再点修复转存文件。 &lt;br&gt;&lt;br&gt;第二步：处理附加数据 &lt;br&gt;好了，现在来处理附加数据，打开Overlay，点复制Overlay，这样就处理了附加数据 &lt;br&gt;&lt;br&gt;第三步：去自校验 &lt;br&gt;现在还是运行不了，看来是有自校验，我们把脱好的程序再次载入OD，在命令出输入：bp CreateFileA，回车，按F9运行，到这就可以了，下面看清楚，点反汇编窗口中跟随，F2下端，F9运行到这里，取消断点，这里都是系统的领空，我们要到程序的领空去，按F8先跟到程序领空，好，这里已经到系统领空了，下面还是用F8跟，后面慢慢来，大家看好， &lt;br&gt;004638D8      .    A3 04DB4D00      mov        dword ptr [4DDB04], eax &lt;br&gt;004638DD      .    E8 61F5FFFF      call      00462E43 &lt;br&gt;004638E2      .    E8 272BFFFF      call      0045640E &lt;br&gt;004638E7      .    85C0            test      eax, eax &lt;br&gt;004638E9      .    0F85 15010000 jnz        00463A04    ————跳转没实现 &lt;br&gt;004638EF      .    52              push      edx &lt;br&gt;004638F0      .    57              push      edi &lt;br&gt;004638F1      .    C1D2 E7          rcl        edx, 0E7 &lt;br&gt;004638F4      .    83EA 03          sub        edx, 3 &lt;br&gt;004638F7      .    68 28214200      push      00422128 &lt;br&gt;004638FC      .    81D2 EC7E7BD3 adc        edx, D37B7EEC &lt;br&gt;00463902      .    5A              pop        edx &lt;br&gt;00463903      .    FF32            push      dword ptr [edx] &lt;br&gt;00463905      .    335424 08        xor        edx, dword ptr [esp+8] &lt;br&gt;00463909      .    335424 28        xor        edx, dword ptr [esp+28] &lt;br&gt;如果这样下去你会发现程序就结束了，说明这里是关键的跳转，我们先看看，继续跟，出错了，好了，现在我们重新载入程序，直接跳到刚才那个地方004638E9， &lt;br&gt;004638E9      . /0F85 15010000 jnz        00463A04 &lt;br&gt;没实现跳转，我们来让他实现，可以直接把JNZ改成JMP就可以了，保存 &lt;br&gt;好，我们现在再看看能不能运行，晕,刚才突然点错了，我们继续，OK，可以啦，查下壳 VC8 -&amp;gt; Microsoft Corporation [Overlay] *，我们再用Resource Binder给它优化下，重建资源， &lt;br&gt;程序也会小点，好了，这样教程就结束了。 &lt;br&gt;&lt;br&gt;欢迎大家和我交流技术!&lt;br&gt;&lt;br&gt;88 &lt;br&gt;&lt;br&gt;&lt;br&gt;教程地址：&lt;a href="http://exs.mail.qq.com/cgi-bin/d" target="_blank"&gt;&lt;u&gt;&lt;font color="#0000ff"&gt;http://exs.mail.qq.com/cgi-bin/d&lt;/font&gt;&lt;/u&gt;&lt;/a&gt; ... 5281125d325ea32d7ce &lt;br&gt;&lt;br&gt;提取码：edac828d &lt;br&gt;&lt;br&gt;Q宠保姆VC版 2.23 SP8版2007.09.13UNPack：&lt;a href="http://exs.mail.qq.com/cgi-bin/d" target="_blank"&gt;&lt;u&gt;&lt;font color="#0000ff"&gt;http://exs.mail.qq.com/cgi-bin/d&lt;/font&gt;&lt;/u&gt;&lt;/a&gt; ... 4d0ac7ddece7271e0dc &lt;br&gt;&lt;br&gt;提取码：ae5027bb&lt;/div&gt;
&lt;div&gt;&lt;/div&gt;&lt;img src="http://c.services.spaces.live.com/CollectionWebService/c.gif?cid=-3393211484310952491&amp;page=RSS%3a+%5b%e8%bd%ac%5dASProtect+V2.X%e8%84%b1%e5%a3%b3%2b%e5%a4%84%e7%90%86%e9%99%84%e5%8a%a0%e6%95%b0%e6%8d%ae%2b%e5%8e%bb%e8%87%aa%e6%a0%a1%e9%aa%8c%7eASProtect+V2.X%e8%84%b1%e5%a3%b3%2b%e5%a4%84%e7%90%86%e9%99%84%e5%8a%a0%e6%95%b0%e6%8d%ae%2b%e5%8e%bb%e8%87%aa%e6%a0%a1%e9%aa%8c%7e&amp;referrer=" width="1px" height="1px" border="0" alt=""&gt;&lt;img style="position:absolute" alt="" width="0px" height="0px" src="http://c.live.com/c.gif?NC=31263&amp;amp;NA=1149&amp;amp;PI=73329&amp;amp;RF=&amp;amp;DI=3919&amp;amp;PS=85545&amp;amp;TP=skywolfstudio.spaces.live.com&amp;amp;GT1=skywolfstudio"&gt;</description><category>软件破解</category><comments>http://skywolfstudio.spaces.live.com/Blog/cns!D0E8E4220DDEA5D5!1156.entry#comment</comments><guid isPermaLink="true">http://skywolfstudio.spaces.live.com/Blog/cns!D0E8E4220DDEA5D5!1156.entry</guid><pubDate>Fri, 06 Jun 2008 08:06:08 GMT</pubDate><slash:comments>2</slash:comments><msn:type>blogentry</msn:type><live:type>blogentry</live:type><live:typelabel>Blog entry</live:typelabel><wfw:commentRss>http://skywolfstudio.spaces.live.com/blog/cns!D0E8E4220DDEA5D5!1156/comments/feed.rss</wfw:commentRss><wfw:comment>http://skywolfstudio.spaces.live.com/Blog/cns!D0E8E4220DDEA5D5!1156.entry#comment</wfw:comment><dcterms:modified>2008-06-06T08:06:08Z</dcterms:modified></item><item><title>折翼的天使[转]</title><link>http://skywolfstudio.spaces.live.com/Blog/cns!D0E8E4220DDEA5D5!1154.entry</link><description>            &lt;font style="line-height:1.3em" face="宋体"&gt;我是一个折翼的天使&lt;/font&gt;&lt;br&gt;            &lt;font style="line-height:1.3em" face="宋体"&gt;一次偶然的事故&lt;/font&gt;&lt;br&gt;            &lt;font style="line-height:1.3em" face="宋体"&gt;使我不再会飞翔&lt;/font&gt;&lt;br&gt;&lt;br&gt;            &lt;font style="line-height:1.3em" face="宋体"&gt;天空中有无数个天使在飞翔&lt;/font&gt;&lt;br&gt;            &lt;font style="line-height:1.3em" face="宋体"&gt;望着其中最美丽的那个&lt;/font&gt;&lt;br&gt;            &lt;font style="line-height:1.3em" face="宋体"&gt;我心无比向往 &lt;/font&gt;&lt;br&gt;            &lt;br&gt;            &lt;font style="line-height:1.3em" face="宋体"&gt;挥动双翅想飞到你的身旁&lt;/font&gt;&lt;br&gt;            &lt;font style="line-height:1.3em" face="宋体"&gt;却重重地跌落到地上&lt;/font&gt;&lt;br&gt;            &lt;font style="line-height:1.3em" face="宋体"&gt;以致我遍体鳞伤&lt;/font&gt;&lt;br&gt;            &lt;font style="line-height:1.3em" face="宋体"&gt;这才明白&lt;/font&gt;&lt;br&gt;            &lt;font style="line-height:1.3em" face="宋体"&gt;原来我已不会飞翔&lt;/font&gt;&lt;br&gt;&lt;br&gt;            &lt;font style="line-height:1.3em" face="宋体"&gt;你来到我的身旁&lt;/font&gt;&lt;br&gt;            &lt;font style="line-height:1.3em" face="宋体"&gt;在我头顶一圈一圈飞翔&lt;/font&gt;&lt;br&gt;            &lt;font style="line-height:1.3em" face="宋体"&gt;来表达你对我的同情&lt;/font&gt;&lt;br&gt;            &lt;font style="line-height:1.3em" face="宋体"&gt;却不能了解我心中的忧伤  &lt;/font&gt;&lt;br&gt;  &lt;br&gt;            &lt;font style="line-height:1.3em" face="宋体"&gt;望着你远去的背影&lt;/font&gt;&lt;br&gt;            &lt;font style="line-height:1.3em" face="宋体"&gt;我心彷徨&lt;/font&gt;&lt;br&gt;            &lt;font style="line-height:1.3em" face="宋体"&gt;可心已随你一起飞翔&lt;/font&gt;&lt;br&gt;&lt;br&gt;            &lt;font style="line-height:1.3em" face="宋体"&gt;若上帝醒来&lt;/font&gt;&lt;br&gt;            &lt;font style="line-height:1.3em" face="宋体"&gt;他不会让我再这样&lt;/font&gt;&lt;br&gt;            &lt;font style="line-height:1.3em" face="宋体"&gt;他会让我和你一起在天空中自由地翱翔&lt;/font&gt;&lt;br&gt;&lt;br&gt;             &lt;br&gt;            &lt;font style="line-height:1.3em" face="宋体"&gt;上帝依旧在沉睡&lt;/font&gt;&lt;br&gt;            &lt;font style="line-height:1.3em" face="宋体"&gt;但时间不会太长&lt;/font&gt;&lt;br&gt;            &lt;font style="line-height:1.3em" face="宋体"&gt;也许是十天&lt;/font&gt;&lt;br&gt;            &lt;font style="line-height:1.3em" face="宋体"&gt;也许是整个世纪&lt;/font&gt;&lt;br&gt;            &lt;font style="line-height:1.3em" face="宋体"&gt;但真的不会太长&lt;/font&gt;&lt;br&gt;            &lt;font style="line-height:1.3em" face="宋体"&gt;到时我就可以和你一起飞翔&lt;/font&gt;&lt;br&gt;            &lt;font style="line-height:1.3em" face="宋体"&gt;我心真的希望&lt;/font&gt;
&lt;div&gt;&lt;/div&gt;&lt;img src="http://c.services.spaces.live.com/CollectionWebService/c.gif?cid=-3393211484310952491&amp;page=RSS%3a+%e6%8a%98%e7%bf%bc%e7%9a%84%e5%a4%a9%e4%bd%bf%5b%e8%bd%ac%5d&amp;referrer=" width="1px" height="1px" border="0" alt=""&gt;&lt;img style="position:absolute" alt="" width="0px" height="0px" src="http://c.live.com/c.gif?NC=31263&amp;amp;NA=1149&amp;amp;PI=73329&amp;amp;RF=&amp;amp;DI=3919&amp;amp;PS=85545&amp;amp;TP=skywolfstudio.spaces.live.com&amp;amp;GT1=skywolfstudio"&gt;</description><category>图书</category><comments>http://skywolfstudio.spaces.live.com/Blog/cns!D0E8E4220DDEA5D5!1154.entry#comment</comments><guid isPermaLink="true">http://skywolfstudio.spaces.live.com/Blog/cns!D0E8E4220DDEA5D5!1154.entry</guid><pubDate>Sat, 31 May 2008 07:53:29 GMT</pubDate><slash:comments>0</slash:comments><msn:type>blogentry</msn:type><live:type>blogentry</live:type><live:typelabel>Blog entry</live:typelabel><wfw:commentRss>http://skywolfstudio.spaces.live.com/blog/cns!D0E8E4220DDEA5D5!1154/comments/feed.rss</wfw:commentRss><wfw:comment>http://skywolfstudio.spaces.live.com/Blog/cns!D0E8E4220DDEA5D5!1154.entry#comment</wfw:comment><dcterms:modified>2008-05-31T07:53:29Z</dcterms:modified></item><item><title>[转]突破NP屏蔽，实现按键模拟</title><link>http://skywolfstudio.spaces.live.com/Blog/cns!D0E8E4220DDEA5D5!1121.entry</link><description>突破NP屏蔽，实现按键模拟！ &lt;br&gt;&lt;br&gt;nProtect GameGuard、XTRAP是两款比较著名的防作弊软件,在玩家使用外挂（无论任何游戏的外挂,就算不是当前游戏的外挂也不可以）的时候 &lt;br&gt;&lt;br&gt;会提示&amp;quot;检测到游戏被破解修改&amp;quot;并强行关闭游戏。 &lt;br&gt;&lt;br&gt;什么是nProtect？ &lt;br&gt;&lt;br&gt;nProtect是设计用于保护个人电脑终端不被病毒和黑客程序感染的新概念的基于网络的反黑客和反病毒的工具。他帮助确保所有输入个人电脑 &lt;br&gt;&lt;br&gt;终端的信息在网络上不落入黑客手中。在最终用户在执行电子贸易时，可以通过将nProtect配置在那些提供电子商务、进口贸易，电子贸易的 &lt;br&gt;&lt;br&gt;金融机构的网站上，来提高安全等级。 &lt;br&gt;&lt;br&gt;nProtect怎样工作？ &lt;br&gt;&lt;br&gt;nProtect是一种基于服务器端的解决方案并且当那些需要保护的任何网络应用被运行时而自动启动。nProtect被载入内存，所以最终用户不需 &lt;br&gt;&lt;br&gt;要安装任何应用程序，只要nProtect启动，就开始拒绝黑客工具和病毒的入侵！ &lt;br&gt;&lt;br&gt;nProtect如何工作？ &lt;br&gt;&lt;br&gt;用户登陆时nProtect自动启动。 &lt;br&gt;浏览器确认和自动安装安全模块到用户的个人电脑。 &lt;br&gt;扫描黑客工具和病毒 &lt;br&gt;通知用户目前的安全状态 &lt;br&gt;如果有黑客工具和病毒尝试删除  &lt;br&gt;在被入侵时端驻留内存来锁定黑客工具直到电脑或者nProtect关闭。 &lt;br&gt;&lt;br&gt;nProtect 的主要功能介绍： &lt;br&gt;&lt;br&gt;实时侦测并封锁修改游戏之黑客程序。 &lt;br&gt;实时侦测并封锁各类型系统病毒。 &lt;br&gt;实时侦测并封锁加速程序。 &lt;br&gt;实时侦测并封锁自动鼠标(连点)程序。 &lt;br&gt;封锁不当外挂程序。 &lt;br&gt;封锁各种意图远程控制玩家个人计算机的动作。 &lt;br&gt;限制意图侧录键盘鼠标动作的恶性程序。 &lt;br&gt;限制可疑间谍程序，加强安全性。 &lt;br&gt;&lt;br&gt;使用此软件的网络游戏有很多，比如：冒险岛、蒸汽幻想、惊天动地、神话等等。 &lt;br&gt;&lt;br&gt;这篇文章只讲如何突破NP对按键类的封锁。 &lt;br&gt;&lt;br&gt;NP对按键的封锁方式主要有3种： &lt;br&gt;&lt;br&gt;1、封系统API函数，按键模拟类的API函数有KeyBoard_Event(键盘模拟)、Mouse_Event(鼠标模拟)、SetCursor(模拟鼠标移动)、SendInput() &lt;br&gt;&lt;br&gt;、SendMessage(发送消息)PutMessage(发送消息)。这种封API函数的方法在NP早期被应用，主要手段是通过钩子函数修改API的CALL地址。但这 &lt;br&gt;&lt;br&gt;种手段很快被人破解，破解方法有2种，1种方法是移植这些API函数的代码（具体移植方法请见相关的专业资料）我曾用这方法，把整个 &lt;br&gt;&lt;br&gt;kernel32.dll系统库文件更名复制，然后调用该库的API，从而绕过NP；第2种方法是使用WINIO.SYS驱动，硬件模拟按键动作（此驱动只支持 &lt;br&gt;&lt;br&gt;8042端口，即只能模拟PS2键盘鼠标动作）。 &lt;br&gt;2、鉴于上面原因，NP不再封系统API，而是封按键模拟相关的内核API。移植系统API来模拟按键就不能实现了，因为移植的系统API最终要调用 &lt;br&gt;&lt;br&gt;内核API。这样留给我们的工作只能是通过驱动硬件来模拟按键动作了。 &lt;br&gt;3、网上流行的硬件模拟是通过对8042端口驱动来实现的，这种操作端口来实现硬件模拟的方法必须要在系统RING0层才能进行。所以，这类操 &lt;br&gt;&lt;br&gt;作都必须通过驱动或中断程序来实现。目前网络上流行的端口操作驱动程序有2种：WINIO.SYS及PortTalk.SYS，WINIO.SYS操作端口效率较高。 &lt;br&gt;&lt;br&gt;它们的主要缺陷是只能模拟PS2的键盘、鼠标，当键盘或鼠标是USB的，或者频繁模拟鼠标时就会出现卡死现象。但这类操作端口的模拟也没长 &lt;br&gt;&lt;br&gt;久，NP也把这类模拟给封了。封的办法很简单，这2个驱动特征太明显了：WINIO把端口操作从RING0层暴露给RING3层，这样的暴露给系统安全 &lt;br&gt;&lt;br&gt;带来隐患，所以有的杀毒软件会对WINIO进行查杀！NP封这种具有典型特征驱动程序易如反掌；PortTalk是用户级驱动程序，可以通过调用 &lt;br&gt;&lt;br&gt;DeviceIoControl函数来操作端口，但正因是用户级驱动，其发出IRP在下传时容易被NP截获屏蔽。这样NP给我们剩下的操作空间就不多了：1、 &lt;br&gt;&lt;br&gt;改写或移植内核API，这种方法因系统及版本不同实现起来相当困难，极容易造成机器死机。2、虚拟一个设备，通过该设备驱动程序来操作端 &lt;br&gt;&lt;br&gt;口，最好是将其设备虚拟成键盘和鼠标设备。这种方法可行，因为NP难以实现封设备驱动（封错了机器就死机了）。但这方法也有缺陷，驱动 &lt;br&gt;&lt;br&gt;程序需要安装，安装弹出微软的认证签名窗口（未经签名存在安全问题），这对许多用户来说是难以接受的。 &lt;br&gt;    以上几种反NP屏蔽按键的方法我在写“按键游侠”（下载地址&lt;a href="http://www.net321.net.cn,/" target="_blank"&gt;&lt;u&gt;&lt;font color="#261cdc"&gt;Http://www.net321.net.cn,&lt;/font&gt;&lt;/u&gt;&lt;/a&gt;论坛地址：&lt;a href="http://www.fyhand.com/bbs" target="_blank"&gt;&lt;u&gt;&lt;font color="#261cdc"&gt;Http://www.fyhand.com/bbs&lt;/font&gt;&lt;/u&gt;&lt;/a&gt;）各版 &lt;br&gt;&lt;br&gt;本时都用过。随着NP的升级，按键游侠反NP的措施也在升级，从最初的API拦截，到现在的虚拟设备驱动、移植内核API。按键游侠始终能突破 &lt;br&gt;&lt;br&gt;NP屏蔽，模拟按键动作。在对NP的较量中，我从本站中找到许多有关NP的资料，在此一并感谢哪些无私的提供最前端资料的高手。同时也感谢 &lt;br&gt;&lt;br&gt;哪些提供USB技术朋友，让按键游侠能够硬件模拟USB键盘、鼠标！ &lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;相关资料：按键游侠 WINIO.SYS PortTalk.SYS NP KeyBoard_Event Mouse_Event SetCursor SendInput SendMessage PutMessage USB 驱动签 &lt;br&gt;&lt;br&gt;名 DeviceIoControl  钩子函数 需要了解这些知识的朋友可以按这些资料在百度湖GOOGLE上查找。 
&lt;div&gt;&lt;/div&gt;&lt;img src="http://c.services.spaces.live.com/CollectionWebService/c.gif?cid=-3393211484310952491&amp;page=RSS%3a+%5b%e8%bd%ac%5d%e7%aa%81%e7%a0%b4NP%e5%b1%8f%e8%94%bd%ef%bc%8c%e5%ae%9e%e7%8e%b0%e6%8c%89%e9%94%ae%e6%a8%a1%e6%8b%9f&amp;referrer=" width="1px" height="1px" border="0" alt=""&gt;&lt;img style="position:absolute" alt="" width="0px" height="0px" src="http://c.live.com/c.gif?NC=31263&amp;amp;NA=1149&amp;amp;PI=73329&amp;amp;RF=&amp;amp;DI=3919&amp;amp;PS=85545&amp;amp;TP=skywolfstudio.spaces.live.com&amp;amp;GT1=skywolfstudio"&gt;</description><category>软件破解</category><comments>http://skywolfstudio.spaces.live.com/Blog/cns!D0E8E4220DDEA5D5!1121.entry#comment</comments><guid isPermaLink="true">http://skywolfstudio.spaces.live.com/Blog/cns!D0E8E4220DDEA5D5!1121.entry</guid><pubDate>Fri, 18 Apr 2008 10:51:56 GMT</pubDate><slash:comments>1</slash:comments><msn:type>blogentry</msn:type><live:type>blogentry</live:type><live:typelabel>Blog entry</live:typelabel><wfw:commentRss>http://skywolfstudio.spaces.live.com/blog/cns!D0E8E4220DDEA5D5!1121/comments/feed.rss</wfw:commentRss><wfw:comment>http://skywolfstudio.spaces.live.com/Blog/cns!D0E8E4220DDEA5D5!1121.entry#comment</wfw:comment><dcterms:modified>2008-04-18T10:51:56Z</dcterms:modified></item><item><title>【转】如何在NP下读写游戏内存及如何进入NP进程</title><link>http://skywolfstudio.spaces.live.com/Blog/cns!D0E8E4220DDEA5D5!1119.entry</link><description>&lt;div style="line-height:18px"&gt;&lt;font color="#333333"&gt;标 题:&lt;/font&gt;&lt;font color="#000000"&gt; 【原创】如何在NP下读写游戏内存及如何进入NP进程&lt;/font&gt;&lt;font color="#666666"&gt;&lt;br&gt;&lt;font color="#333333"&gt;作 者:&lt;/font&gt; &lt;font color="#000000"&gt;堕落天才&lt;/font&gt;&lt;br&gt;&lt;font color="#333333"&gt;时 间:&lt;/font&gt; 2007-01-04,13:28&lt;br&gt;&lt;font color="#333333"&gt;链 接:&lt;/font&gt; http://bbs.pediy.com/showthread.php?t=37417&lt;br&gt;&lt;/font&gt;&lt;br&gt;******************************************************&lt;br&gt;*标题:【原创】如何在NP下读写游戏内存及如何进入NP进程 *&lt;br&gt;*作者:堕落天才                                       *&lt;br&gt;*日期:2007年1月4号                                   *&lt;br&gt;*版权声明:请保持文章的完整，转载请注明出处           *&lt;br&gt;******************************************************&lt;br&gt;&lt;br&gt;   在上一篇文章《反NP监视原理》中说到要去掉NP的注入是很容易的事，但是去掉npggNT.des并不是说我们想对游戏怎么样都可以了，NP还挂钩了很多内核函数，所以很多关键系&lt;br&gt;&lt;br&gt;统函数就算我们在用户层能用也对游戏没有什么效果。&lt;br&gt;   如果我们想在不破解NP前提下读写游戏内存该怎么办呢，我想办法至少有两个&lt;br&gt;一、用驱动&lt;br&gt;    在驱动下读写游戏内存是没问题，但是由于我不懂驱动，所以也没什么可说。&lt;br&gt;二、进入游戏进程&lt;br&gt;    在用户层，如果我们想在不破解NP的前提下读写游戏内存的话，大概就只能进入游戏进程了。因为很简单，我们的程序无法对游戏使用OpenProcess、ReadProcessMemoery及&lt;br&gt;&lt;br&gt;WriteProcessMemory这些函数（就算是去掉了NP监视模块npggNT.des），而NP又不可能限制游戏自身使用这些函数，所以只要我们能够进入游戏进程就能够读写游戏的内存。怎么&lt;br&gt;&lt;br&gt;进入游戏呢？下面介绍两种方法：&lt;br&gt;&lt;br&gt;    1，最简单的办法 ―全局消息钩子(WH_GETMESSAGE)&lt;br&gt;      看似很复杂的东西原来很简单就可以实现，大道至易啊。使用消息钩子进入游戏进程无疑是最简单的一种方法，具体编程大概象这样:一个消息钩子的DLL，里面包含一个消&lt;br&gt;&lt;br&gt;息回调函数（什么都不用做），读写内存过程，跟主程序通讯过程或操作界面过程，当然在DLL_PROCESS_ATTACH要判断当前的进程是不是游戏的，是的话就做相应的处理；一个安&lt;br&gt;&lt;br&gt;装全局消息钩子的主程序。大概这样就可以了。使用全局消息钩子的好处是简单易用，但是不足之处是要在游戏完全启动（NP当然也启动啦）后才能进入，如果想在NP启动前做一&lt;br&gt;&lt;br&gt;些什么事的话是不可能的。&lt;br&gt;     另外也简单介绍一下防全局钩子的办法，Windows是通过调用LoadLibraryExW来向目标进程注入钩子DLL的，所以只要我们在钩子安装前挂钩了这个函数，全局钩子就干扰不了&lt;br&gt;&lt;br&gt;了。&lt;br&gt;&lt;br&gt;     2，更麻烦的办法 ― 远程注入&lt;br&gt;       知道远程注入方法和原理的人可能会说“有没有搞错，OpenProcess、WriteProcessMemory这些必备函数都不能用，怎么注入?”,当然啦，NP启动后是不能干这些事情，所&lt;br&gt;&lt;br&gt;以我们要在NP启动前完成。这样一来，时机就很重要了。&lt;br&gt;       游戏启动的流程大概是这样:游戏Main-&amp;gt;GameGuard.des-&amp;gt;GameMon.des（NP进程）。这里的做法是这样：游戏Main-&amp;gt;GameGuard.des(暂停)－&amp;gt;注入DLL－&amp;gt;GameGuard.des(继&lt;br&gt;&lt;br&gt;续)-&amp;gt;GameMon.des。关键点就是让GameGuard.des暂停，有什么办法？我想到一个是全局消息钩子(还是少不了它啊)。要实现大概需要做下面的工作：一个全局消息钩子DLL,里面只&lt;br&gt;&lt;br&gt;要一个消息回调函数（什么都不用做），DLL_PROCESS_ATTACH下进行当前进程判断找GameGuard.des,找到的话就向主程序SendMessage;主程序，负责安装钩子，接收钩子DLL发来的&lt;br&gt;&lt;br&gt;消息，接收到消息就开始查找游戏进程，向游戏进程注入内存操作DLL，返回给SendMessage让GameGuard.des继续，卸载钩子（免得它继续钩来钩去）；内存操作DLL，负责对游戏&lt;br&gt;&lt;br&gt;内存进行操作。&lt;br&gt;        具体编写如下（有省略）:&lt;br&gt;////////////////////////////////////////////////GameHook.cpp//////////////////////////////////////////////////////////////////&lt;br&gt;BOOL IsGameGuard();&lt;br&gt;//////////////////////////////////&lt;br&gt;LRESULT CALLBACK GetMsgProc(int nCode,WPARAM wParam,LPARAM lParam)&lt;br&gt;{&lt;br&gt;  return (CallNextHookEx(m_hHook,nCode,wParam,lParam));//什么都不需要做&lt;br&gt;}&lt;br&gt;///////////////////////////////////////&lt;br&gt;BOOL WINAPI DllMain(HINSTANCE hInst,DWORD dwReason,LPVOID lp)&lt;br&gt;{&lt;br&gt;  switch(dwReason){&lt;br&gt;  case DLL_PROCESS_ATTACH:    &lt;br&gt;    if(IsGameGuard())//判断当前进程是不是GameGuard.des&lt;br&gt;       SendMessage(m_hwndRecv,WM_HOOK_IN_GAMEGUARD,NULL,NULL);//向主窗体发送消息，SendMessage是等待接受窗体处理完毕才返回的，&lt;br&gt;    break;                               //所以进程就暂停在这里，我们有足够的时间去做事情&lt;br&gt;  case DLL_PROCESS_DETACH:&lt;br&gt;    break;&lt;br&gt;  }&lt;br&gt;  return TRUE;&lt;br&gt;}&lt;br&gt;///////////////////////////////////&lt;br&gt;GAMEHOOKAPI BOOL SetGameHook(BOOL fInstall,HWND hwnd)&lt;br&gt;{&lt;br&gt;  ...&lt;br&gt;}&lt;br&gt;////////////////////////////////////////&lt;br&gt;BOOL IsGameGuard()&lt;br&gt;{&lt;br&gt;       TCHAR  szFileName[256];&lt;br&gt;       GetModuleFileName(NULL,szFileName,256);&lt;br&gt;       if(strstr(szFileName,&amp;quot;GameGuard.des&amp;quot;)!=NULL){//这样的判断严格来说是有问题的，但实际操作也够用了。当然也可以进行更严格的判断，不过麻烦点&lt;br&gt;          return TRUE;&lt;br&gt;       }&lt;br&gt;  return FALSE;&lt;br&gt;}&lt;br&gt;//////////////////////////////////////////////////////Main////////////////////////////////////////////////////////////////////////&lt;br&gt;void OnGameGuard(WPARAM wParam,LPARAM lParam)//处理消息钩子DLL发来的消息就是上面SendMessage的那个&lt;br&gt;{  &lt;br&gt;  DWORD dwProcessId=FindGameProcess(m_strGameName);//开始查找游戏进程&lt;br&gt;  if(dwProcessId==0){&lt;br&gt;    MessageBox(m_hWnd,&amp;quot;没有找到游戏进程&amp;quot;,&amp;quot;查找游戏进程&amp;quot;,MB_OK);&lt;br&gt;    return;&lt;br&gt;  }  &lt;br&gt;&lt;br&gt;    if(!InjectDll(dwProcessId)){//查找到就开始注入&lt;br&gt;    MessageBox(m_hWnd,&amp;quot;向游戏进程注入失败&amp;quot;,注入&amp;quot;,MB_OK);&lt;br&gt;    return;&lt;br&gt;     }&lt;br&gt;}&lt;br&gt;/////////////////////////////////////////////////&lt;br&gt;DWORD FindGameProcess(LPCSTR szGameName)//负责查找游戏进程&lt;br&gt;{&lt;br&gt;  HANDLE hSnapshot=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);&lt;br&gt;  if(hSnapshot==INVALID_HANDLE_VALUE)&lt;br&gt;    return 0;&lt;br&gt;  PROCESSENTRY32 pe={sizeof(pe)};&lt;br&gt;  DWORD dwProcessID=0;&lt;br&gt;  for(BOOL fOK=Process32First(hSnapshot,&amp;amp;pe);fOK;fOK=Process32Next(hSnapshot,&amp;amp;pe)){&lt;br&gt;    if(lstrcmpi(szGameName,pe.szExeFile)==0){&lt;br&gt;      dwProcessID=pe.th32ProcessID;&lt;br&gt;      break;&lt;br&gt;    }&lt;br&gt;  }&lt;br&gt;  CloseHandle(hSnapshot);&lt;br&gt;  return dwProcessID;&lt;br&gt;}&lt;br&gt;/////////////////////////////////////////////////&lt;br&gt;BOOL InjectDll(DWORD dwProcessId)//负责注入，参考自Jeffrey Richter《windows核心编程》&lt;br&gt;{&lt;br&gt;  CString strText;&lt;br&gt;  char* szLibFileRemote=NULL;&lt;br&gt;&lt;br&gt;  HANDLE hProcess=OpenProcess(PROCESS_CREATE_THREAD|PROCESS_VM_OPERATION|PROCESS_VM_WRITE,FALSE,dwProcessId);&lt;br&gt;  if(hProcess==NULL){&lt;br&gt;  //  SetRecord(&amp;quot;Open game process failed!&amp;quot;);               &lt;br&gt;    return FALSE;&lt;br&gt;  }&lt;br&gt;  int cch=lstrlen(szDll)+1;&lt;br&gt;  int cb=cch*sizeof(char);&lt;br&gt;  szLibFileRemote=(char*)VirtualAllocEx(hProcess,NULL,cb,MEM_COMMIT,PAGE_READWRITE);&lt;br&gt;  if(szLibFileRemote==NULL){&lt;br&gt;  //  SetRecord(&amp;quot;Alloc memory to game process failed!&amp;quot;);&lt;br&gt;    CloseHandle(hProcess);&lt;br&gt;    return FALSE;&lt;br&gt;  }&lt;br&gt;&lt;br&gt;  if(!WriteProcessMemory(hProcess,(LPVOID)szLibFileRemote,(LPVOID)szDll,cb,NULL)){&lt;br&gt;  //  SetRecord(&amp;quot;Write game process memory failed!&amp;quot;);&lt;br&gt;    CloseHandle(hProcess);&lt;br&gt;    return FALSE;&lt;br&gt;  }&lt;br&gt;&lt;br&gt;  PTHREAD_START_ROUTINE pfnThreadRtn=(PTHREAD_START_ROUTINE)&lt;br&gt;     GetProcAddress(GetModuleHandle(TEXT(&amp;quot;kernel32&amp;quot;)),&amp;quot;LoadLibraryA&amp;quot;);&lt;br&gt;  if(pfnThreadRtn==NULL){&lt;br&gt;  //  SetRecord(&amp;quot;Alloc memory to game process failed!&amp;quot;);&lt;br&gt;    CloseHandle(hProcess);&lt;br&gt;    return FALSE;&lt;br&gt;  }&lt;br&gt;&lt;br&gt;  HANDLE hThread=CreateRemoteThread(hProcess,NULL,0,pfnThreadRtn, szLibFileRemote,0,NULL);&lt;br&gt;   if(!hThread)&lt;br&gt;   {&lt;br&gt;    //    SetRecord(&amp;quot;Create remote thread failed!&amp;quot;);&lt;br&gt;    CloseHandle(hProcess);&lt;br&gt;   return FALSE;&lt;br&gt;   }      &lt;br&gt;   if(hThread!=NULL)&lt;br&gt;     CloseHandle(hThread);  &lt;br&gt;   CloseHandle(hProcess);&lt;br&gt;    return TRUE;&lt;br&gt;&lt;br&gt;}     &lt;br&gt;///////////////////////////操作游戏内存的DLL就不贴了，大家根据不同的需要各显神通吧///////////////////////////////////////////////////      &lt;br&gt;      &lt;br&gt;       这种方法比一个全局消息钩子麻烦一点，但是优点是显然易见的:可以在NP启动前做事情，比如HOOK游戏函数或做游戏内存补丁。下面进入NP进程还要用到这种方法。&lt;br&gt;&lt;br&gt;三、进入NP进程&lt;br&gt;    如果我们对NP有足够的了解，想对它内存补丁一下，来做一些事情，哪又怎样才可以进入NP的进程呢?嗯，我们知道游戏启动流程是这样的游戏Main-&amp;gt;GameGuard.des-&lt;br&gt;&lt;br&gt;&amp;gt;GameMon.des（NP进程），其中GameGuard.des跟GameMon.des进程是游戏Main通过调用函数CreateProcessA来创建的，上面我们说到有办法在NP进程(GameMon.des)启动前将我们的&lt;br&gt;&lt;br&gt;DLL注入到游戏进程里，因此我们可以在GameMon.des启动前挂钩（HOOK）CreateProcessA，游戏创建NP进程时让NP暂停，但是游戏本来创建NP进程时就是让它先暂停的，这步我们&lt;br&gt;&lt;br&gt;可以省了。下面是游戏启动NP(版本900)时传递的参数&lt;br&gt;&lt;br&gt;      ApplicationName:C:\惊天动地Cabal Online\GameGuard\GameMon.des&lt;br&gt;      CommandLine:\x01\x58\x6d\xae\x99\x55\x57\x5d\x49\xbe\xe4\xe1\x9b\x14\xe6\x88\x57\x68\x6d\x11\xb9\x36\x73\x38\x71\x1e\x88\x46\xa9\x97\xd4\x3a\x20\x90&lt;br&gt;&lt;br&gt;\x62\xae\x15\xcd\x4b\xcd\x72\x82\xbd\x75\x0a\x54\xf0\xcc\x01\xad&lt;br&gt;      CreationFlags:4&lt;br&gt;      Directory:&lt;br&gt;      其中的CommandLine好长啊，它要传递的参数是:一个被保护进程的pid，两个Event的Handle，以及当前timeGetTime的毫秒数 (感谢JTR分享)。&lt;br&gt;      CreationFlags:4 查查winbase.h头文件，发现#define CREATE_SUSPENDED  0x00000004，所以NP进程创建时就是暂停的&lt;br&gt;    &lt;br&gt;      在我们替换的CreateProcessA中，先让游戏创建NP进程(由于游戏创建时NP进程本来就是暂停的，所以不用担心NP的问题)，让游戏进程暂停(SendMessage就可以了)，然后再&lt;br&gt;&lt;br&gt;向NP进程注入DLL,最后让游戏进程继续。这样我们的DLL就进入NP进程了。实现起来大概是这样子&lt;br&gt;BOOL&lt;br&gt;WINAPI&lt;br&gt;MyCreateProcessA(//替换原来的CreateProcessA&lt;br&gt;    LPCSTR lpApplicationName,&lt;br&gt;    LPSTR lpCommandLine,&lt;br&gt;    LPSECURITY_ATTRIBUTES lpProcessAttributes,&lt;br&gt;    LPSECURITY_ATTRIBUTES lpThreadAttributes,&lt;br&gt;    BOOL bInheritHandles,&lt;br&gt;    DWORD dwCreationFlags,&lt;br&gt;    LPVOID lpEnvironment,&lt;br&gt;    LPCSTR lpCurrentDirectory,&lt;br&gt;    LPSTARTUPINFOA lpStartupInfo,&lt;br&gt;    LPPROCESS_INFORMATION lpProcessInformation&lt;br&gt;    )&lt;br&gt;{&lt;br&gt;  UnhookCreateProcessA();&lt;br&gt;  BOOL fRet=CreateProcessA(lpApplicationName,lpCommandLine,lpProcessAttributes,lpThreadAttributes,bInheritHandles,dwCreationFlags,&lt;br&gt;     lpEnvironment,lpCurrentDirectory,lpStartupInfo,lpProcessInformation);  &lt;br&gt;  RehookCreateProcessA();&lt;br&gt;        SendMessage(hwndRecv,//负责注入的窗体句柄&lt;br&gt;                   WM_HOOK_NP_CREATE,//自定义消息&lt;br&gt;                   (WPARAM)lpProcessInformation-&amp;gt;dwProcessId,//把NP进程ID传给负责注入的主窗体&lt;br&gt;                   NULL);&lt;br&gt;  return fRet;&lt;br&gt;}&lt;br&gt;&lt;br&gt;四、注意问题&lt;br&gt;    由于我们是在不破解NP的前提下对游戏内存进行操作，所以一不小心的话，很容易就死游戏。NP保护了游戏进程的代码段，所以在NP启动后就不要再对其代码段进行修改，要&lt;br&gt;&lt;br&gt;补丁或HOOK系统函数这些都要在NP启动前完成。当然读写游戏的数据段是没问题的，因为游戏本身也不断进行这样的操作。&lt;/div&gt;
&lt;div&gt;&lt;/div&gt;&lt;img src="http://c.services.spaces.live.com/CollectionWebService/c.gif?cid=-3393211484310952491&amp;page=RSS%3a+%e3%80%90%e8%bd%ac%e3%80%91%e5%a6%82%e4%bd%95%e5%9c%a8NP%e4%b8%8b%e8%af%bb%e5%86%99%e6%b8%b8%e6%88%8f%e5%86%85%e5%ad%98%e5%8f%8a%e5%a6%82%e4%bd%95%e8%bf%9b%e5%85%a5NP%e8%bf%9b%e7%a8%8b&amp;referrer=" width="1px" height="1px" border="0" alt=""&gt;&lt;img style="position:absolute" alt="" width="0px" height="0px" src="http://c.live.com/c.gif?NC=31263&amp;amp;NA=1149&amp;amp;PI=73329&amp;amp;RF=&amp;amp;DI=3919&amp;amp;PS=85545&amp;amp;TP=skywolfstudio.spaces.live.com&amp;amp;GT1=skywolfstudio"&gt;</description><category>软件破解</category><comments>http://skywolfstudio.spaces.live.com/Blog/cns!D0E8E4220DDEA5D5!1119.entry#comment</comments><guid isPermaLink="true">http://skywolfstudio.spaces.live.com/Blog/cns!D0E8E4220DDEA5D5!1119.entry</guid><pubDate>Fri, 18 Apr 2008 07:59:40 GMT</pubDate><slash:comments>2</slash:comments><msn:type>blogentry</msn:type><live:type>blogentry</live:type><live:typelabel>Blog entry</live:typelabel><wfw:commentRss>http://skywolfstudio.spaces.live.com/blog/cns!D0E8E4220DDEA5D5!1119/comments/feed.rss</wfw:commentRss><wfw:comment>http://skywolfstudio.spaces.live.com/Blog/cns!D0E8E4220DDEA5D5!1119.entry#comment</wfw:comment><dcterms:modified>2008-04-18T07:59:40Z</dcterms:modified></item><item><title>【转】驱动中实现模拟键盘按键</title><link>http://skywolfstudio.spaces.live.com/Blog/cns!D0E8E4220DDEA5D5!1118.entry</link><description>&lt;table cellspacing=0 cellpadding=0 width="100%" border=0&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;div style="line-height:18px"&gt;
&lt;table cellspacing=0 cellpadding=0 width="100%" border=0&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;div style="line-height:18px"&gt;&lt;font color="#333333"&gt;标 题:&lt;/font&gt;&lt;font color="#000000"&gt; 【原创】驱动中实现模拟键盘按键&lt;/font&gt;&lt;font color="#666666"&gt;&lt;br&gt;&lt;font color="#333333"&gt;作 者:&lt;/font&gt; &lt;font color="#000000"&gt;luocong&lt;/font&gt;&lt;br&gt;&lt;font color="#333333"&gt;时 间:&lt;/font&gt; 2007-04-19,11:35&lt;br&gt;&lt;font color="#333333"&gt;链 接:&lt;/font&gt; http://bbs.pediy.com/showthread.php?t=42980&lt;br&gt;&lt;/font&gt;&lt;br&gt;在ring3中实现模拟键盘按键有N^N种方式，比如SendInput()、keybd_event()……但在驱动中要怎么模拟呢？&lt;br&gt;&lt;br&gt;1、写端口大法&lt;br&gt;#define defI8042_DATA_PORT ((PUCHAR)0x60)&lt;br&gt;#define defI8042_CTRL_PORT ((PUCHAR)0x64)&lt;br&gt;#define defOBUFFER_FULL 0x01&lt;br&gt;&lt;br&gt;BOOLEAN&lt;br&gt;WaitForKeyboardWrite(VOID)&lt;br&gt;{&lt;br&gt;    INT i;&lt;br&gt;    UCHAR c;&lt;br&gt;&lt;br&gt;    for (i = 0; i &amp;lt; 1000; ++i)&lt;br&gt;    {&lt;br&gt;        KeStallExecutionProcessor(50);&lt;br&gt;        c = READ_PORT_UCHAR(defI8042_CTRL_PORT);&lt;br&gt;        if ((c &amp;amp; defOBUFFER_FULL) == defOBUFFER_FULL)&lt;br&gt;            break;&lt;br&gt;    }&lt;br&gt;&lt;br&gt;    return i ? TRUE : FALSE;&lt;br&gt;}&lt;br&gt;&lt;br&gt;VOID PressKeyByScanCode(&lt;br&gt;    IN CONST BYTE ScanCode&lt;br&gt;)&lt;br&gt;{&lt;br&gt;    WRITE_PORT_UCHAR(defI8042_CTRL_PORT, 0xd2);&lt;br&gt;&lt;br&gt;    WaitForKeyboardWrite();&lt;br&gt;&lt;br&gt;    WRITE_PORT_UCHAR(defI8042_DATA_PORT, ScanCode);&lt;br&gt;}&lt;br&gt;&lt;br&gt;搞定，简单易行！缺点是只对PS/2键盘有效，USB的就一边凉快去吧。&lt;br&gt;&lt;br&gt;2、构造IRP大法&lt;br&gt;这个比较麻烦，而且由于某些原因，略……&lt;br&gt;&lt;br&gt;3、调用KeyboardClassServiceCallback()大法&lt;br&gt;kbdclass驱动是在I8042prt和kbdhid这两个驱动之上的，所以直接调用它的KeyboardClassServiceCallback()是能对PS/2和USB同时生效的，由于某些原因偶也不想给出具体的代码来。大致指点一下方向：&lt;br&gt;&lt;br&gt;KeyboaredClassServiceCallback函数的原型如下：&lt;br&gt;&lt;br&gt;typedef VOID (* PFN_KeyboardClassServiceCallback)(&lt;br&gt;    IN PDEVICE_OBJECT DeviceObject,&lt;br&gt;    IN PKEYBOARD_INPUT_DATA InputDataStart,&lt;br&gt;    IN PKEYBOARD_INPUT_DATA InputDataEnd,&lt;br&gt;    IN OUT PULONG InputDataConsumed&lt;br&gt;    );&lt;br&gt;&lt;br&gt;第一个参数DeviceObject是kbdclass的DeviceObject，怎么得到它呢？思路：先找到kbdclass的DriverObject，然后从DriverObject得到DeviceObject。&lt;br&gt;第二和第三个参数是KEYBOARD_INPUT_DATA，自己填充，想模拟什么按键就写什么MakeCode和Flags吧。注意第三个参数应该为第二个参数的指针地址值+1。&lt;br&gt;第四个参数，随便弄个ULONG型的变量给它就行了，反正是可以丢弃的。（I8042prt里面用到了它，但我们自己的模拟按键不用也行）&lt;br&gt;&lt;br&gt;缺点：每个系统的kbdclass.sys中的KeyboardClassServiceCallback的RVA都不相同，要自己hardcode一下，不过写驱动本来就是那么麻烦，习惯了就好。&lt;/div&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;
&lt;p&gt;网友:cngage评论&lt;br&gt;关于写端口部分，不知道楼住从哪里找的代码，写错了吧。&lt;br&gt;BOOLEAN&lt;br&gt;WaitForKeyboardWrite(VOID)&lt;br&gt;{&lt;br&gt;    INT i;&lt;br&gt;    UCHAR c;&lt;br&gt;&lt;br&gt;    for (i = 0; i &amp;lt; 1000; ++i)&lt;br&gt;    {&lt;br&gt;        KeStallExecutionProcessor(50);&lt;br&gt;        c = READ_PORT_UCHAR(defI8042_CTRL_PORT);&lt;br&gt;        if ((c &amp;amp; defOBUFFER_FULL) == defOBUFFER_FULL)&lt;br&gt;            break;&lt;br&gt;    }&lt;br&gt;&lt;br&gt;    return i ? TRUE : FALSE;&lt;br&gt;}&lt;br&gt;&lt;br&gt;判断状态寄存器是否为空，判断条件应该是&lt;br&gt;if ((c &amp;amp; 0x02)==0)&lt;br&gt;下面这句判断出的结果是输出buffer为满的情况&lt;br&gt;if ((c &amp;amp; defOBUFFER_FULL) == defOBUFFER_FULL)&lt;/div&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;img src="http://c.services.spaces.live.com/CollectionWebService/c.gif?cid=-3393211484310952491&amp;page=RSS%3a+%e3%80%90%e8%bd%ac%e3%80%91%e9%a9%b1%e5%8a%a8%e4%b8%ad%e5%ae%9e%e7%8e%b0%e6%a8%a1%e6%8b%9f%e9%94%ae%e7%9b%98%e6%8c%89%e9%94%ae&amp;referrer=" width="1px" height="1px" border="0" alt=""&gt;&lt;img style="position:absolute" alt="" width="0px" height="0px" src="http://c.live.com/c.gif?NC=31263&amp;amp;NA=1149&amp;amp;PI=73329&amp;amp;RF=&amp;amp;DI=3919&amp;amp;PS=85545&amp;amp;TP=skywolfstudio.spaces.live.com&amp;amp;GT1=skywolfstudio"&gt;</description><category>软件破解</category><comments>http://skywolfstudio.spaces.live.com/Blog/cns!D0E8E4220DDEA5D5!1118.entry#comment</comments><guid isPermaLink="true">http://skywolfstudio.spaces.live.com/Blog/cns!D0E8E4220DDEA5D5!1118.entry</guid><pubDate>Fri, 18 Apr 2008 07:57:09 GMT</pubDate><slash:comments>0</slash:comments><msn:type>blogentry</msn:type><live:type>blogentry</live:type><live:typelabel>Blog entry</live:typelabel><wfw:commentRss>http://skywolfstudio.spaces.live.com/blog/cns!D0E8E4220DDEA5D5!1118/comments/feed.rss</wfw:commentRss><wfw:comment>http://skywolfstudio.spaces.live.com/Blog/cns!D0E8E4220DDEA5D5!1118.entry#comment</wfw:comment><dcterms:modified>2008-04-18T07:57:09Z</dcterms:modified></item><item><title>【转载】反NP监视原理(+Bypass NP in ring0)</title><link>http://skywolfstudio.spaces.live.com/Blog/cns!D0E8E4220DDEA5D5!1117.entry</link><description>&lt;div&gt;NP=nProtect GameGuard(如果你不知道这是什么，请不要往下看)&lt;br&gt;*******************************************&lt;br&gt;*标题:【原创】反NP监视原理                *&lt;br&gt;*作者:堕落天才                            *&lt;br&gt;*日期:2007年1月3号                        *&lt;br&gt;*版权声明:请保存文章的完整，转载请注明出处*&lt;br&gt;*******************************************&lt;br&gt;一、NP用户层监视原理&lt;br&gt;    NP启动后通过WriteProcessMemory跟CreateRemoteThread向所有进程注入代码（除了系统进程smss.exe），代码通过np自己的LoadLibrary向目标进程加载npggNT.des。npggNT.des一旦加载就马上开始干“坏事”，挂钩(HOOK)系统关键函数如OpenProcess,ReadProcessMemory,WriteProcessMemory,PostMessage等等。挂钩方法是通过改写系统函数头，在函数开始JMP到npggNT.des中的替换函数。用户调用相应的系统函数时，会首先进入到npggNT.des模块等待NP的检查，如果发现是想对其保护的游戏进行不轨操作的话，就进行拦截，否则就调用原来的系统函数，让用户继续。&lt;br&gt;    下面是NP启动前user32.dll中的PostMessageA的源代码（NP版本900,XP sp2）&lt;br&gt;    8BFF            MOV EDI,EDI&lt;br&gt;    55              PUSH EBP&lt;br&gt;    8BEC            MOV EBP,ESP&lt;br&gt;    56              PUSH ESI&lt;br&gt;    57              PUSH EDI&lt;br&gt;    8B7D 0C         MOV EDI,DWORD PTR SS:[EBP+C]&lt;br&gt;    8BC7            MOV EAX,EDI&lt;br&gt;    2D 45010000     SUB EAX,145&lt;br&gt;    74 42           JE SHORT USER32.77D1CBDA&lt;br&gt;    83E8 48         SUB EAX,48&lt;br&gt;    74 3D           JE SHORT USER32.77D1CBDA&lt;br&gt;    2D A6000000     SUB EAX,0A6&lt;br&gt;    0F84 D4530200   JE USER32.77D41F7C&lt;br&gt;    8B45 10         MOV EAX,DWORD PTR SS:[EBP+10]&lt;br&gt;    8B0D 8000D777   MOV ECX,DWORD PTR DS:[77D70080]&lt;br&gt;    F641 02 04      TEST BYTE PTR DS:[ECX+2],4&lt;br&gt;    0F85 03540200   JNZ USER32.77D41FBE&lt;br&gt;    8D45 10         LEA EAX,DWORD PTR SS:[EBP+10]&lt;br&gt;    50              PUSH EAX&lt;br&gt;    57              PUSH EDI&lt;br&gt;    E8 FBFEFFFF     CALL USER32.77D1CAC0&lt;br&gt;    FF75 14         PUSH DWORD PTR SS:[EBP+14]&lt;br&gt;    FF75 10         PUSH DWORD PTR SS:[EBP+10]&lt;br&gt;    57              PUSH EDI&lt;br&gt;    FF75 08         PUSH DWORD PTR SS:[EBP+8]&lt;br&gt;    E8 ACBFFFFF     CALL USER32.77D18B80&lt;br&gt;    5F              POP EDI&lt;br&gt;    5E              POP ESI&lt;br&gt;    5D              POP EBP&lt;br&gt;    C2 1000         RETN 10&lt;br&gt;&lt;br&gt;    而下面是NP启动后user32.dll中的PostMessageA的源代码（NP版本900,XP sp2）&lt;br&gt;    E9 A69AB8CD     JMP npggNT.458A6630&lt;br&gt;    56              PUSH ESI&lt;br&gt;    57              PUSH EDI&lt;br&gt;    8B7D 0C         MOV EDI,DWORD PTR SS:[EBP+C]&lt;br&gt;    8BC7            MOV EAX,EDI&lt;br&gt;    2D 45010000     SUB EAX,145&lt;br&gt;    74 42           JE SHORT USER32.77D1CBDA&lt;br&gt;    83E8 48         SUB EAX,48&lt;br&gt;    74 3D           JE SHORT USER32.77D1CBDA&lt;br&gt;    2D A6000000     SUB EAX,0A6&lt;br&gt;    0F84 D4530200   JE USER32.77D41F7C&lt;br&gt;    8B45 10         MOV EAX,DWORD PTR SS:[EBP+10]&lt;br&gt;    8B0D 8000D777   MOV ECX,DWORD PTR DS:[77D70080]&lt;br&gt;    F641 02 04      TEST BYTE PTR DS:[ECX+2],4&lt;br&gt;    0F85 03540200   JNZ USER32.77D41FBE&lt;br&gt;    8D45 10         LEA EAX,DWORD PTR SS:[EBP+10]&lt;br&gt;    50              PUSH EAX&lt;br&gt;    57              PUSH EDI&lt;br&gt;    E8 FBFEFFFF     CALL USER32.77D1CAC0&lt;br&gt;    FF75 14         PUSH DWORD PTR SS:[EBP+14]&lt;br&gt;    FF75 10         PUSH DWORD PTR SS:[EBP+10]&lt;br&gt;    57              PUSH EDI&lt;br&gt;    FF75 08         PUSH DWORD PTR SS:[EBP+8]&lt;br&gt;    E8 ACBFFFFF     CALL USER32.77D18B80&lt;br&gt;    5F              POP EDI&lt;br&gt;    5E              POP ESI&lt;br&gt;    5D              POP EBP&lt;br&gt;    C2 1000         RETN 10&lt;br&gt;   &lt;br&gt;    通过对比我们可以发现，NP把PostMessageA函数头原来的8BFF558BEC五个字节改为了E9A69AB8CD，即将MOV EDI,EDI  PUSH EBP&lt;br&gt;MOV EBP,ESP 三条指令改为了JMP npggNT.458A6630。所以用户一旦调用PostMessageA的话，就会跳转到npggNT.des中的458A6630中去。&lt;br&gt;二、用户层反NP监视方法&lt;br&gt;    1，把被NP修改了的函数头改回去&lt;br&gt;       上面知道NP是通过在关键系统函数头写了一个JMP来进行挂钩的，因此，在理论上我们可以通过把函数头写回去来进行调用。在实际操作的时候，这种方法并不理想。因为npggNT.des也挂钩了把函数头改写回去的所有函数，还有它的监视线程也会进行检校判断它挂钩了的函数是不是被修改回去。因此实现起来很困难，随时都会死程序。&lt;br&gt;    2，构建自己的系统函数(感谢JTR提供)&lt;br&gt;       这种方法适用于代码比较简单的系统函数。下面我们看看keybd_event的函数源码&lt;br&gt;    8BFF            MOV EDI,EDI                              ; USER32.keybd_event&lt;br&gt;    55              PUSH EBP&lt;br&gt;    8BEC            MOV EBP,ESP&lt;br&gt;    83EC 1C         SUB ESP,1C&lt;br&gt;    8B4D 10         MOV ECX,DWORD PTR SS:[EBP+10]&lt;br&gt;    8365 F0 00      AND DWORD PTR SS:[EBP-10],0&lt;br&gt;    894D EC         MOV DWORD PTR SS:[EBP-14],ECX&lt;br&gt;    66:0FB64D 08    MOVZX CX,BYTE PTR SS:[EBP+8]&lt;br&gt;    66:894D E8      MOV WORD PTR SS:[EBP-18],CX&lt;br&gt;    66:0FB64D 0C    MOVZX CX,BYTE PTR SS:[EBP+C]&lt;br&gt;    66:894D EA      MOV WORD PTR SS:[EBP-16],CX&lt;br&gt;    8B4D 14         MOV ECX,DWORD PTR SS:[EBP+14]&lt;br&gt;    894D F4         MOV DWORD PTR SS:[EBP-C],ECX&lt;br&gt;    6A 1C           PUSH 1C&lt;br&gt;    33C0            XOR EAX,EAX&lt;br&gt;    8D4D E4         LEA ECX,DWORD PTR SS:[EBP-1C]&lt;br&gt;    40              INC EAX&lt;br&gt;    51              PUSH ECX&lt;br&gt;    50              PUSH EAX&lt;br&gt;    8945 E4         MOV DWORD PTR SS:[EBP-1C],EAX&lt;br&gt;    E8 9B8DFCFF     CALL USER32.SendInput&lt;br&gt;    C9              LEAVE&lt;br&gt;    C2 1000         RETN 10&lt;br&gt;&lt;br&gt;    由上面我们看到keybd_event进行了一些参数的处理最后还是调用了user32.dll中的SendInput函数。而下面是SendInput的源代码&lt;br&gt;    B8 F6110000     MOV EAX,11F6&lt;br&gt;    BA 0003FE7F     MOV EDX,7FFE0300&lt;br&gt;    FF12            CALL DWORD PTR DS:[EDX]          ; ntdll.KiFastSystemCall&lt;br&gt;    C2 0C00         RETN 0C&lt;br&gt;&lt;br&gt;    SendInput代码比较简单吧？我们发现SendInput最终是调用了ntdll.dll中的KiFastSystemCall函数，我们再跟下去，KiFastSystemCall就是这个样子了&lt;br&gt;    8BD4            MOV EDX,ESP&lt;br&gt;    0F34            SYSENTER&lt;br&gt;    最终就是进入了SYSENTER。&lt;br&gt;    &lt;br&gt;    通过上面的代码我们发现一个keybd_event函数构建并不复杂因此我们完全可以把上面的代码COPY到自己的程序，用来替代原来的keybd_event。NP启动后依然会拦截原来的那个，但已经没关系啦，因为我们不需要用原来那个keybd_event了。&lt;br&gt;    这种方法适用于源代码比较简单的系统函数，复杂的话实现起来就比较麻烦了。我是没有信心去重新构建一个PostMessageA,因为其中涉及到N个jmp和Call,看起来头都大。 还有在VC6里嵌入汇编经常死VC(这种事太烦人了)，我想不会是我用了盗版的原因吧？&lt;br&gt;  &lt;br&gt;    3，进入ring0(感谢风景的驱动鼠标键盘模拟工具)&lt;br&gt;     由上面可以看到，NP用户层的监视不过是修改了一下系统的函数头，进行挂钩监视。因此，要反NP用户层监视的话，进入ring0的话很多问题就可以解决了。比如WinIO在驱动层进行键盘模拟，npggNT.des是拦截不到的。但是由于NP用了特征码技术，再加上WinIO名气太大了，所以WinIO在NP版本8××以后都不能用了。但是如果熟悉驱动开发的话，自己写一个也不是很困难的事。&lt;br&gt; &lt;br&gt;     说了那么多看起来很“高深”的东西，现在说一些象我这样的菜鸟都能明白的东西，呵呵，因为这是菜鸟想出来的菜办法。&lt;br&gt;    4，断线程&lt;br&gt;       我们知道NP是通过CreateRemoteThread在目标进程创建远程线程的，还有一点，很重要的一点就是:NP向目标进程调用了CreateRemoteThread后就什么都不管了，也就是说，凭本事可以对除游戏外的所有进程npggNT.des模块进行任何“处置”。这样我们可以用一个很简单的方法就是检查自己的线程，发现多余的话（没特别的事情就是NP远程创建的）就马上结束了它，这样NP就无法注入了。但是由于windows系统是多任务系统，而CreateRemoteThread的执行时间又极短，要在这么短的时间内发现并结束它的话是一件很困难的事。一旦CreateRemoteThread执行完毕而我们的监视线程还没有起作用的话，后果就惨重了，npggNT.des马上把程序“搞死”。因为我们一直试图关闭它的线程，而npggNT.des又拦截了TerminateThread,所以我们就只能不断地“重复重复再重复”去试图关闭npggNT.des的监视线程。如果我们很幸运地在其执行注入代码时就能断了它地线程地话，npggNT.des就无法注入了。这种方法在NP早期版本大概有百分之五十的成功率，现在能有百分之一的成功率都不错了。&lt;br&gt;&lt;br&gt;     5，断线程之线程陷阱&lt;br&gt;      我知道“线程陷阱”这个词肯定不是我首创，但用“陷阱”这种方法来对付NP之前在网上是找不到的。为什么要叫“线程陷阱”？因为这确确实实是一个陷阱，在npggNT.des肯定要经过的地方设置一个“陷阱”，等它来到之后，掉进去自动就死掉了。而搭建陷阱的方法简单得令你难以相信。&lt;br&gt;       上面我们从npggNT.des的监视原理可以看到，npggNT.des要来挂钩(HOOK)我们的系统函数，这种的方法我们也会，是不是？哪想想，这种挂钩方法需要用到哪些系统函数呢? 打开进程OpenProcess或GetCurrentProcess(因为npggNT.des已经进入了目标进程，所以没有必要再调用OpenProcess，肯定是用后者)、找模块地址GetModelHandle、找函数地址GetProcAddress、改写函数头的内存属性VirtualQuery&amp;amp;VirtualProtect、写内存WriteProcessMemory。嘿嘿，在这些地方设置陷阱就八九不离十了，肯定是npggNT.des干那坏勾当要经过的地方。&lt;br&gt;      怎么设陷阱呢？选一个上面说的函数（我没有一一尝试），先自己挂钩（嘿嘿，NP会我们也会）。等到有人调用的时候，先判断当前的的线程是不是我们程序的，不是的话，那就断了它吧（一个ExitThread就可以了）。大概就像下面这个样子&lt;br&gt;HANDLE WINAPI MyGetCurrentProcess(VOID)//替换掉原来的GetCurrentProcess&lt;br&gt;{&lt;br&gt;   DWORD dwThreadId=GetCurrentThreadId();//得到当前线程ID&lt;br&gt;   if(!IsMyThread(dwThreadId)){//不是我们要保护的线程&lt;br&gt;      ExitThread(0);//断了它吧         &lt;br&gt;   }&lt;br&gt;   UnhookGetCurrentProcess(); //是我们要保护的线程调用就恢复函数头&lt;br&gt;   HANDLE hProcess=GetCurrentProcess();//让它调用&lt;br&gt;   RehookGetCurrentProcess();//重新挂钩&lt;br&gt;   return hProcess;   //返回调用结果&lt;br&gt;}&lt;br&gt;      这种方法去掉npggNT.des的监视是完全能够实现的，但是这个函数IsMyThread(dwThreadId)非常关键，要考虑周全，不然断错线程的话，就“自杀”了。&lt;br&gt;&lt;br&gt;      6，更简单的陷阱&lt;br&gt;         原理跟上面一样，但是我们将替换函数写成这个样子&lt;br&gt;HANDLE WINAPI MyGetCurrentProcess(VOID)//替换掉原来的GetCurrentProcess&lt;br&gt;{ &lt;br&gt;   HMODLE hMod=GetModelHandle(&amp;quot;npggNT.des&amp;quot;);&lt;br&gt;   if(hMod!=NULL){&lt;br&gt;      FreeLibrary(hMod);      //直接Free掉它&lt;br&gt;   }&lt;br&gt;   UnhookGetCurrentProcess(); //是我们要保护的线程调用就恢复函数头&lt;br&gt;   HANDLE hProcess=GetCurrentProcess();//让它调用&lt;br&gt;   RehookGetCurrentProcess();//重新挂钩&lt;br&gt;   return hProcess;   //返回调用结果&lt;br&gt;}&lt;br&gt;     这种方法就万无一失了，不用担心会“自杀”。&lt;br&gt;&lt;br&gt;三、总结&lt;br&gt;    由上面可以看到在用户层上反NP监视是不是很简单的事？最简单有效的就是第六种方法，短短的几行代码就可以搞定了。但是不要指望去掉了npggNT.des就可以为所欲为了，还有NP还在驱动层做了很多手脚，比如WriteProcessMemory在用户层用没问题，但是过不了NP的驱动检查，对游戏完全没效果。要在NP下读写游戏内存，说起来又另一篇文章了《如何在NP下读写游戏内存》，请继续关注。&lt;br&gt;&lt;br&gt;**********************************************************************&lt;br&gt;Bypass NP in ring0 (2007年3月16日):&lt;br&gt;1,Add MyService&lt;br&gt;2,hook sysenter&lt;br&gt;3,SystemServiceID-&amp;gt;MyServiceID&lt;br&gt;4,MyService JMP -&amp;gt;SystemService Function + N bytes(参考&lt;a href="http://bbs.pediy.com/showthread.php?s=&amp;amp;threadid=40832" target="_blank"&gt;【原创】SSDT Hook的妙用－对抗ring0 inline hook &lt;/a&gt; )&lt;br&gt;&lt;br&gt;1、2、3 -&amp;gt;绕过NP SSDT检测&lt;br&gt;4       -&amp;gt;绕过NP 内核函数头检测&lt;br&gt;&lt;br&gt;NP968下通过&lt;br&gt;&lt;/div&gt;&lt;img src="http://c.services.spaces.live.com/CollectionWebService/c.gif?cid=-3393211484310952491&amp;page=RSS%3a+%e3%80%90%e8%bd%ac%e8%bd%bd%e3%80%91%e5%8f%8dNP%e7%9b%91%e8%a7%86%e5%8e%9f%e7%90%86(%2bBypass+NP+in+ring0)&amp;referrer=" width="1px" height="1px" border="0" alt=""&gt;&lt;img style="position:absolute" alt="" width="0px" height="0px" src="http://c.live.com/c.gif?NC=31263&amp;amp;NA=1149&amp;amp;PI=73329&amp;amp;RF=&amp;amp;DI=3919&amp;amp;PS=85545&amp;amp;TP=skywolfstudio.spaces.live.com&amp;amp;GT1=skywolfstudio"&gt;</description><category>软件破解</category><comments>http://skywolfstudio.spaces.live.com/Blog/cns!D0E8E4220DDEA5D5!1117.entry#comment</comments><guid isPermaLink="true">http://skywolfstudio.spaces.live.com/Blog/cns!D0E8E4220DDEA5D5!1117.entry</guid><pubDate>Thu, 17 Apr 2008 15:14:35 GMT</pubDate><slash:comments>1</slash:comments><msn:type>blogentry</msn:type><live:type>blogentry</live:type><live:typelabel>Blog entry</live:typelabel><wfw:commentRss>http://skywolfstudio.spaces.live.com/blog/cns!D0E8E4220DDEA5D5!1117/comments/feed.rss</wfw:commentRss><wfw:comment>http://skywolfstudio.spaces.live.com/Blog/cns!D0E8E4220DDEA5D5!1117.entry#comment</wfw:comment><dcterms:modified>2008-04-17T15:14:35Z</dcterms:modified></item><item><title>用VC制作修改器教程[转]</title><link>http://skywolfstudio.spaces.live.com/Blog/cns!D0E8E4220DDEA5D5!1108.entry</link><description>如何使用 Visual C++ 6.0 产生自己的 trainer 程式 
&lt;p&gt;
&lt;p&gt;(以修改 StarCraft v1.02 单机版地图作弊为范例 )
&lt;p&gt;1.在 VC++ 5.0 的主选单中选择 File/New
&lt;p&gt;2.选择开启新的 MFC AppWizard(exe) 专案
&lt;p&gt;3.在 Project name: 栏位中输入专案名称 (在此我用 xxx 当范例)
&lt;p&gt;4.接下来会问你应用程式的型态,选择 &amp;quot; Dialog based &amp;quot; !!
&lt;p&gt;5.接下来会问你应用程式是否要连结其他的元件,选择内定值即可
&lt;p&gt;6.接下来会问你是否要在原始程式码中加上注解,选择内定值即可
&lt;p&gt;7.最後选择完成即可产生 &amp;quot;xxx&amp;quot; 这个应用程式专案
&lt;p&gt;8.开启 xxx.cpp 这个原始档案,并找到下列程式段落...
&lt;p&gt;&amp;gt; m_pMainWnd = &amp;amp;dlg;&lt;br&gt;&amp;gt; int nResponse = dlg.DoModal();&lt;br&gt;&amp;gt; if (nResponse == IDOK)&lt;br&gt;&amp;gt; {&lt;br&gt;&amp;gt; &lt;br&gt;&amp;gt; // TODO: Place code here to handle when the dialog is&lt;br&gt;&amp;gt;
&lt;p&gt;9.将以下程式码加在 &amp;quot; // TODO: &amp;quot; 这行後面...( &amp;quot;//&amp;quot; 之後为程式注解)
&lt;p&gt;// ------- 程式由此开始 ------------------------------ 
&lt;p&gt;HWND hWnd; // hWnd : 该视窗的 handle&lt;br&gt;DWORD dwx; // dwx : 为存放内 ProcessID 的变数位址&lt;br&gt;HANDLE hProc; // hProc : 为该程式的行程代码 
&lt;p&gt;hWnd = ::FindWindow(NULL,&amp;quot;Starcraft&amp;quot;);
&lt;p&gt;// 呼叫 FindWindow 这个 Win32 API 来取得 Starcraft 的 hWnd 
&lt;p&gt;::GetWindowThreadProcessId(hWnd,&amp;amp;dwx);
&lt;p&gt;// 呼叫 GetWindowThreadProcessID 这个 Win32 API 来取得 ProcessID&lt;br&gt;// 正常执行无误後,会将 Process ID 存入 dwx 这个位址中
&lt;p&gt;hProc = OpenProcess(PROCESS_ALL_ACCESS,FALSE,dwx);
&lt;p&gt;// 呼叫 OpenProcess 这个 Win32 API 来取得 Process handle&lt;br&gt;// 正常执行无误後,会将 Process handle 存入 hProc&lt;br&gt;// PS: &lt;br&gt;// 接下来呼叫 WriteProcessMemory 来写入记忆体时需要必须要&lt;br&gt;// 有该 process 的 hProc 才能写入... &lt;br&gt;//
&lt;p&gt;char buf; // buf: 存放要写入资料的暂存区(1 Byte)
&lt;p&gt;#define CodeAddress1 0x00463dab // 要修改的第一个记忆体位址&lt;br&gt;#define CodeAddress2 0x00463dac // 要修改的第二个记忆体位址&lt;br&gt;#define CodeAddress3 0x00463dad // 要修改的第三个记忆体位址
&lt;p&gt;#define NewCode1 (char)0x66 // 第一个位址所要填入的机械码&lt;br&gt;#define NewCode2 (char)0x33 // 第二个位址所要填入的机械码&lt;br&gt;#define NewCode3 (char)0xd2 // 第三个位址所要填入的机械码
&lt;p&gt;buf = NewCode1; // 将要写入记忆体的程式码放入暂存区
&lt;p&gt;WriteProcessMemory(hProc, (void *)CodeAddress1, (void *)&amp;amp;buf, 1, NULL);
&lt;p&gt;// 呼叫 WriteProcessMemory 这个 win32 API 来作写入记忆体的动作 &lt;br&gt;// hProc 为 StarCraft 的 Process handle&lt;br&gt;// CodeAddress1 为要写入的记忆体位址&lt;br&gt;// buf 为存放要写入机械码的存区&lt;br&gt;// &amp;quot;1&amp;quot; 代表写入一个 byte
&lt;p&gt;buf = NewCode2;&lt;br&gt;WriteProcessMemory(hProc, (void *)CodeAddress2, (void *)&amp;amp;buf, 1, NULL);&lt;br&gt;// 重覆执行上一个写入记忆体的程序(这次是写第二个位址)
&lt;p&gt;&lt;br&gt;buf = NewCode3;&lt;br&gt;WriteProcessMemory(hProc, (void *)CodeAddress3, (void *)&amp;amp;buf, 1, NULL);&lt;br&gt;// 重覆执行上一个写入记忆体的程序(这次是写第三个位址)
&lt;p&gt;return TRUE;&lt;br&gt;// 写完这三个 Bytes 後,离开程式...
&lt;p&gt;// ------- 程式到此停止 ------------------------------ 
&lt;p&gt;10.储存档案,并选择选单上的 Build/Rebuild All 来编译程式&lt;br&gt;若没出现错误讯息的话,会在 xxx 专案目录下产生 xxx.exe
&lt;p&gt;注: 由於本范例为教学用,所以程式内容则尽可能省略;重点放在&lt;br&gt;修改记忆体的 Win32 API 上面,希望能让有兴趣撰写修改程&lt;br&gt;式而却不得其门而入的使用者能省去不少时间...
&lt;div&gt;&lt;/div&gt;&lt;img src="http://c.services.spaces.live.com/CollectionWebService/c.gif?cid=-3393211484310952491&amp;page=RSS%3a+%e7%94%a8VC%e5%88%b6%e4%bd%9c%e4%bf%ae%e6%94%b9%e5%99%a8%e6%95%99%e7%a8%8b%5b%e8%bd%ac%5d&amp;referrer=" width="1px" height="1px" border="0" alt=""&gt;&lt;img style="position:absolute" alt="" width="0px" height="0px" src="http://c.live.com/c.gif?NC=31263&amp;amp;NA=1149&amp;amp;PI=73329&amp;amp;RF=&amp;amp;DI=3919&amp;amp;PS=85545&amp;amp;TP=skywolfstudio.spaces.live.com&amp;amp;GT1=skywolfstudio"&gt;</description><category>编程开发</category><comments>http://skywolfstudio.spaces.live.com/Blog/cns!D0E8E4220DDEA5D5!1108.entry#comment</comments><guid isPermaLink="true">http://skywolfstudio.spaces.live.com/Blog/cns!D0E8E4220DDEA5D5!1108.entry</guid><pubDate>Wed, 16 Apr 2008 04:49:04 GMT</pubDate><slash:comments>0</slash:comments><msn:type>blogentry</msn:type><live:type>blogentry</live:type><live:typelabel>Blog entry</live:typelabel><wfw:commentRss>http://skywolfstudio.spaces.live.com/blog/cns!D0E8E4220DDEA5D5!1108/comments/feed.rss</wfw:commentRss><wfw:comment>http://skywolfstudio.spaces.live.com/Blog/cns!D0E8E4220DDEA5D5!1108.entry#comment</wfw:comment><dcterms:modified>2008-04-16T04:49:04Z</dcterms:modified></item><item><title>用VB制作修改器教程[转]</title><link>http://skywolfstudio.spaces.live.com/Blog/cns!D0E8E4220DDEA5D5!1107.entry</link><description>对不起，我想这是不可能的，因为VB是一个如此简单的编程语音。&amp;quot;如果有人这么告诉你，别去理他。我可以肯定告诉你，对于制作修改器这种简单的程序，VB完全可以胜任。&lt;br&gt;然而，有个问题必须首先考虑：使用VB编写的修改器需要VB的运行库才能运行。如果考虑到有些使用者(实际上可能是大部分使用者)没有运行库，那么在最后制作的ZIP压缩文件中就必须包含这些庞大的文件。在下面的教程里我将制作一个修改器，如果为它再制作一个安装程序，那么整个修改器的体积将超过1MB。其中包括一个很好的安装和反安装程序，但大部分还是VB40032.DLL这个文件。&lt;br&gt;除了以上这点，使用VB制作修改器是非常简单的。一旦制作了多次后，你会发现能很快地制作出一个修改器。而且使用VB制作的修改器能够毫无困难地解决游戏运行时的动态内存分配问题，因此即使是最新的游戏，也可以使用VB制作修改器。在本教程中将不涉及动态内存分配，因为虽然简单，但仍然属于一个高级的选项。 &lt;br&gt;一些背景知识&lt;br&gt;不象C语音，VB不会自动包括普通的API函数的声明，因此我们必须把他们加入我们的项目文件。在几乎所有的修改器中会使用到6个主要的函数，讨论如下：&lt;br&gt;1. FindWindow(ClassName, WindowTitle) - FindWindow 返回符合指定的类名( ClassName )和窗口名( WindowTitle )的窗口句柄。对我们来说，可以让 ClassName 为空( Null )，只给出游戏的 WindowTitle。函数应该这样声明： Declare Function FindWindow Lib &amp;quot;user32&amp;quot; Alias &amp;quot;FindWindowA&amp;quot; (ByVal lpClassName As String, ByVal lpWindowName As String) As Long&lt;br&gt;2. GetWindowThreadProcessId(WindowHandle, ProcessId) - 在这里我们把 FindWindow 函数中得到的句柄作为参数，来获得进程标识符(ProcessId )。声明如下： Declare Function GetWindowThreadProcessId Lib &amp;quot;user32&amp;quot; (ByVal hwnd As Long, lpdwProcessId As Long) As Long&lt;br&gt;3. OpenProcess(DesiredAccess, Inherit, ProcessId) - 这个函数将返回一个我们目标进程的句柄，可以用来对目标进行读写操作。 DesiredAccess 参数的值决定了句柄对进程的存取权利，对我们来说，要使用 PROCESS_ALL_ACCESS (完全存取权限)。Inherit 应该总是 False。 ProcessId 是从 GetWindowThreadProcessId 函数中取得的。 Declare Function OpenProcess Lib &amp;quot;kernel32&amp;quot; (ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal dwProcessId As Long) As Long&lt;br&gt;4. CloseHandle(ProcessHandle) - 每一个打开的句柄必须呼叫这个函数来关闭。 Declare Function CloseHandle Lib &amp;quot;kernel32&amp;quot; (ByVal hObject As Long) As Long&lt;br&gt;5. WriteProcessMemory(ProcessHandle, Address, Value, SizeofValue, BytesWritten) - 把指定的值 Value 写入由 Address 指定的目标地址。 Declare Function WriteProcessMemory Lib &amp;quot;kernel32&amp;quot; (ByVal hProcess As Long, ByVal lpBaseAddress As Any, ByVal lpBuffer As Any, ByVal nSize As Long, lpNumberOfBytesWritten As Long) As Long&lt;br&gt;6. ReadProcessMemory(ProcessHandle, Address, Value, SizeofValue, BytesWritten) - 把 Address 指定的目标地址的值存入 Value 位置的变量中。 Declare Function WriteProcessMemory Lib &amp;quot;kernel32&amp;quot; (ByVal hProcess As Long, ByVal lpBaseAddress As Any, ByVal lpBuffer As Any, ByVal nSize As Long, lpNumberOfBytesWritten As Long) As Long&lt;br&gt;这些函数一环扣一环，缺一不可。更详细的内容可以参考VB的帮助文件。 
&lt;p&gt;
&lt;p&gt;&lt;font color="#000000"&gt;一个简单的修改器范例&lt;br&gt;如何使上面介绍的这些函数一起工作，制作出我们需要的修改器呢？下面是一个为Windows的计算器程序制作修改器的例子。这个修改器将读出计算器窗口中显示的数值，并在点击一个按钮后在计算器窗口中显示我们的名字。&lt;/font&gt;
&lt;p&gt;&lt;font color="#000000"&gt;首先我们需要找到计算器显示窗口中显示值的地址。本教程不是关于如何进行内存搜索，因而我将只作简单的说明：&lt;br&gt;· 在计算器窗口中输入123456&lt;br&gt;· 使用你喜欢的任何一种内存地址搜索程序寻找字串123456&lt;br&gt;· 使用另一个值重复上面的过程直到只返回1个地址&lt;br&gt;那是制作我们的修改器需要的唯一一个地址。在我的计算器程序里这个地址是40B181 hex, 4239745 dec。用你找到的地址替代在下面的代码里使用的这个地址。&lt;/font&gt;
&lt;div&gt;
&lt;p&gt;&lt;font color="#000000"&gt;现在让我们开始设计修改器的界面：&lt;br&gt;· 在VB中新建一个项目，加入一个文本框( Textbox )、一个按钮和一个计时器( timer )。文本框用来显示从计算器窗口取得的字串，按钮用来把我们的名字传到计算器窗口&lt;br&gt;· 把表单( form )的标题( Caption )属性设为 Calculator Trainer&lt;br&gt;· 把文本框改名为 txtDisplay 并清除 Text 属性&lt;br&gt;· 把计时器改名为 ReadTimer 并把间隔( interval )设为500&lt;br&gt;· 把按钮的标题改为 Display Name，按钮的名字改为 btnPasteName&lt;/font&gt;
&lt;p&gt;&lt;font color="#000000"&gt;在这个修改器中我们将使用所有6个函数，ReadProcessMemory、WriteProcessMemory、OpenProcess、GetWindowThreadProcessId、FindWindow 和 CloseHandle。在项目中插入一个新的模块，增加下列代码。(下面的一些行自动换行了，在你的模块中每一句必须在一行里，或使用延长符_)&lt;br&gt;Declare Function FindWindow Lib &amp;quot;user32&amp;quot; Alias &amp;quot;FindWindowA&amp;quot; (ByVal lpClassName As String, ByVal lpWindowName As String) As Long&lt;br&gt;Declare Function GetWindowThreadProcessId Lib &amp;quot;user32&amp;quot; (ByVal hwnd As Long, lpdwProcessId As Long) As Long&lt;br&gt;Declare Function OpenProcess Lib &amp;quot;kernel32&amp;quot; (ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal dwProcessId As Long) As Long&lt;br&gt;Declare Function WriteProcessMemory Lib &amp;quot;kernel32&amp;quot; (ByVal hProcess As Long, ByVal lpBaseAddress As Any, ByVal lpBuffer As Any, ByVal nSize As Long, lpNumberOfBytesWritten As Long) As Long&lt;br&gt;Declare Function ReadProcessMemory Lib &amp;quot;kernel32&amp;quot; (ByVal hProcess As Long, ByVal lpBaseAddress As Any, ByVal lpBuffer As Any, ByVal nSize As Long, lpNumberOfBytesWritten As Long) As Long&lt;br&gt;Declare Function CloseHandle Lib &amp;quot;kernel32&amp;quot; (ByVal hObject As Long) As Long&lt;/font&gt;
&lt;p&gt;&lt;font color="#000000"&gt;下面我们要开始写在计时器窗口中显示我们名字的代码了。首先我们使用 FindWindow 函数取得目标窗口的句柄。把这个返回值保存在一个变量中，并检查它的值是否出错来确保计时器程序正在运行。(FindWindow函数出错时返回0)&lt;br&gt;Dim hwnd As Long&lt;br&gt;hwnd = FindWindow(vbNullString, &amp;quot;Calculator&amp;quot;)&lt;br&gt;If (hwnd = 0) Then&lt;br&gt;MsgBox &amp;quot;Window not found!&amp;quot;&lt;br&gt;Exit Sub&lt;br&gt;End If&lt;br&gt;注意在这里我们传递了一个 Null 值给 FindWindow 函数，而不是 ClassName。因此任何名为 Calculator 的窗口都符合条件。如果知道计算器程序窗口的 ClassName，你可以传给它，但这不是必须的。&lt;/font&gt;
&lt;p&gt;&lt;font color="#000000"&gt;现在使用得到的窗口句柄来取得进程标识符( ProcessId )。注意 pid 是作为参数传递给函数的，而不是被赋以函数返回值。&lt;br&gt;Dim pid As Long&lt;br&gt;GetWindowThreadProcessId hwnd, pid&lt;/font&gt;
&lt;p&gt;&lt;font color="#000000"&gt;再利用变量pid得到计算器程序的进程句柄。再次检查函数的返回值，如果是非法数据则退出程序。&lt;br&gt;Dim pHandle As Long&lt;br&gt;pHandle = OpenProcess(PROCESS_ALL_ACCESS, False, pid)&lt;br&gt;If (pHandle = 0) Then&lt;br&gt;MsgBox &amp;quot;Couldn't get a process handle!&amp;quot;&lt;br&gt;Exit Sub&lt;br&gt;End If&lt;/font&gt;
&lt;p&gt;&lt;font color="#000000"&gt;在我们的修改器中 WriteProcessMemory 函数是最重要的部分，而且非常容易出错。不妨让我们再仔细讨论一下它的参数。&lt;br&gt;WriteProcessMemory (ByVal hProcess As Long, ByVal lpBaseAddress As Any, ByVal lpBuffer As Any, ByVal nSize As Long, lpNumberOfBytesWritten As)&lt;br&gt;hProcess 是目标进程的句柄，从上面的 OpenProcess 函数中取得的。&lt;br&gt;lpBaseAddress 是在计算器程序的虚拟内存中将要被修改的地址，也就是使用内存搜索程序找到的那个地址。(在我的程序里是&amp;amp;H40B181)&lt;br&gt;lpBuffer 是将要写如上述地址的数据，可以是一个数值、数组、字符串或其他任何数据类型。&lt;br&gt;nSize 是希望写入 lpBaseAddress 的字节数。这个位置应该与你的数据类型相符。如果写入的是一个长整数( long )，这里应该是4。如果写入的是一个字符串，那么这里应该是字符串的长度。&lt;br&gt;lpNumberOfBytesWritten 是函数执行返回后，写入目标地址的实际字节数。它能被用来确认函数实际的执行情况。&lt;/font&gt; 
&lt;p&gt;
&lt;p&gt;&lt;font color="#000000"&gt;把我们的数据放到函数中，得到 WriteProcessMemory pHandle, &amp;amp;H40B181, &amp;quot;Beans&amp;quot;, 5, 0&amp;amp;。我把0传递到 lpNumberOfBytesWritten 位置是因为不需要检查两次实际写入的字节数。&lt;/font&gt;
&lt;p&gt;&lt;font color="#000000"&gt;最后通过传递进程句柄给 CloseHandle() 函数来关闭由 OpenProcess 打开的句柄。&lt;br&gt;CloseHandle hProcess&lt;/font&gt;
&lt;p&gt;&lt;font color="#000000"&gt;现在将所有的代码输入我们的编辑器中。双击按钮，显示它的代码编辑窗口。代码应该加到名为 btnPasteName 的 Click 事件中。(不必输入注释)&lt;br&gt;Private Sub btnPasteName_Click()&lt;br&gt;' 声明一些需要的变量&lt;br&gt;Dim hwnd As Long ' 储存 FindWindow 函数返回的句柄&lt;br&gt;Dim pid As Long ' 储存进程标识符( Process Id )&lt;br&gt;Dim pHandle As Long ' 储存进程句柄&lt;/font&gt;
&lt;p&gt;&lt;font color="#000000"&gt;' 首先取得目标窗口的句柄&lt;br&gt;hwnd = FindWindow(vbNullString, &amp;quot;Calculator&amp;quot;)&lt;br&gt;If (hwnd = 0) Then&lt;br&gt;MsgBox &amp;quot;Window not found!&amp;quot;&lt;br&gt;Exit Sub&lt;br&gt;End If&lt;/font&gt;
&lt;p&gt;&lt;font color="#000000"&gt;' 取得进程标识符&lt;br&gt;GetWindowThreadProcessId hwnd, pid&lt;/font&gt;
&lt;p&gt;&lt;font color="#000000"&gt;' 使用进程标识符取得进程句柄&lt;br&gt;pHandle = OpenProcess(PROCESS_ALL_ACCESS, False, pid)&lt;br&gt;If (pHandle = 0) Then&lt;br&gt;MsgBox &amp;quot;Couldn't get a process handle!&amp;quot;&lt;br&gt;Exit Sub&lt;br&gt;End If&lt;/font&gt;
&lt;p&gt;&lt;font color="#000000"&gt;' 在内存地址中写入名字&lt;br&gt;WriteProcessMemory pHandle, &amp;amp;H40B181, &amp;quot;Beans&amp;quot;, 5, 0&amp;amp;&lt;/font&gt;
&lt;p&gt;&lt;font color="#000000"&gt;' 关闭进程句柄&lt;br&gt;CloseHandle hProcess&lt;br&gt;End Sub&lt;/font&gt;
&lt;p&gt;&lt;font color="#000000"&gt;完毕。现在单击按钮将使计算器窗口文本变为我们键如的名字。(可能需要最小化计算器程序，再还原，以便程序更新显示)&lt;/font&gt;
&lt;p&gt;&lt;font color="#000000"&gt;下面将给我们的修改器增加一个新功能。我们将检测计算器程序的窗口显示数据，并在修改器中显示。双击计时器，显示它的代码编辑窗口，然后输入以下代码： &lt;br&gt;Private Sub ReadTimer_Timer()&lt;br&gt;' 声明变量&lt;br&gt;Dim hwnd As Long ' 储存 FindWindow 函数返回的句柄&lt;br&gt;Dim pid As Long ' 储存进程标识符&lt;br&gt;Dim pHandle As Long ' 储存进程句柄&lt;br&gt;Dim str As String * 20 ' 存储显示文本&lt;/font&gt;
&lt;p&gt;&lt;font color="#000000"&gt;' 取得目标窗口的句柄&lt;br&gt;hwnd = FindWindow(vbNullString, &amp;quot;Calculator&amp;quot;)&lt;br&gt;If (hwnd = 0) Then Exit Sub&lt;/font&gt;
&lt;p&gt;&lt;font color="#000000"&gt;' 取得进程标识符&lt;br&gt;GetWindowThreadProcessId hwnd, pid&lt;/font&gt;
&lt;p&gt;&lt;font color="#000000"&gt;' 取得进程句柄&lt;br&gt;pHandle = OpenProcess(PROCESS_ALL_ACCESS, False, pid)&lt;br&gt;If (pHandle = 0) Then Exit Sub&lt;/font&gt;
&lt;p&gt;&lt;font color="#000000"&gt;' 读取内存数据&lt;br&gt;ReadProcessMemory pHandle, &amp;amp;H40B181, str, 20, 0&amp;amp;&lt;/font&gt;
&lt;p&gt;&lt;font color="#000000"&gt;' 在文本框显示&lt;br&gt;txtDisplay = str&lt;/font&gt;
&lt;p&gt;&lt;font color="#000000"&gt;' 关闭进程句柄&lt;br&gt;CloseHandle hProcess&lt;br&gt;End Sub&lt;/font&gt;
&lt;p&gt;&lt;font color="#000000"&gt;在这里出现的新东西是 ReadProcessMemory 函数。从 &amp;amp;H40B181 地址中读出的数据被存入变量 str 中，然后显示在名为 txtDisplay 的文本框中。&lt;/font&gt;
&lt;p&gt;&lt;font color="#000000"&gt;本教程中所讲的是非常简单的东西，主要是想起抛砖引玉的目的。最重要的是不断学习，不断实践，了解其他的API并在修改器中使用。练习越多，就会觉得越容易。&lt;/font&gt;&lt;/div&gt;&lt;img src="http://c.services.spaces.live.com/CollectionWebService/c.gif?cid=-3393211484310952491&amp;page=RSS%3a+%e7%94%a8VB%e5%88%b6%e4%bd%9c%e4%bf%ae%e6%94%b9%e5%99%a8%e6%95%99%e7%a8%8b%5b%e8%bd%ac%5d&amp;referrer=" width="1px" height="1px" border="0" alt=""&gt;&lt;img style="position:absolute" alt="" width="0px" height="0px" src="http://c.live.com/c.gif?NC=31263&amp;amp;NA=1149&amp;amp;PI=73329&amp;amp;RF=&amp;amp;DI=3919&amp;amp;PS=85545&amp;amp;TP=skywolfstudio.spaces.live.com&amp;amp;GT1=skywolfstudio"&gt;</description><category>编程开发</category><comments>http://skywolfstudio.spaces.live.com/Blog/cns!D0E8E4220DDEA5D5!1107.entry#comment</comments><guid isPermaLink="true">http://skywolfstudio.spaces.live.com/Blog/cns!D0E8E4220DDEA5D5!1107.entry</guid><pubDate>Wed, 16 Apr 2008 04:46:54 GMT</pubDate><slash:comments>0</slash:comments><msn:type>blogentry</msn:type><live:type>blogentry</live:type><live:typelabel>Blog entry</live:typelabel><wfw:commentRss>http://skywolfstudio.spaces.live.com/blog/cns!D0E8E4220DDEA5D5!1107/comments/feed.rss</wfw:commentRss><wfw:comment>http://skywolfstudio.spaces.live.com/Blog/cns!D0E8E4220DDEA5D5!1107.entry#comment</wfw:comment><dcterms:modified>2008-04-16T04:46:54Z</dcterms:modified></item><item><title>利用HOOK拦截封包原理[转]</title><link>http://skywolfstudio.spaces.live.com/Blog/cns!D0E8E4220DDEA5D5!1106.entry</link><description>&lt;div&gt;截获API是个很有用的东西，比如你想分析一下别人的程序是怎样工作的。这里我介绍一下一种我自己试验通过的方法。 &lt;br&gt;首先，我们必须设法把自己的代码放到目标程序的进程空间里去。Windows H