<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet type="text/xsl" href="http://feeds.qzone.qq.com/rss.xsl" version="1.0"?>
<rss version="2.0" xmlns:qz="http://qzone.qq.com">
<channel>
<title><![CDATA[phoenixyt]]></title>
<description><![CDATA[ 浩瀚深邃的神秘]]></description>
<link>http://37483424.qzone.qq.com</link>
<lastBuildDate>Sun, 29 Nov 2009 18:31:05 GMT</lastBuildDate>
<generator>Qzone</generator>
<language>zh-cn</language>
<copyright>Copyright (C), 2005-2008, Tencent Tech. Co., Ltd.</copyright>
<pubDate>Wed, 18 Nov 2009 09:08:42 GMT</pubDate>

<item>
<title><![CDATA[睡五分钟等于六钟头的方法(熬夜必看)]]></title>
<link>http://37483424.qzone.qq.com/blog/1258535322</link>
<description><![CDATA[　　熬夜是很正常的事,但经常熬夜对身体会产生很坏的影响,无意中看到这篇文章,转载过来,或许对经常熬夜的诸位会有所帮助。<br>睡觉的诀窍 　　<br>　　根据医学和我的体验、观察，一个人真正睡着觉最多只有两个钟头，其余都是浪费时间，躺在枕头上做梦，没有哪个人不做梦。至于醒来觉得自己没有做梦，那是因为他忘记了。<br>　　通常一个人睡两个钟头就够了，为什么有人要睡七、八个钟头?那是你赖床躺在枕头上休息的习惯养成的，并非我们需要那么久的睡眠时间，尤其打坐做功夫的人晓得，正午只要闭眼真正睡着三分钟，等于睡两个钟头，不过要对好正午的时间。夜晚则要在正子时睡着，五分钟等于六个钟头。<br>　　就这个时间的学问又大了，同宇宙法则、地球法则、易经阴阳的道理有关系，而且你会感觉到，心脏下面硬是有一股力量降下来，与丹田(肾上)的力量融合，所谓&quot;水火既济&quot;，豁然一下，那你睡眠够了，精神百倍。 <br>　　所以失眠或真要夜里熬夜的人，正子时的时刻，哪怕二十分钟也一定要睡，睡不着也要训练自己睡着。 <br>　　过了正子时大约十二点半以后，你不会想睡了，这很糟糕。更严重的，到了天快亮，四、五点钟，五、六点卯时的时候，你又困得想睡，这时如果一睡，一天都会昏头。 <br>　　所以想从事熬夜工作的人，正子时，即使有天大的事也要摆下来，睡它半小时，到了卯时想睡觉千万不要睡，那一天精神就够了。 <br>　　不过失眠的人都挨过十二点，在床上翻来覆去睡不着，结果快天亮睡着了，到第二天下午都昏头昏脑，因此你会感觉失眠、睡眠不足，实际上是你没有经验。 <br>　 <br>睡眠与养生 <br>　　<br>　　一、睡眠的规则 <br>　　<br>　　战国时名医文挚对齐威王说：&quot;我的养生之道把睡眠放在头等位置，人和动物只有睡眠才生长，睡眠帮助脾胃消化食物，所以，所以睡眠是养生的第一大补，人一个晚上不睡觉，其损失一百天也难以恢复。&quot; 　　<br>　　晚21点到凌晨5点为有效睡眠时间。人是动物，和植物同属于生物，白天(凌晨5点到晚上21点)活动产生能量，晚上(21点到凌晨5点)开始进行细胞分裂，把能量转化为新生的细胞，是人体细胞休养生息、推陈出新的时间，也是人随着地球旋转到背向太阳的一面。阴主静，是人睡眠的良辰，此时休息，才会有良好的身体和精神状态。这和睡觉多的婴儿长得胖、长得快，而爱闹觉的孩子发育不良是一样的道理。 <br>　　睡觉是养生的一大功能，养就是用大量的健康细胞去取代腐败的细胞，如一夜睡不着就换不了新细胞。如果说白天消亡一百万个细胞，一晚上只补回来五十万个细胞，这时你的身体就会出现亏空，时间长了，人就糠了，像糠萝卜似的。为什么世上有百岁老人呢?因为他们每晚都在21点钟准时睡觉。 <br>　　植物吸收阳光的能量，夜里生长，所以夜晚在农村的庄稼地里可听到拔节的声音。人类和植物同属于生物，细胞分裂的时间段大致相同，错过夜里睡觉的良辰，细胞的新生远赶不上消亡，人就会过早的衰老或患病，人要顺其自然，就应跟着太阳走，即天醒我醒，天睡我睡。人在太阳面前小如微尘，&quot;与太阳对着干&quot;是愚蠢的选择，迟早会被太阳巨大的引力催垮。这是客观真理。 <br>　　现实生活中，不少人有入睡难，睡眠质量不高的毛病。睡眠不好是一个综合性的问题，如肝火过盛，睡觉警觉;胃火过剩，睡觉不安;肝阴不足，睡觉劳累。 <br>　　<br>二、睡眠与疾病 <br>　　现代的生活习惯和生活方式给人们的身体带来了很多负面影响形成&quot;四大病&quot;：水果病、冰箱病、电视电脑病、熬夜病。肝脏有一特点：卧则回血，坐立向外供血。 <br>　　子时(23：00-1：00)，其实23点就是新的一天的开始，并不是0点开始的，这是我们犯的误识。肝胆相表里，互为一家，23点胆经开了，如若不睡，大伤胆气，由于十一脏腑皆取决于胆也，胆气一虚，全身脏腑功能下降，代谢力、免疫力纷纷下降，人体机能大大降低，胆气支持中枢神经，胆气受伤易患各种精神疾病，比如抑郁症、精神分裂症、强迫症、躁动症等。子时胆要更换胆汁，胆经渐旺人如不卧，胆汁更替不利，过浓而结晶成石，久之即得胆结石，如果把胆给摘了，一摘就胆怯了，全身的免疫力下降了50%以上，所以不能摘，要用它本系统的巨大潜能把它化掉。 <br>　　丑时肝经最旺，丑时(1：00-3：00)不眠，肝无法解除掉有毒之物，产生新鲜血液，因藏血不利，面呈青色，久之易患各类肝病，现在有些人肝不太好，特别在欧洲平均4个人就有一个大三阳或是小三阳，大都是因为违反自然规律过了子时不睡觉造成的。甲肝比较好治，乙肝就很难治。乙肝病毒携带者，是由于晚上经常不睡觉，人太虚弱了，也就是说秩序太乱了，病毒已经到了细胞里了。也就是说乙肝的病毒已经到了细胞里面，但是现在它还没有能力造成肝炎，当人身体处于最薄弱的时候就形成成肝炎，乙型肝炎就意味着将来40%--60%的肝硬化。聪明的人是应该了解天、地、人之间的关系，不聪明的人就是应该被淘汰的人。 <br>垃圾睡眠给肝脏带来多大伤害？ <br>　　肝主疏泄，过子时不睡，可引起肝疏泄不利，肝气郁结，可见易怒，头痛头晕，眼红，眼痛，耳鸣，耳聋，胸肋胀痛，女性月经不调，便秘，也可引起肝气升发不足，人会目倦神疲，腰膝酸软，晕眩，失眠，惊悸，精神恍惚，重则会晕倒在大街上，不省人事。 <br>　　肝有藏血、调节血液的功能，过子时不睡，会造成肝血不足，还会引起吐血、流鼻血、皮下出血、牙龈出血、眼底出血、耳出血等出血证状。 <br>　　肝开窍于目，过子时不睡，易引起肝虚，则出现视力模糊、老花、夜盲、畏光、迎风流泪，等症状，还会形成青光眼、白内障、眼底动脉硬化、视网膜病变等眼疾。 <br>　　肝主筋，其华在爪，过子时不睡觉，会引起肝血不足，就出现筋痛，麻木，屈伸困难，痉挛抽搐，易造成灰指甲，缺钙，髌骨软化，癫痫病，骨质疏松等症。 <br>　　肝与心，过子时不睡觉，可引起肝血不足，由于心主一身之血脉，肝有储藏和调节血液的功能，会造成心脏供血不足，引起心慌、心颤等症状，严重的形成心脏病、高血压等心脑血管疾病。 <br>　　肝与脾，过子时不睡觉，会引起肝胃不和，由于肝助脾胃消化，由于肝气太虚不能助脾胃消化，使人脾胃消化功能不好，表现为舌苔厚，长期以来会造成中气塌陷。 <br>　　肝与肺，过子时不睡觉，无法滋阴潜阳，肝阴亏损，引起肝火过盛灼肺，出现干咳、或咳嗽、咳痰血等木火刑金的证状，易导致牛皮癣等各种皮肤病。 <br>　　肝与肾，过子时不睡觉，肝虚导致肾亏，由于肝肾同源，容易造成生殖系统疾病、不育、骨病、牙病、脱发、糖尿病、肾衰竭等疾病。 <br>　　三、睡眠的方法 <br>　　交通规则--你不懂就容易出事故。比如说，23点至凌晨3点为子丑时，胆肝经最活跃的时候，肝胆要回血，&quot;躺下去回血，站起来供血&quot;。如果你每晚22点钟左右躺下，静静得不要说话，到23点的时候，也就睡着了。肝胆开始回血，把有毒的血过滤掉，产生新鲜的血液，到一百岁也没有胆结石，也没有肝炎、囊肿一类的病。如果你天天熬夜到1点多，肝回不了血，有毒的血排不掉，新鲜的血生不成，胆又无法换胆汁，所以这些人容易得胆结石、囊肿、大三阳、小三阳各种病症。 <br>　　在欧洲地区，平均四个人就有一个肝炎病毒携带者，这就叫不懂规则。睡前半小时最好不要讲话，睡觉的时候更不要说话，如一说话，肺经动，然后心经又动，(因为心肺共为上焦)人就容易进入兴奋状态，所以就很难入睡。 <br>　　21：00-23：00为亥时。亥时三焦经旺，三焦通百脉。亥时入眠，百脉皆得濡养，故百岁老人得共同特点即21：00(亥时)之前入睡。女性若想长久的保持容颜娇好，应做到早睡早期。 <br>　　睡觉要关窗，不能开风扇、不能开空调，人生病很多都与此有关，因为人在睡眠之中，气血流通缓慢，体温下降，人体会在表面形成一种阳气层，这种阳气层它使人叫&quot;鬼魅不侵&quot;，什么意思呢，阳气足的人，不做恶梦，就是这种阳气，占了上风。开空调，开风扇，情况就不一样了，开窗户，窗户走的是风，风入的是筋，如果开空调，也有风，风入筋，寒入骨，早上起来，身上发黄，脸发黄，脖子后面那条筋发硬，骨节酸痛，甚至有人就开始发烧，这就是风和寒侵入到了筋和骨头里的缘故，这也就是气受伤了。如果说晚上睡觉不开窗，不开空调，不开风扇，连房门也关上，效果最好，如果热，把房门打开，把窗户关上，效果就差了一点，但是他不至于第二天早上起来浑身乏力，后背僵硬. <br>　　有人把客厅的空调开开了，把卧室的门打开，和直接开空调睡觉是差不多的，开了空调以后，空调那个寒进了骨了，所以心里发冷，心在哪，心在脑髓，脑为髓之海，骨髓里有寒，那肯定心里就寒了，怎么办，补肾阳、补中气，什么时候补到心里不冷，烧就退了，寒走出去了。 <br>　　睡觉要尽量早睡，睡得晚，伤了少阳之气，必然第二天是疲倦无力，要关上窗户，不开空调、电扇，保护阳气。 <br>　　肝胆在下焦，如果胃出现问题的时候，他就会出现寝睡不安，一个是胃寒，如果这个人胃阳本来就不足，过多的喝绿茶，就会出现胃寒，胃寒的时候人是睡不好觉的，或者吃带泥沙之物过多，胃隐隐作寒，肯定是睡不好; <br>　　再一个是胃热，就是热气往上走，嘴里喘的都是热气，像这种情况也睡不好觉;再一个是胃燥，口干舌燥，胃里感觉到燥; <br>　　还有一个就是胃厚，气味的味，胃厚，这种情况就是吃了这种厚腻的味道，有人吃海鲜、吃鱼、吃炖鸡，味道好鲜美，吃多了，美味不可多用，这些东西在里面要稀释它，不稀释它，它在里面味太厚了，所以这个也睡不好觉; <br>　　再一个腹涨，腹是涨鼓鼓的，也睡不着，翻来覆去也睡不着;再一个是胃气太虚，冒冷汗，这也睡不好觉，这些原因都可能形成胃不宁，胃不宁就睡不好。 <br>　　睡觉时要肢暖，四肢要暖，因为四肢是阳之本，这个大家都知道了，四肢不暖，肯定是肾阳不足，应该在睡觉之前把手脚捂暖，手脚和肚脐、背后的命门都要盖好。 <br>　　<br>睡眠法因人而异，下面介绍3种做法： <br>　　1、睡觉前简单的压腿，然后在床上自然盘坐，两手重叠放于腿上，自然呼吸，感觉全身毛孔随呼吸一张一合，若能流泪打哈欠效果最佳，到了想睡觉时倒下便睡。 <br>　　2、仰卧，自然呼吸，感觉呼吸像春风，先融化大脚趾，然后是其他脚趾，接着脚、小腿、大腿逐渐融化。如还未醒着，再从头做。 <br>　　3、入睡快的人可右侧卧，右手掌托右耳。右掌心为火，耳为水，二者形成水火即济，在人体中形成心肾相交。久之，养心滋肾。 <br>　　睡眠一定要早起，即使在冬天，也不可超过6点起床，春夏秋季尽量在5点之前起床，因为人在寅时(3点-5点)肺经旺的时候起床，能够使肺气得以舒展，以顺应阳气的舒长，来完成新陈代谢，肃降浊气，使肺气清，这样有助于养肺和顺应太阳的天势升起人体阳气，使人一天阳气充足，否则，就好像发动机，过了这段好时机就很难发动人体阳气，人体阳气淤积在人体下部不能由命门向上发动升起，会形成淫气，严重损害人的身心健康。 <br>　　早晨5点至7点是人体大肠经最旺的时候，人体需要把代谢的浊物排出体外，此时如果不起床，大肠得不到充分活动，无法很好的完成排浊功能，使浊物停留而形成毒素，危害人体血液和脏腑百骸。早晨7点到9点人体胃经最旺，9点到11点人体脾经最旺，这时人的消化吸收运化的能力最好，如果这时还不起床，人体胃酸会严重腐蚀胃粘膜，人体在最佳吸收营养时间得不到营养，长期以来会患脾胃疾病，造成营养不良、中气塌陷。所以千万不要赖床，赖床会造成头昏、疲惫不堪、睡眠不足的感觉，而应按时起床，历史上许多伟人都是有三四点钟起床的习惯，比如华盛顿、拿破仑、康熙皇帝、曾国藩等。另外早起能增加工作效益，俗话说：&quot;三天早起，一天工&quot;。 <br>　　现代医学证明，早睡早起的人精神压力较小，不易患精神类疾病。早晨不要太早出去锻炼，因为早晨在太阳没有出来之前，地下道的漳气、浊气正往上走(尤其是城市)，这些气对人体损伤是很严重的。 <br>　　养身三大事，一睡眠，二便利，三饮食，其余起居、服装等皆是辅助。 <br>　　三事中睡眠第一。然胃纳不和者，夜眠不安，故以通便利为第二。而饮食无节，饥饱过度者，肠胃必受伤，而营养日减。睡以安神为主，神以心安为主，应配合年龄，壮年至多七小时至八小时，多睡则智昏头晕眼红胀，四肢疲软，童年必睡足八小时，或过九小时勿碍，老或病人至多六小时已足。<br>睡眠中不可忽视的疾病警告 <br>应注意： <br>　　(一)睡眠宜早，勿过十时，老年人以八点为正，勿过九点。凡交十一时，为阳生时，属肾，此时失眠，肾水必亏，心肾相连，水亏则火旺，最易伤神。千万勿以安眠药片助睡。 <br>　　(二)枕上切忌思索计算未来事，睡时宜一切不思，鼻息调匀，自己静听其气，由粗而细，由细而微细而息。视此身如无物，或如糖入于水，化为乌有，自然睡着。 <br>　　(三)如有思想，不能安着，切勿在枕上转侧思虑，此最耗神，可坐起一时再睡。 <br>　　(四)如在午时，即上午十一点至一点，为阴生之时，属心，此时如不能睡，可静坐一刻钟，闭目养神，则心气强。凡有心脏病者切宜注意，每日于此二时注意，则元气日强，无心跳腹泄或小便频速之病。 <br>　　(五)夏日起宜早，冬日起宜迟。居北方宜防寒气，如在粤桂等省，早起防山岚瘴气中病。食后勿仰天睡，早起如在寅时三点至五点，此时切忌郁怒，必损肺伤肝，万望注意。 <!--v:3.2--> ]]></description>
<category><![CDATA[网杂]]></category>
<author><![CDATA[37483424@qq.com(phoenixyt)]]></author>
<comments>http://37483424.qzone.qq.com/blog/1258535322#comment</comments>
<qz:effect>134218240</qz:effect>
<pubDate>Wed, 18 Nov 2009 09:08:42 GMT</pubDate>
<guid>http://37483424.qzone.qq.com/blog/1258535322</guid>
</item>

<item>
<title><![CDATA[详解OD脚本的写法续之进阶篇（转自ximo）]]></title>
<link>http://37483424.qzone.qq.com/blog/1258122262</link>
<description><![CDATA[昨天给大家写了简单壳的脚本的写法，相信大家对一些简单壳都已经学会自己去写脚本了，至少已经能看懂脚本了吧。<br>好，今天就继续给大家讲稍微难点的壳的脚本的写法，希望大家能好好掌握。前提是，你已经看了昨天的基础篇，并已经学会写一些简单的脚本。<br>废话不多说，开始今天的内容。<br>首先来个稍微简单点的壳的脚本的写法：MoleBox 2.x的壳<br>当然，我们首先还是来手脱一下这个壳。所以说，写脚本的前提是你已经学会了手脱这个壳，并且掌握了这个壳的一些脱壳的规律。<br>00596BD3 &gt; E8 00000000     call Notepad.00596BD8              //载入到这，F8，2次<br>00596BD8    60              pushad                 <br>00596BD9    E8 4F000000     call Notepad.00596C2D              //2次后来到这，在ESP处下硬件访问断点<br>00596BDE    0D 76CC70B0     or eax,B070CC76<br>00596BE3 ^ EB 81           jmp short Notepad.00596B66<br>00596BE5    6F              outs dx,dword ptr es:[edi]<br>00596BE6    37              aaa<br>00596BE7    04 57           add al,57<br>先不要着急着运行，由于我们知道这个壳对IAT有加密，所以，我们再去OEP之前，首先得处理下IAT。<br>于是我们下断点：bp VirtualProtect，SHIFT+F9，中断后，取消断点，并ALT+F9返回<br>然后我们查找 89 01<br>然后把它NOP掉<br>因为我们知道，只要NOP掉这一句后，即可跳过壳对IAT的加密。<br>PS：具体的请参看脱这壳的相关文章，这里不再赘述！<br>处理完后，我们就F9运行<br>005967B1    58              pop eax                                //来到这，F8走<br>005967B2    58              pop eax<br>005967B3    FFD0            call eax                               //走到这里后，F7进去，就来到了OEP！<br>005967B5    E8 F5CB0000     call Notepad.005A33AF<br>005967BA    CC              int3<br>005967BB    CC              int3<br><br>004A2ADC    E8 B6A40000     call Notepad.004ACF97                 //OEP！<br>004A2AE1 ^ E9 16FEFFFF     jmp Notepad.004A28FC<br>004A2AE6    CC              int3<br>004A2AE7    CC              int3<br>004A2AE8    CC              int3<br>004A2AE9    CC              int3<br>004A2AEA    CC              int3<br>004A2AEB    CC              int3<br>004A2AEC    CC              int3<br>004A2AED    CC              int3<br>004A2AEE    CC              int3<br>004A2AEF    CC              int3<br>根据上面的流程，我们就可以开始写脱壳的脚本了！<br>---------------------------------------------------------------------------------------------------------<br>////////////////////////////////////////////////////////////<br>/// MoleBox v2.X 脱壳脚本                                ///<br>/// by 徐超(ximo) QQ:178911980                           ///<br>/// <a href="http://www.54soft.com.cn/" target="_blank">http://www.54soft.com.cn</a><wbr />                             ///<br>///    <a href="http://www.52pojie.net/" target="_blank">http://www.52pojie.net</a><wbr />                               ///<br>///                                                      ///<br>///                             2008.7.26                ///<br>////////////////////////////////////////////////////////////<br>var addr                                             //定义一个变量，用来放ESP的值<br>sto<br>sto                                                  //单步2次<br>mov addr,esp                                         //把ESP的值，放变量addr中    <br>bphws addr,&quot;r&quot;                                       //下硬件访问断点<br><br>/*接着来处理IAT*/               <br><br>gpa &quot;VirtualProtect&quot;,&quot;kernel32.dll&quot;                  //查找特征API，并把查找到的地址放RESULT中<br>bp $RESULT                                           //对找到的地址处，下F2断点，也就是BP<br>run                                                  //运行<br>bc $RESULT                                           //取消断点<br>rtu                                                  //ALT+F9返回<br><br>/*返回后，找特征加密语句，处理IAT的加密*/<br><br>find eip,#8901#                                      //查找特征加密语句                  <br>bp $RESULT                                           //对返回的地址处F2下断<br>run                                                  //运行到该处<br>bc $RESULT                                           //取消断点<br>repl eip, #8901#, #9090#, 10                         //把加密语句NOP掉，即替换为9090<br><br>/*下面就去OEP了*/ <br><br>run                                                  //由于刚才已经下好了硬件断点，现在只要运行即可<br>bphwc addr                                           //取消断点<br>sto<br>sto                                                  //单步走2次<br>sti                                                  //F7跟进，就来到了OEP了<br>cmt eip,&quot;这里就是OEP！&quot;                              //在EIP处，也就是现在OD停留了位置加注释<br>MSG &quot;感谢使用此脚本，现在可以脱壳了&quot;                 //加个对话框，给出一些提示信息<br>ret                                                  //结束脚本<br><br>---------------------------------------------------------------------------------------------------------<br>OK，这个脚本就顺利写完了。去试下效果吧，哈，一切OK！ <!--v:3.2--> ]]></description>
<category><![CDATA[壳]]></category>
<author><![CDATA[37483424@qq.com(phoenixyt)]]></author>
<comments>http://37483424.qzone.qq.com/blog/1258122262#comment</comments>
<qz:effect>134218240</qz:effect>
<pubDate>Fri, 13 Nov 2009 14:24:22 GMT</pubDate>
<guid>http://37483424.qzone.qq.com/blog/1258122262</guid>
</item>

<item>
<title><![CDATA[OD脚本编写（转载）]]></title>
<link>http://37483424.qzone.qq.com/blog/1258118841</link>
<description><![CDATA[大家都知道，好多壳，尤其是一些常见的比较简单的壳，一般都有相应的脱壳脚本，方便我们进行脱壳。但是，如果壳稍微有点变异呢？那么，一些脱壳脚本就无能为力了。所以，好多人都想学习自己写脚本，至少能读懂脚本，这种读脚本的能力也是相当有必要的。鉴于写脚本的教程不是很多，于是，今天抽空给大家写个详细点的教程。当然只是抛砖引玉，毕竟，本人也是菜鸟，写脚本的能力实在有限。 <br>我首先用一个最最简单的ASPack壳为例子，来进行讲解！ <br>我们先来脱一下这个壳吧： <br>方法一： <br>00430001 &gt;60pushad //入口点，F8 <br>00430002E8 03000000 call QQ个性网.0043000A //到这后，用ESP定律，下硬件访问断点 <br>00430007- E9 EB045D45 jmp 45A004F7 <br>0043000C55push ebp <br>0043000DC3retn <br>0043000EE8 01000000 call QQ个性网.00430014 <br>00430013EB 5D jmp short QQ个性网.00430072 <br>00430015BB EDFFFFFF mov ebx,-13 <br>0043001A03DDadd ebx,ebp <br>0043001C81EB 00000300 sub ebx,30000 <br>0043002283BD 22040000 0&gt;cmp dword ptr ss:[ebp+422],0 <br>00430029899D 22040000 mov dword ptr ss:[ebp+422],ebx <br>0043002F0F85 65030000 jnz QQ个性网.0043039A <br>004300358D85 2E040000 lea eax,dword ptr ss:[ebp+42E] <br> <br>下完硬件断点后，F9运行，来到这 <br>004303B0 /75 08 jnz short QQ个性网.004303BA //来到这。接着F8 <br>004303B2 |B8 01000000 mov eax,1 <br>004303B7 |C2 0C00 retn 0C <br>004303BA \68 D4124000 push QQ个性网.004012D4; //来到这，接着F8 <br>004303BFC3retn//到这，接着F8 <br>004303C08B85 26040000 mov eax,dword ptr ss:[ebp+426] <br>004303C68D8D 3B040000 lea ecx,dword ptr ss:[ebp+43B] <br>004303CC51push ecx <br>004303CD50push eax <br>004303CEFF95 490F0000 call dword ptr ss:[ebp+F49] <br>OK，这就来到OEP了！ <br>004012D468 54474000 push QQ个性网.00404754; 这里就是OEP了！ <br>004012D9E8 F0FFFFFF call QQ个性网.004012CE; jmp 到 <br>004012DE0000add byte ptr ds:[eax],al <br>004012E00000add byte ptr ds:[eax],al <br>004012E20000add byte ptr ds:[eax],al <br>004012E43000xor byte ptr ds:[eax],al <br>004012E60000add byte ptr ds:[eax],al <br>004012E848dec eax <br>004012E90000add byte ptr ds:[eax],al <br>004012EB0000add byte ptr ds:[eax],al <br>好的，我们来总结一下吧： <br>1、单步F8 <br>2、记录ESP的地址 <br>3、在ESP的地址处，下硬件访问断点 <br>4、接着运行 <br>5、删除硬件断点 <br>6、单步走3次 <br>7、就来到OEP了！ <br>有了这个流程，我们就可以开始写脱壳脚本了，可以这么写： <br>var addr//定义一个变量addr <br>sto //单步，也就是F8 <br>mov addr,esp //把此处ESP的地址给变量addr <br>bphws addr,&quot;r&quot;//下硬件读取断点，也就是硬件访问断点 <br>run//运行，也就是F9 <br>BPHWC addr //取消断点 <br>sto //单步，也就是F8，第1次 <br>sto //单步，也就是F8，第2次 <br>sto //单步，也就是F8，第3次 <br>cmt eip,&quot;这里就是OEP！&quot;//在EIP处，也就是现在OD停留了位置加注释 <br>MSG &quot;感谢使用此脚本，现在可以脱壳了&quot;//加个对话框，给出一些提示信息 <br>ret//结束脚本 <br>--------------------------------------------------------------------------------------------------------- <br>OK，脚本就这么写完了，相信大家都应该明白了吧。下面接着来方法二！ <br>方法二： <br>由于是ASPack的壳，所以，我们直接来查找关键代码&quot;popad&quot;，写就是&quot;61&quot; <br>004303AF61popad//查找到这里，在这里下断，为了防止检测，直接下硬件断点，中断后就F8走吧 <br>004303B075 08 jnz short QQ个性网.004303BA//继续F8 <br>004303B2B8 01000000 mov eax,1 <br>004303B7C2 0C00 retn 0C <br>004303BA68 00000000 push 0   //F8 <br>004303BFC3retn   //F8 <br>004303C08B85 26040000 mov eax,dword ptr ss:[ebp+426] <br>004303C68D8D 3B040000 lea ecx,dword ptr ss:[ebp+43B] <br>OK，又来到OEP了！ <br>004012D468 54474000 push QQ个性网.00404754; 这里就是OEP了！ <br>004012D9E8 F0FFFFFF call QQ个性网.004012CE; jmp 到 <br>004012DE0000add byte ptr ds:[eax],al <br>004012E00000add byte ptr ds:[eax],al <br>004012E20000add byte ptr ds:[eax],al <br>004012E43000xor byte ptr ds:[eax],al <br>004012E60000add byte ptr ds:[eax],al <br>004012E848dec eax <br>004012E90000add byte ptr ds:[eax],al <br>004012EB0000add byte ptr ds:[eax],al <br>好，我们接着来总结一下： <br>1、查找16进制数&quot;61&quot;，写就是&quot;popad&quot; <br>2、返回一个查找到的地址 <br>3、在查找到的地方下断点 <br>4、运行 <br>5、取消断点 <br>6、单步4次 <br>7、来到OEP了 <br><br>有了这个流程，我们又可以来写个简单的脚本了，脚本如下： <br>--------------------------------------------------------------------------------------------------------- <br>findop eip, #61# //查找&quot;61&quot;，也就是&quot;popad&quot; <br>bphws $RESULT, &quot;x&quot; //返回查找到的地址，下硬件执行断点 <br>run //运行 <br>bphwc $RESULT //取消断点 <br>sto//单步，也就是F8，第1次 <br>sto//单步，也就是F8，第2次 <br>sto   //单步，也就是F8，第3次 <br>sto//单步，也就是F8，第4次 <br>cmt eip,&quot;这里就是OEP！&quot;//在EIP处，也就是现在OD停留了位置加注释 <br>MSG &quot;感谢使用此脚本，现在可以脱壳了&quot;//加个对话框，给出一些提示信息 <br>ret   //结束脚本 <br>--------------------------------------------------------------------------------------------------------- <br>OK，用方法二写的脚本同样完成了！ <br>对比一下，显然方法二比方法一效率更高，更为通用点！ <br>对ASPack分析后，相信大家对写脚本已经有个大概的了解了吧！ <br>好，我们接着来分析下FSG2.0的脚本的写法 <br>通过前面的一些跟踪，我们可以找到如下的关键处： <br>004001C550push eax <br>004001C6FF53 10 call dword ptr ds:[ebx+10] <br>004001C995xchg eax,ebp <br>004001CA8B07mov eax,dword ptr ds:[edi] <br>004001CC40inc eax <br>004001CD^ 78 F3 js short qqspirit.004001C2 <br>004001CF75 03 jnz short qqspirit.004001D4 <br>004001D1- FF63 0C jmp dword ptr ds:[ebx+C] //这里，就跳向OEP了！我们F8 <br>004001D450push eax <br>来到OEP！ <br>0040A86D55push ebp //OEP <br>0040A86E8BECmov ebp,esp <br>0040A8706A FF push -1 <br>0040A87268 78794200 push qqspirit.00427978 <br>0040A87768 F4E14000 push qqspirit.0040E1F4 <br>0040A87C64:A1 00000000mov eax,dword ptr fs:[0] <br>0040A88250push eax <br>0040A88364:8925 0000000&gt;mov dword ptr fs:[0],esp <br>0040A88A83EC 58 sub esp,58 <br>0040A88D53push ebx <br>0040A88E56push esi <br>0040A88F57push edi <br>0040A8908965 E8 mov dword ptr ss:[ebp-18],esp <br>0040A893FF15 10524200 call dword ptr ds:[425210] ; kernel32.GetVersion <br>0040A89933D2xor edx,edx <br>0040A89B8AD4mov dl,ah <br><br>我们再来总结一下： <br>1、查找特征码&quot;FF630C&quot; <br>2、保险起见，下硬件执行断点 <br>3、取消断点 <br>4、单步F8 <br>5、到达OEP <br>有了上面的总结，又可以来写个简单的脚本了： <br>--------------------------------------------------------------------------------------------------------- <br>findop eip, #FF630C#//查找特征码&quot;FF630C&quot; <br>bphws $RESULT, &quot;x&quot;   //在查找到的地址处，下硬件执行断点 <br>run //运行 <br>bphwc $RESULT //取消断点 <br>sto//单步F8 <br>cmt eip,&quot;这里就是OEP！&quot;//在EIP处，也就是现在OD停留了位置加注释 <br>MSG &quot;感谢使用此脚本，现在可以脱壳了&quot;//加个对话框，给出一些提示信息 <br>ret   //结束脚本 <br>--------------------------------------------------------------------------------------------------------- <br>哈哈，脚本到此就结束了，下面的内容就自己脱壳修复了！ <br>通过上面的讲解，大家也都发现了，其实写脚本并不是想象中的难吧！ <br>大家也可以自己尝试着去写UPX啊，北斗啊等一些常见壳的脚本，来练习练手。 <br>当然，这些都是一些很简单的壳的脚本，至于一些强壳，就得大家好好下点工夫了 <!--v:3.2--> ]]></description>
<category><![CDATA[壳]]></category>
<author><![CDATA[37483424@qq.com(phoenixyt)]]></author>
<comments>http://37483424.qzone.qq.com/blog/1258118841#comment</comments>
<qz:effect>134218240</qz:effect>
<pubDate>Fri, 13 Nov 2009 13:27:21 GMT</pubDate>
<guid>http://37483424.qzone.qq.com/blog/1258118841</guid>
</item>

<item>
<title><![CDATA[C++中函数参数的按值传递和按引用传递]]></title>
<link>http://37483424.qzone.qq.com/blog/1256201069</link>
<description><![CDATA[<br>按值传递<br>Func(int a,int b)<br>{<br>　　a= a+b;<br>　　b=b+2;<br>　　return 0;<br>}<br>调用<br>int _tmain(int argc, _TCHAR* argv[])<br>{<br> 　　int d = 5;<br>　　 int f = 10;<br>　　 testcase0(d, f);<br>　　 cout&lt;&lt;d &lt;&lt;&quot;   &quot;&lt;&lt;f&lt;&lt;endl;    //这里输出5   10<br> 　　getchar();<br> 　　return 0;<br>}<br> <br> <br>按引用传递，参数可以是指针或者取地址的格式<br>Func(int&amp; a, int *b)<br>{<br>　　a =a + *b*2;<br>　　*b = *b + 2;<br>　　return 0;<br>}<br> <br>调用上面的函数<br>int _tmain(int argc, _TCHAR* argv[])<br>{<br> 　　int d = 5;<br>　　 int f = 10;<br>　　 testcase0(d,&amp;f);<br><br>　　 cout&lt;&lt;d &lt;&lt;&quot;   &quot;&lt;&lt;f&lt;&lt;endl;    //这里输出25   12<br> 　　getchar();<br> 　　return 0;<br>}<br>为何会修改了d f的值？请看汇编情况如下：<br>调用Func前，首先b的地址和a的地址被压入堆栈<br> int d = 5;<br>004126AE  mov         dword ptr [d],5 <br> int f = 10;<br>004126B5  mov         dword ptr [f],0Ah <br>Func(d,&amp;f);<br>004126BC  lea         eax,[f] 　　　　　　//注意这里，将f的地址传入eax<br>004126BF  push        eax  <br>004126C0  lea         ecx,[d] 　　　　　 //还是地址传入到ecx<br>004126C3  push        ecx  <br>004126C4  call        testcase0 (4115A0h) <br> <br>然后跳到Func开始执行<br> a =a + *b*2;<br>00411F7E  mov         eax,dword ptr <span style="font-weight:bold"><wbr /> 　　//b的地址<br>00411F81  mov         ecx,dword ptr [eax] 　//取b的内容存入ecx<br>00411F83  mov         edx,dword ptr [a]         //同上<br>00411F86  mov         eax,dword ptr [edx] <br>00411F88  lea         ecx,[eax+ecx*2] 　　　//计算a+*b*2  并将值存入ecx<br>00411F8B  mov         edx,dword ptr [a] 　　//a的地址存入edx<br>00411F8E  mov         dword ptr [edx],ecx 　//关键是这里，计算结果ecx被覆盖到了a的地址，这个地址也就是传入的d的地址，所以执行结束，d的值会改变。<br>  *b = *b + 2;<br>00411F90  mov         eax,dword ptr <span style="font-weight:bold"><wbr /> <br>00411F93  mov         ecx,dword ptr [eax] <br>00411F95  add         ecx,2 <br>00411F98  mov         edx,dword ptr <span style="font-weight:bold"><wbr /> <br>00411F9B  mov         dword ptr [edx],ecx <br> <br>常量引用形式<br>Func(const int&amp; a,const  int *b)<br>{<br>　　int c =a + *b*2;<br>　　int d = *b + 2;<br>　　a = 5;        //这里会报错，因为 a被定义为常量<br>　　return 0;<br>}<br> <br>使用时机<span style="text-decoration:underline;"><wbr /><li style="margin:25px;">如果你想改变被传递的对象，那就按引用传递或者使用指针；例如 void f(X&amp;); 或者 void f(X*); <li style="margin:25px;">如果你并不想改变被传递的对象，但该对象很大，那就按常量引用传递；例如 void f(const X&amp;); <li style="margin:25px;">其它情况则应该按值传递；例如 void f(X); </li></span><wbr /> <!--v:3.2--> ]]></description>
<category><![CDATA[C++语法相关]]></category>
<author><![CDATA[37483424@qq.com(phoenixyt)]]></author>
<comments>http://37483424.qzone.qq.com/blog/1256201069#comment</comments>
<qz:effect>134218240</qz:effect>
<pubDate>Thu, 22 Oct 2009 08:44:29 GMT</pubDate>
<guid>http://37483424.qzone.qq.com/blog/1256201069</guid>
</item>

<item>
<title><![CDATA[C++中的vector使用范例]]></title>
<link>http://37483424.qzone.qq.com/blog/1256181429</link>
<description><![CDATA[<br>1.vector 的数据的存入和输出：<br>#include&lt;stdio.h&gt;<br>#include&lt;vector&gt;<br>#include &lt;iostream&gt;<br>using namespace std;<br>void main()<br>{<br>   int i = 0;<br>    vector&lt;int&gt; v;<br>    for( i = 0; i &lt; 10; i++ )<br>   {<br>             v.push_back( i );//把元素一个一个存入到vector中<br>   }<br>    /* v.clear()*/ 对存入的数据清空<br><br>   for( i = 0; i &lt; v.size(); i++ )//v.size() 表示vector存入元素的个数<br>   {<br>          cout &lt;&lt; v[ i ] &lt;&lt; &quot;  &quot;; //把每个元素显示出来<br>   }<br>   cont &lt;&lt; endl;<br>} <br>注：你也可以用v.begin()和v.end() 来得到vector开始的和结束的元素地址的指针位置。你也可以这样做：<br>vector&lt;int&gt;::iterator iter; /*iterator <span style="line-height:1.8em;">抽象了指针的绝大部分基本特征</span><wbr />*/<br><br>for( iter = v.begin(); iter != v.end(); iter++ ) <br>{<br>    cout &lt;&lt; *iter &lt;&lt; endl;<br>}<br>2. 对于二维vector的定义。<br>1)定义一个10个vector元素，并对每个vector符值1-10。<br>#include&lt;stdio.h&gt;<br>#include&lt;vector&gt;<br>#include &lt;iostream&gt;<br>using namespace std;<br>void main()<br>{<br> int i = 0, j = 0;<br>//定义一个二维的动态数组，有10行，每一行是一个用一个vector存储这一行的数据。<br>所以每一行的长度是可以变化的。之所以用到vector&lt;int&gt;(0)是对vector初始化，否则不能对vector存入元素。<br> vector&lt; vector&lt;int&gt; &gt; Array( 10, vector&lt;int&gt;(0) ); <br>for( j = 0; j &lt; 10; j++ )<br> {<br>  for ( i = 0; i &lt; 9; i++ )<br>  {<br>   Array[ j ].push_back( i );<br>  }<br> }<br> for( j = 0; j &lt; 10; j++ )<br> {<br>  for( i = 0; i &lt; Array[ j ].size(); i++ )<br>  {<br>   cout &lt;&lt; Array[ j ][ i ] &lt;&lt; &quot;  &quot;;<br>  }<br>  cout&lt;&lt; endl;<br> }<br>}<br>2)定义一个行列都是变化的数组。<br>#include&lt;stdio.h&gt;<br>#include&lt;vector&gt;<br>#include &lt;iostream&gt;<br>using namespace std;<br>void main()<br>{<br> int i = 0, j = 0;<br> vector&lt; vector&lt;int&gt; &gt; Array;<br> vector&lt; int &gt; line;<br> for( j = 0; j &lt; 10; j++ )<br> {<br>  Array.push_back( line );//要对每一个vector初始化，否则不能存入元素。<br>  for ( i = 0; i &lt; 9; i++ )<br>  {<br>   Array[ j ].push_back( i );<br>  }<br> }<br> for( j = 0; j &lt; 10; j++ )<br> {<br>  for( i = 0; i &lt; Array[ j ].size(); i++ )<br>  {<br>   cout &lt;&lt; Array[ j ][ i ] &lt;&lt; &quot;  &quot;;<br>  }<br>  cout&lt;&lt; endl;<br> }<br>}<br><br><br><br><br><br><br><br><br><br>使用 vettor erase 指定元素<br><br>#include &quot;iostream&quot;<br>#include &quot;vector&quot;<br><br>using namespace std;<br><br>int   main()<br>{<br>    vector&lt;int&gt;   arr;<br>    arr.push_back(6);<br>    arr.push_back(8);<br>    arr.push_back(3);<br>    arr.push_back(8);<br><br>    for(vector&lt;int&gt;::iterator it=arr.begin(); it!=arr.end(); )<br>    {<br>        if(* it == 8)<br>        {<br>            it = arr.erase(it);<br>        }<br>        else<br>        {<br>            ++it;<br>        }<br>    }<br><br>    cout &lt;&lt; &quot;After remove 8:\n&quot;;<br><br>    for(vector&lt;int&gt;::iterator it = arr.begin(); it &lt; arr.end(); ++it)<br>    {<br>        cout &lt;&lt; * it &lt;&lt; &quot; &quot;;<br>    }<br>    cout &lt;&lt; endl;<br><br>} <!--v:3.2--> ]]></description>
<category><![CDATA[C++语法相关]]></category>
<author><![CDATA[37483424@qq.com(phoenixyt)]]></author>
<comments>http://37483424.qzone.qq.com/blog/1256181429#comment</comments>
<qz:effect>134218240</qz:effect>
<pubDate>Thu, 22 Oct 2009 03:17:09 GMT</pubDate>
<guid>http://37483424.qzone.qq.com/blog/1256181429</guid>
</item>

<item>
<title><![CDATA[c/c++中#include &lt;&gt;与#include&quot;&quot;区别]]></title>
<link>http://37483424.qzone.qq.com/blog/1255858027</link>
<description><![CDATA[<br>&lt;&gt;先去系统目录中找头文件，如果没有在到当前目录下找。所以像标准的头文件 stdio.h、stdlib.h等用这个方法。 <br><br><br>而&quot;&quot;首先在当前目录下寻找，如果找不到，再到系统目录中寻找。 这个用于include自定义的头文件，让系统优先使用当前目录中定义的。 <br><br><br><br>When writing your C program, you can include files in two ways. The first way is to surround the file you want to include with the angled brackets &lt; and &gt;. This method of inclusion tells the preprocessor to look for the file in the predefined default location. <br><br>This predefined default location is often an INCLUDE environment variable that denotes the path to your include files. For instance, given the INCLUDE variable <!--v:3.2--> ]]></description>
<category><![CDATA[C++语法相关]]></category>
<author><![CDATA[37483424@qq.com(phoenixyt)]]></author>
<comments>http://37483424.qzone.qq.com/blog/1255858027#comment</comments>
<qz:effect>134218240</qz:effect>
<pubDate>Sun, 18 Oct 2009 09:27:07 GMT</pubDate>
<guid>http://37483424.qzone.qq.com/blog/1255858027</guid>
</item>

<item>
<title><![CDATA[PE内存地址与文件地址互换]]></title>
<link>http://37483424.qzone.qq.com/blog/1255712229</link>
<description><![CDATA[<br><span style="color:#ffff00;line-height:1.8em;">RVA是相对虚拟地址（Relative Virtual Address）的缩写，顾名思义，它是一个“相对”地址，也可以说是“偏移量”，PE文件的各种数据结构中涉及到地址的字段大部分都是以RVA表示的。<br>准确地说，RVA就是当PE文件被装载到内存中后，某个数据的位置相对于文件头的偏移量。举个例子，如果Windows装载器将一个PE文件装入00400000h处的内存中，而某个节中的某个数据被装入0040xxxxh处，那么这个数据的RVA就是（0040xxxxh-00400000h）＝xxxxh，反过来说，将RVA的值加上文件被装载的基地址，就可以找到数据在内存中的实际地址。<br>PE文件中出现RVA的概念是因为PE的内存映像和磁盘文件映像是不同的，同一数据相对于文件头的偏移量在内存中和在磁盘文件中可能是不同的，为了提高效率，PE文件头中使用的都是内存映像中的偏移量，也就是RVA。从图17.3中也可以得到另一个结论，那就是RVA仅仅是对于处于节中的数据而言的，对于文件头和节表来说无所谓RVA和文件偏移，因为它们在被映射到内存中后不管是大小还是偏移都不会有任何改变。</span><wbr /><br><span style="color:#ffff00;line-height:1.8em;">2、汇编中虚拟地址(VRA)与文件偏移地址(FileOffset)的相互转换:</span><wbr /><br>+---------+---------+---------+---------+---------+---------+<br>|  <span style="color:#008000;line-height:1.8em;">段名称   虚拟地址  虚拟大小  物理地址  物理大小   标志   |</span><wbr /><br>+---------+---------+---------+---------+---------+---------+<br>|  Name     VOffset    VSize    ROffset    RSize      Flags |<br>+---------+---------+---------+---------+---------+---------+<br>|  .text   00001000   00000092  00000400  00000200  60000020|<br>|  .rdata  00002000   000000F6  00000600  00000200  40000040|<br>|  .<span style="color:#0000d0;line-height:1.8em;">data</span><wbr />   00003000   0000018E  00000800  00000200  C0000040|<br>|  .rsrc   00004000   000003A0  00000A00  00000400  C0000040|<br>+---------+---------+---------+---------+---------+---------+<br><span style="color:#008000;line-height:1.8em;">文件虚拟偏移地址和文件物理偏移地址的计算公式如下：</span><wbr /><br><br>&gt;&gt;&gt;&gt;&gt;&gt;&gt;VaToFileOffset(<span style="color:#008000;line-height:1.8em;">虚拟地址转文件偏移地址)</span><wbr /><br><span style="color:#008000;line-height:1.8em;">如VA = 00401000 (虚拟地址)</span><wbr /><br>ImageBase = 00400000 (<span style="color:#008000;line-height:1.8em;">基地址)</span><wbr /><br>VRk = VOffset - ROffset = 00001000 - 00000400 = C00 (<span style="color:#008000;line-height:1.8em;">得出文件虚拟地址和文件物理址之间的VRk值)</span><wbr /><br>FileOffset = VA - ImageBase - VRk = 00401000 - 00400000 - C00 = 400(<span style="color:#008000;line-height:1.8em;">文件物理地址的偏移地址)</span><wbr /><br><br><span style="color:#008000;line-height:1.8em;">如VA = 00401325，则：</span><wbr /><br>FileOffset = VA - ImageBase - VRk = 00401325 - 00400000 - C00 = 725<br><br>&gt;&gt;&gt;&gt;&gt;&gt;FileOffsetToVa(<span style="color:#008000;line-height:1.8em;">文件偏移地址转虚拟地址)</span><wbr /><br><span style="color:#008000;line-height:1.8em;">如FileOffset = 435(文件偏移地址)</span><wbr /><br>VA = FileOffset + ImageBase + VRk = 435 + 00400000 + C00 = 00401035(<span style="color:#008000;line-height:1.8em;">虚拟地址)</span><wbr /> <br><wbr /><a href="http://www.todo.net.cn/tech/uf/200971282144933.gif" target="_blank"><img style="border:0;" src="http://www.todo.net.cn/tech/uf/200971282144933.gif" /></a><wbr />screen.width*0.6) {this.width=screen.width*0.6;this.alt='';this.onmouseover=this.style.cursor='pointer';this.onclick=function(){window.open('/tech/uf/200971282144933.gif')}}&quot; border=0&gt; <!--v:3.2--> ]]></description>
<category><![CDATA[PE结构相关]]></category>
<author><![CDATA[37483424@qq.com(phoenixyt)]]></author>
<comments>http://37483424.qzone.qq.com/blog/1255712229#comment</comments>
<qz:effect>134218241</qz:effect>
<pubDate>Fri, 16 Oct 2009 16:57:09 GMT</pubDate>
<guid>http://37483424.qzone.qq.com/blog/1255712229</guid>
</item>

<item>
<title><![CDATA[string 类的成员函数 c_str()]]></title>
<link>http://37483424.qzone.qq.com/blog/1255695959</link>
<description><![CDATA[<br>const char *c_str();<br>c_str()函数返回一个指向正规C字符串的指针, 内容与本string串相同. <br>这是为了与c语言兼容，在c语言中没有string类型，故必须通过string类对象的成员函数c_str()把string 对象转换成c中的字符串样式。<br>注意：一定要使用strcpy()函数 等来操作方法c_str()返回的指针 <br>比如：最好不要这样: <br>char* c; <br>string s=&quot;1234&quot;; <br>c = s.c_str(); //c最后指向的内容是垃圾，因为s对象被析构，其内容被处理<br><br>应该这样用： <br>char c[20]; <br>string s=&quot;1234&quot;; <br>strcpy(c,s.c_str()); <br>这样才不会出错，c_str()返回的是一个临时指针，不能对其进行操作<br><br>再举个例子<br>c_str() 以 char* 形式传回 string 内含字符串<br>如果一个函数要求char*参数，可以使用c_str()方法： <br>string s = &quot;Hello World!&quot;;<br>printf(&quot;%s&quot;, s.c_str()); //输出 &quot;Hello World!&quot; <!--v:3.2--> ]]></description>
<category><![CDATA[C++语法相关]]></category>
<author><![CDATA[37483424@qq.com(phoenixyt)]]></author>
<comments>http://37483424.qzone.qq.com/blog/1255695959#comment</comments>
<qz:effect>134218240</qz:effect>
<pubDate>Fri, 16 Oct 2009 12:25:59 GMT</pubDate>
<guid>http://37483424.qzone.qq.com/blog/1255695959</guid>
</item>

<item>
<title><![CDATA[#ifndef  ...  #define  #endif  意义]]></title>
<link>http://37483424.qzone.qq.com/blog/1255594203</link>
<description><![CDATA[<br><span style="font-weight:bold"><wbr />#ifndef x<br></span><wbr /><br><br>　　<span style="font-weight:bold"><wbr />#define x <br><br><br>　　...<br><br><br>　　#endif</span><wbr /><br><br><br>　　这是宏定义的一种，它可以根据是否已经定义了一个变量来进行分支选择，一般用于调试等等<br><br><br>　　<span style="font-weight:bold"><wbr />#ifndef x</span><wbr /><br><br><br>　　//先测试x是否被定义过<br><br><br>　　<span style="font-weight:bold"><wbr />#define x</span><wbr /> <br><br><br>　　//如果没有定义下面就定义x并执行下面的语句<br><br><br>　　<span style="font-weight:bold"><wbr />...<br><br><br>　　#endif</span><wbr /><br><br><br>　　//如果已经定义了则执行#endif后面的语句<br><br><br>　　条件指示符#ifndef检查预编译常量在前面是否已经被定义。如果在前面没有被定义,则条件指示符的值为真，于是从#ifndef到#endif之间的所有语句都被包含进来进行处理。相反，如果#ifndef指示符的值为假，则它与#endif指示符之间的行将被忽略。条件指示符#ifndef 的最主要目的是防止头文件的重复包含和编译。<br><br><br><br> <br><br>　　千万不要忽略了头件的中的#ifndef，这是一个很关键的东西。比如你有两个C文件，这两个C文件都include了同一个头文件。而编译时，这两个C文件要一同编译成一个可运行文件，于是问题来了，大量的声明冲突。 <br><br><br>　　还是把头文件的内容都放在#ifndef和#endif中吧。不管你的头文件会不会被多个文件引用，你都要加上这个。一般格式是这样的： <br><br><br>　　#ifndef &lt;标识&gt; <br><br><br>　　#define &lt;标识&gt; <br><br><br>　　...... <br><br><br>　　...... <br><br><br>　　#endif <br><br><br>　　&lt;标识&gt;在理论上来说可以是自由命名的，但每个头文件的这个“标识”都应该是唯一的。标识的命名规则一般是头文件名全大写，前后加下划线，并把文件名中的“.”也变成下划线，如：stdio.h <br><br><br>　　#ifndef _STDIO_H_ <br><br><br>　　#define _STDIO_H_ <br><br><br>　　...... <br><br><br>　　#endif <!--v:3.2--> ]]></description>
<category><![CDATA[C++语法相关]]></category>
<author><![CDATA[37483424@qq.com(phoenixyt)]]></author>
<comments>http://37483424.qzone.qq.com/blog/1255594203#comment</comments>
<qz:effect>134218240</qz:effect>
<pubDate>Thu, 15 Oct 2009 08:10:03 GMT</pubDate>
<guid>http://37483424.qzone.qq.com/blog/1255594203</guid>
</item>

<item>
<title><![CDATA[最简单的一个驱动程序外壳，打印驱动对象部分内容]]></title>
<link>http://37483424.qzone.qq.com/blog/1255094244</link>
<description><![CDATA[//最简单的驱动程序<br>//main.c 代码如下<br>#include &lt;ntddk.h&gt;<br>VOID DriverUnload(PDRIVER_OBJECT driver)<br>{<br> DbgPrint(&quot;first:Our driver is unloading...\r\n&quot;);<br>}NTSTATUS DriverEntry(PDRIVER_OBJECT driver,PUNICODE_STRING reg_path)<br>{<br> DbgPrint(&quot;frist:Hello,my salary!&quot;);<br> DbgPrint(&quot;Type is :%d&quot;,driver-&gt;Type);    //参考wdm.h里 DRIVER_OBJECT类型定义，打印其中部分内容，注意驱动名称的打印要用 %wZ 后面变量名要用指针形式<br>    DbgPrint(&quot;%d&quot;,driver-&gt;Size);<br>    DbgPrint(&quot;%d&quot;,driver-&gt;Flags);<br> DbgPrint(&quot;Driver Name is:%wZ&quot;,&amp;driver-&gt;DriverName);<br> driver-&gt;DriverUnload=DriverUnload;<br> return STATUS_SUCCESS;<br>} <br>//sources文件内容如下<br># $Id$<br>TARGETNAME=EmptyDriver1   //这里指定目标生成驱动程序的名称<br>TARGETPATH=obj<br>TARGETTYPE=DRIVER            //这里指定生成目标的类型# Create browse info<br>#BROWSER_INFO=1<br>#BROWSERFILE=&lt;some path&gt;# Additional defines for the C/C++ preprocessor<br>C_DEFINES=$(C_DEFINES)SOURCES=main.c                   //这里指定源文件，多个源文件用“，”隔开<br> <br>//makefile文件内容<br>#<br># DO NOT EDIT THIS FILE!!!  Edit .\sources. if you want to add a new source<br># file to this component.  This file merely indirects to the real make file<br># that is shared by all the  components of the Windows NT DDK<br>#!INCLUDE $(NTMAKEENV)\makefile.def<br> <!--v:3.2--> ]]></description>
<category><![CDATA[驱动学习]]></category>
<author><![CDATA[37483424@qq.com(phoenixyt)]]></author>
<comments>http://37483424.qzone.qq.com/blog/1255094244#comment</comments>
<qz:effect>134218240</qz:effect>
<pubDate>Fri, 09 Oct 2009 13:17:24 GMT</pubDate>
<guid>http://37483424.qzone.qq.com/blog/1255094244</guid>
</item>

</channel>
</rss>

