<?xml version="1.0" encoding="UTF-8"?>
  <feed xmlns="http://www.w3.org/2005/Atom">
  <title type="html"><![CDATA[中国龙派信息安全团队]]></title>
  <subtitle type="html"><![CDATA[自由　技术　学习]]></subtitle>
  <id>http://www.chinahacker.net/</id>
  <link rel="alternate" type="text/html" href="http://www.chinahacker.net/" /> 
  <link rel="self" type="application/atom+xml" href="http://www.chinahacker.net/atom.asp" /> 
  <generator uri="http://www.pjhome.net/" version="2.8">PJBlog3</generator> 
  <updated>2011-07-30T07:47:03+08:00</updated>

  <entry>
	  <title type="html"><![CDATA[流程和制度的区别]]></title>
	  <author>
		 <name>gaby</name>
		 <uri>http://www.chinahacker.net/</uri>
		 <email>freeshell2002@yahoo.com</email>
	  </author>
	  <category term="" scheme="http://www.chinahacker.net/default.asp?cateID=5" label="企业管理" /> 
	  <updated>2011-07-30T07:47:03+08:00</updated>
	  <published>2011-07-30T07:47:03+08:00</published>
		  <summary type="html"><![CDATA[曾经有这样一个故事： <br/>&nbsp;&nbsp;&nbsp;&nbsp;圣诞节到了，一个贫穷母亲只能给她两个儿子一块小小的面饼作为圣诞晚餐。可是两个不懂事的儿子却给他们的妈妈出了个难题，无论她打算怎么分，总有一个儿子说妈妈偏心，把 <br/>自己这边分得小了。万般无奈之下，这位妈妈只好想了个办法： “老大，你过来，你来切这个饼。但有个条件，你要让你弟弟先挑切好后的半个饼。”<br/>&nbsp;&nbsp;&nbsp;&nbsp;这一下，兄弟俩都没话说了。老大只有尽量切得一般大小，否则自己肯定只能得到小的一半；而老二则只好瞪大眼睛，尽力挑出稍大一点的那块。尽管两块饼肯定大小不停，但兄弟二人只好各自认命，因为在妈妈制定的规则之下，不论谁吃了亏，能怪的只有自己。<br/>“老大负责切饼，老二优先挑选”，这个就是分饼的制度了。<br/>我们可以看到按这个制度分饼固然哥俩相安无事，但显然也无益于加深哥俩之间的亲情。到下一次又要分个什么东西的时候，可怜的妈妈只好再杜撰一个什么“制度”出来。<br/>企业也是这样，企业的制度一方面规定了员工的工作内容，另一方面规定了员工怎样去实现工作内容的工作流程。制度必须对员工在什么岗位上要做什么事情都规定得密不透风，否则员工在做这些工作的时候没有受一个客观、合理的制度进行限制，就有可能随意采用一种偏私的流程，最终得到一个无法预料的工作成果。<br/>在“人性恶”的假设条件下，为了保证企业的运行不出偏差，我们就只好制定一套又一套的制度，用制度替我们看护我们的企业。然而制度在看护企业的同时，也绑住了企业，让它失去活力：<br/>将一种规定放在不同员工身上，有时可能会引起员工的反弹；太多的规定产生一种束缚的气氛，使员工逐渐失去判断能力。<br/>公司没有规定的事务，员工可能就不会去做。从而扼杀员工的创意，员工只敢固守成规而不敢冒险。<br/>太多的规定可能使公司花费许多时间、人力及金钱在执行管理上，但太多的规定传达给员工的却是公司不信任的讯息。<br/>&nbsp;&nbsp; 太多的规定可能使员工在面对顾客时失去弹性，如果程序过于繁杂，顾客可能会因为太麻烦而弃公司而去。<br/>&nbsp;&nbsp; 人们悲哀地发现，费尽心力制定出来制度，很多成了束缚企业发展地绳索，当年“共工氏、鲧治理洪水”的错误不断重复着，人们不断筑起制度的堤坝，不断投入大量的人力去巩固和完善堤坝，但却总是无法根除洪水的威胁。<br/>&nbsp;&nbsp; 今天市场竞争日益激烈，“知识经济”环境下的企业，已经不允许用对待机器的办法来对待员工。基于“人性恶”的假设而设计出来的企业管理制度，在支撑了百年工业化大发展之后，面对新形势下的市场竞争，终于显出它力不从心的一面；来自外部的激烈竞争，和来自内部员工对知识和事业发展的渴求，制度的堤坝如果无法理顺它的走向，将面临内部和外部两面的洪水侵蚀。<br/>&nbsp;&nbsp; 流程管理与制度就像流程就像是河流，流程管理就像是河道梳理，制度就是巩固河道的堤坝，那如果是治理象河流一样的业务流程，那应该用流程管理先梳理河道，河道梳理好了以后再用管理制度这样的堤坝巩固梳理成果，如果只是加固堤坝，河流总有一天会泛滥成灾的。<br/>&nbsp;&nbsp; 要运用流程管理的方法去改善企业管理制度，首先要弄清流程和制度的关系。应该说，二者之间既有区别，又有联系，是对立统一的关系。<br/>&nbsp;&nbsp; 管理思想的不同<br/>&nbsp;&nbsp; 不同的企业适用于不同的管理模式，而采用“制度导向”的管理还是“流程导向”的管理，取决于管理者所基于的不同假设：“人性本善”和“人性本恶”。 <br/>&nbsp;&nbsp; “制度导向”是采取“以堵治水”的办法，基于的管理假设是“人性本恶”。简单的说既是“假如你不做，按制度进行处罚；你要胆敢再犯，加倍处罚；看你还敢吗？”。应该说，这是一种典型的消极管理模式。<br/>&nbsp;&nbsp; “流程导向”更多的是一种“以导治水”，其基于的管理假设是“人性本善”，特点是以完成工作步骤、顺序作为核心，结合组织结构、人员素质及其他资源，站在公司的角度，来设定流程；它是企业管理原则的很好载体；它提倡以“对自己职责的本分”、“对上下游的积极信任”的态度来有效运作流程。<br/>&nbsp;&nbsp;&nbsp;&nbsp;局部观念与全局观念的不同<br/>&nbsp;&nbsp; 从“流程”的定义中可以了解到“流程导向”是为实现某项功能的一个系统，系统可大可小，整个企业是一个系统，根据不同的分类原则内部又可以分为若干个独立系统，各系统之间都会通过各流程系统之间的接口建立起紧密联系，最终织成一个涵盖全局的网络系统。 <br/>&nbsp;&nbsp; 而“制度导向”更多的是针对局部出现执行力问题而采取的奖惩措施，包括对执行人主观态度以及客观过失造成公司损失的处理。 <br/>&nbsp;&nbsp; 思维定势的不同 <br/>&nbsp;&nbsp; 很多管理人员感叹流程执行难，解决这个问题，不同的管理文化导向表现不同的管理模式。“制度导向”管理模式的公司，管理者考虑的是“是不是处罚太轻了？”，随即修改制度加重处罚力度。 <br/>&nbsp;&nbsp; 而“流程导向”管理模式的公司，管理者更多的会从流程实际使用优化的角度出发。管理者把更多的精力花在“如何使流程标准更优化”上。通过流程的优化来改善员工的行动效果。<br/>&nbsp;&nbsp; 尽管制度与流程具有理念和思路上的根本差异，但从某种意义上说，二者又是同一个事物的两个侧面，相互之间具有密切的联系：<br/>&nbsp;&nbsp; 流程是制度的灵魂<br/>&nbsp;&nbsp; 如果制度不能反应流程，就像失去了灵魂，它的执行一定会出现问题。所以制度无法执行时，往往是它所包含的流程有问题。<br/>&nbsp;&nbsp; 企业管理中常常会遇到“法不责众”情况，如果频繁出现这种情况，就说明一个制度或规定是不合理的，而不合理的地方往往是它相关的流程与实际情况不符，使得业务流程“两张皮”的现象无法避免。<br/>&nbsp;&nbsp; 制度是流程得以执行的保证<br/>&nbsp;&nbsp; 制度是因流程而存在的，通过适当制度的执行推动流程的执行。<br/>&nbsp;&nbsp; 流程是建立在对功能团队信任的基础上而设计的，对于因个体原因而影响流程功能实现的现象，只有通过制度进行约束，才能得以制止，进而建立流程的威信。<br/>&nbsp;&nbsp;“制度”的激励作用可以促使流程改善 <br/>&nbsp;&nbsp;&nbsp;&nbsp;过去制度更多的是“处罚”的代名词，实际上，制度中的奖励要比惩罚更容易起作用。而且激励因素往往会促使大家更多的主动关注流程，从而使流程得到优化。 <br/>&nbsp;&nbsp;&nbsp;&nbsp;在明白了流程和制度的关系之后，很多企业开始通过一些具体方法的落实，开始尝试把流程管理的思想用于企业制度的建设。比如，把企业中的管理制度按照刚性程度和作用范围分为5种：<br/>&nbsp;&nbsp;&nbsp;&nbsp;管理制度：是企业管理系统的基本框架，保证生产经营管理秩序的根本性的管理制度。<br/>&nbsp;&nbsp;&nbsp;&nbsp;管理规定：对某专项的涉及到全企业或某一个专业系统内的工作所做出的具体要求。<br/>&nbsp;&nbsp;&nbsp;&nbsp;管理办法：对于一项具体工作、操作步骤或对于一个具体的项目的管理所做出的要求。<br/>&nbsp;&nbsp;&nbsp;&nbsp;实施细则：对于企业管理系统内某一个管理制度的具体实施步骤所做出的具体规定。<br/>&nbsp;&nbsp;&nbsp;&nbsp;工作条例：企业内部局部性的、或阶段性的工作所做出的系列化规定。<br/>&nbsp;&nbsp;&nbsp;&nbsp;也有企业将制度分为企业管理手册、程序文件、作业指导书、奖惩绩效等四类。此外还有其他一些分类方法，但不论如何分类，基本都可以看出管理者的这样一个思想，就是要把流程管理的方法应用到企业管理制度中，以上述分类为例：不同层次的管理制度具有不同的流程特性，相对于管理制度和管理规定，管理办法、实施细则、工作条例更强调步骤、流转、方法等流程特性。<br/>&nbsp;&nbsp;&nbsp;&nbsp;从这些制度的分类方法中，我们可以看到企业意图将流程管理方法融入制度管理的强烈期望。 那么，流程与制度是否可以融入同一文化中呢？流程管理与制度管理的融合，不仅仅需要用流程管理的方法和工具去理顺企业的管理流程，更重要的是要在企业中形成“持续改进”的流程管理文化。<br/>]]></summary>
	  <link rel="alternate" type="text/html" href="http://www.chinahacker.net/article.asp?id=113" /> 
	  <id>http://www.chinahacker.net/default.asp?id=113</id>
  </entry>	
		
  <entry>
	  <title type="html"><![CDATA[人力资源总监的七条“毒计”]]></title>
	  <author>
		 <name>gaby</name>
		 <uri>http://www.chinahacker.net/</uri>
		 <email>freeshell2002@yahoo.com</email>
	  </author>
	  <category term="" scheme="http://www.chinahacker.net/default.asp?cateID=4" label="网文网摘" /> 
	  <updated>2010-08-20T20:08:11+08:00</updated>
	  <published>2010-08-20T20:08:11+08:00</published>
		  <summary type="html"><![CDATA[罪行一：敲山震虎<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;老板埋怨写字楼里的职员们工作热情不高，我就在报上刊登了整版招聘广告，把职员们除我以外所有的职位都招了一遍。效果真不错，职员们纷纷主动要求加班，甚至有几个主动要求减薪。我只私下要求他们每人每月向我进贡100元。200多人呢，我每月净赚2万元人民币！<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;罪行二：借尸还魂<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;在我的主使下，公司要搞薪酬调查，我又在报纸上把除我以外所有的职位都招了一遍。广告中声明：应聘者来信务必注明薪酬要求。于是就收到3万份应聘资料，把其中的薪酬要求分类统计一下，薪酬调查就出来了——其实多数专业调查公司也是这么干的。那些应聘信，我私下卖给收破烂的了，还得了点外快。<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;罪行三：吃里扒外<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;公司有个女职员未婚先孕，她说与我有关。为了摆平这件事，我使了不少银子。于是我就编造了很多理由，连续一个月亲自到人才市场现场招聘会上去招人。每个展位费600元，每天租用5个展位，大公司嘛，当然要有气派！每天展位费3000元，人家给我开了7000元的发票，每天净赚4000元10天净赚40000元，人家还说要我常来。至于招什么人，我从没过问，招聘海报都是人家用电脑制作好的。<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;罪行四：抛砖引玉<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;要写年终总结报告了，这也难不倒我这个只认识99个汉字的白领。我又登了招聘广告，想必大家也知道我的花招了。应聘者主动把年终总结报告寄过来了，我从300份里挑了10份留用，其他资料我卖给收废品的了。<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;罪行五：笑里藏刀<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;最近公司不太景气，债主天天上门吵闹，而且一定要找公司高层。于是我又刊登了广告，招聘总经理。我从中挑了一个智商比我差的人推荐给老板，他的唯一工作就是天天面对那些上门的债主。这家伙还总找我问他什么时候能真正履行总经理的职责，我说老板很器重你，是先拿这些债主考验你。<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;罪行六：请君入瓮<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;公司的销售代表是没有底薪的，只能拿提成，智商高于60的人是不会应聘的。于是我在招聘广告里写了很多职位：英语教师、培训讲师、行政经理、储备干部、文员、公关、助理等等，其实这些都是虚晃一枪，把这些人骗到公司里来再用什么人生呀、理念呀、成功呀、关爱呀、奋斗呀、心态呀，给他们洗洗脑，总有上当的。<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;罪行七：欲擒故纵<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;很多人都想坐到我这个职位上，最危险的就是本公司内部的人员。以前，我从不对外招聘负责人力资源工作的人，公司里凡是有心想做人力资源工作的，都被我想法子给赶走了。<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;也有闪失，春节前，我调了个表面上很安分守己的家伙到我的部门，哪知这小子一直没交代他是名牌大学专门学人力资源专业的硕士。当初他只是应聘生产管理，拿出的是妇产科的医学本科文凭。他刚调来就找了老板，我赶紧来个乾坤大挪移：连夜坐车赶往外地，冒充他前一家公司同事的身份写了一封匿名揭发信，总之说了一大堆那人的坏话，把信寄给老板和我自己各一份。<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;自那以后，每次招聘时，我都要把人力资源方面的职位都招上一遍，让那些隐藏分子自己在信封左下角注明应聘职位，“主动暴露”。这样一来，连信封都不用拆我就可以轻松地把那些潜在对手丢进垃圾堆了！]]></summary>
	  <link rel="alternate" type="text/html" href="http://www.chinahacker.net/article.asp?id=110" /> 
	  <id>http://www.chinahacker.net/default.asp?id=110</id>
  </entry>	
		
  <entry>
	  <title type="html"><![CDATA[防CC攻击的ASP代码]]></title>
	  <author>
		 <name>gaby</name>
		 <uri>http://www.chinahacker.net/</uri>
		 <email>freeshell2002@yahoo.com</email>
	  </author>
	  <category term="" scheme="http://www.chinahacker.net/default.asp?cateID=4" label="网文网摘" /> 
	  <updated>2010-07-22T08:28:38+08:00</updated>
	  <published>2010-07-22T08:28:38+08:00</published>
		  <summary type="html"><![CDATA[较为全面的asp防CC代码<br/><br/>&lt;%<br/>Dim CC_Info(4),strInfo,strTemp<br/>If Session(&#34;CC_Info&#34;) = &#34;&#34; Then<br/>CC_Info(0) = &#34;cclog.txt&#34; &#39;日志文件名<br/>CC_Info(1) = Request.ServerVariables(&#34;HTTP_X_FORWARDED_FOR&#34;)<br/>CC_Info(2) = Request.ServerVariables(&#34;REMOTE_ADDR&#34;)<br/>CC_Info(3) = 10 &#39;N秒内禁止刷新当前页面<br/>CC_Info(4) = &#34;badip.txt&#34; &#39;IP黑名单文件名<br/>Session(&#34;CC_Info&#34;) = CC_Info(0) &amp;&#34;|&#34;&amp; CC_Info(1) &amp;&#34;|&#34;&amp; CC_Info(2) &amp;&#34;|&#34;&amp; CC_Info(3) &amp;&#34;|&#34;&amp; CC_Info(4)<br/>Else<br/>strInfo = Split(Session(&#34;CC_Info&#34;),&#34;|&#34;)<br/>CC_Info(0) = strInfo(0)<br/>CC_Info(1) = strInfo(1)<br/>CC_Info(2) = strInfo(2)<br/>CC_Info(3) = strInfo(3)<br/>CC_Info(4) = strInfo(4)<br/>End If<br/><br/>Const chkRefresh = 1 &#39;0关闭防刷新<br/>Const chkProxy = 1 &#39;0关闭代理验证<br/>Const chkBadIP = 1 &#39;0关闭IP黑名单<br/><br/>If Session(&#34;BadIP&#34;) = &#34;&#34; Then<br/>strInfo = ReadFile(CC_Info(4))<br/>If strInfo = &#34;&#34; Then strInfo = &#34;chinavb.net&#34;<br/>Session(&#34;BadIP&#34;) = strInfo<br/>Else<br/>strInfo = Session(&#34;BadIP&#34;)<br/>End If<br/><br/>&#39;/*第一层判断，N秒内禁止刷新*/<br/>If chkRefresh = 1 Then<br/>If Session(&#34;RefreshTime&#34;)=&#34;&#34; Then<br/>&nbsp;&nbsp; Session(&#34;RefreshTime&#34;)=Now()<br/>Else<br/>&nbsp;&nbsp; If DateDiff(&#34;s&#34;, Session(&#34;RefreshTime&#34;), Now()) &lt; CInt(CC_Info(3)) Then<br/>&nbsp;&nbsp;&nbsp;&nbsp;Response.Write(&#34;系统繁忙，请稍候再试！错误代码001&#34;)<br/>&nbsp;&nbsp;&nbsp;&nbsp;Response.End()<br/>&nbsp;&nbsp; Else<br/>&nbsp;&nbsp;&nbsp;&nbsp;Session(&#34;RefreshTime&#34;)=Now()<br/>&nbsp;&nbsp; End If<br/>End If<br/>End If<br/><br/>&#39;/*第二层判断，代理禁止查看*/<br/>If chkProxy = 1 Then<br/>If CC_Info(1) &lt;&gt; &#34;&#34; Then<br/>&nbsp;&nbsp; If InStr(strInfo,CC_Info(1)) = 0 Then<br/>&nbsp;&nbsp;&nbsp;&nbsp;strTemp = CC_Info(1) &amp; vbCrLf<br/>&nbsp;&nbsp;&nbsp;&nbsp;If InStr(strInfo,CC_Info(2)) = 0 Then<br/>&nbsp;&nbsp;&nbsp;&nbsp; strTemp = strTemp &amp; &#34;[&#34; &amp; CC_Info(2) &amp; &#34;]&#34; &amp; vbCrLf<br/>&nbsp;&nbsp;&nbsp;&nbsp;End If<br/>&nbsp;&nbsp;&nbsp;&nbsp;SaveLog CC_Info(4),strTemp<br/>&nbsp;&nbsp;&nbsp;&nbsp;strInfo = strInfo &amp; strTemp<br/>&nbsp;&nbsp;&nbsp;&nbsp;Session(&#34;BadIP&#34;) = strInfo<br/>&nbsp;&nbsp; End If<br/>&nbsp;&nbsp; &#39;记录CC攻击日志<br/>&nbsp;&nbsp; SaveLog CC_Info(0),CC_Info(1) &amp; &#34;[&#34;&amp; CC_Info(2) &amp; &#34;]&#34; &amp; Now() &amp;vbCrLf<br/>&nbsp;&nbsp; Response.Write(&#34;系统繁忙，请稍候再试！错误代码002&#34;)<br/>&nbsp;&nbsp; Response.End()<br/>End If<br/>End If<br/><br/>&#39;/*第三层判断，IP黑名单禁止查看*/<br/>If chkBadIP = 1 Then<br/>If InStr(strInfo,CC_Info(2))&gt;0 Then<br/>&nbsp;&nbsp; Response.Write(&#34;系统繁忙，请稍候再试！错误代码003&#34;)<br/>&nbsp;&nbsp; Response.End()<br/>End If<br/>End If<br/><br/>&#39;ForReading=1,ForWriting=2,ForAppending=8<br/>Function SaveLog(filename, filecontent)<br/>On Error Resume Next<br/>&nbsp;&nbsp;&nbsp;&nbsp;Dim fso, thisfile<br/>&nbsp;&nbsp;&nbsp;&nbsp;filename = Server.MapPath(filename)<br/>&nbsp;&nbsp;&nbsp;&nbsp;Set fso = Cr&#101;ateObject(&#34;Scripting.FileSystemObject&#34;)<br/>If Err &lt;&gt; 0 Then<br/>&nbsp;&nbsp; Response.Write(&#34;写入文件&#34;&amp;filename&amp;&#34;失败，可能您的系统不支持FSO！&#34;)<br/>&nbsp;&nbsp; Response.End()<br/>End If<br/>&nbsp;&nbsp;&nbsp;&nbsp;Set thisfile = fso.OpenTextFile(filename, 8, True)<br/>&nbsp;&nbsp;&nbsp;&nbsp;thisfile.write (filecontent)<br/>&nbsp;&nbsp;&nbsp;&nbsp;thisfile.Close<br/>&nbsp;&nbsp;&nbsp;&nbsp;Set fso = Nothing<br/>End Function<br/><br/>Function ReadFile(filename)<br/>On Error Resume Next<br/>Dim fso, thisfile<br/>Set fso = Cr&#101;ateObject(&#34;Scripting.FileSystemObject&#34;)<br/>If Err &lt;&gt; 0 Then<br/>&nbsp;&nbsp; Response.Write(&#34;读取文件&#34;&amp;filename&amp;&#34;失败，可能您的系统不支持FSO！&#34;)<br/>&nbsp;&nbsp; Response.End()<br/>End If<br/>Set thisfile = fso.OpenTextFile(Server.MapPath(filename), 1, True)<br/>ReadFile = thisfile.ReadAll<br/>thisfile.Close<br/>Set thisfile = Nothing<br/>Set fso = Nothing<br/>End Function<br/>%&gt;<br/>]]></summary>
	  <link rel="alternate" type="text/html" href="http://www.chinahacker.net/article.asp?id=109" /> 
	  <id>http://www.chinahacker.net/default.asp?id=109</id>
  </entry>	
		
  <entry>
	  <title type="html"><![CDATA[利用VB编写dll注入其他进程的源代码]]></title>
	  <author>
		 <name>gaby</name>
		 <uri>http://www.chinahacker.net/</uri>
		 <email>freeshell2002@yahoo.com</email>
	  </author>
	  <category term="" scheme="http://www.chinahacker.net/default.asp?cateID=4" label="网文网摘" /> 
	  <updated>2010-03-19T13:59:31+08:00</updated>
	  <published>2010-03-19T13:59:31+08:00</published>
		  <summary type="html"><![CDATA[本文没什么特别的技术含量，高手免阅。 <br/><br/>本文是此帖的具体实现…………<a href="http://www.rekersoft.cn/article.asp?id=4" target="_blank" rel="external">http://www.rekersoft.cn/article.asp?id=4</a><br/><br/>前些日子为了隐藏KillIM（见<a href="http://www.rekersoft.cn/article.asp?id=8" target="_blank" rel="external">http://www.rekersoft.cn/article.asp?id=8</a>）于是上网找了些注入dll的资料，另外在一个u盘里面意外发现了以前备份的一些代码（原来的电脑被偷了 ），其中就包含了dll注入，呵呵，可以省点事了，把精力集中在vb编译标准dll上。以前其实有个csdn上牛人写的vb插件，可以用标准exe工程生成dll，而不是网上流行的activex dll工程加连接参数生成标准dll（那样其实不是标准的，本质还是activex dll，比如不能用来做hook）。可惜csdn改版以后，原来的下载页面都没了，也就再也找不到了。<br/><br/>此帖主要讲一下dll的注入与卸载（叫反注入貌似不太恰当，反正就是那个意思），以及如何编写一个注入用dll。因为在网上好多讲注入的帖子中的dll都讲得很简单，简单的show一个msgbox。问题是注入之后，dllmain执行一次就返回了，接着要怎么继续让dll做事情很多菜鸟（包括我）都不知道。所以就研究了下,贴在这里。<br/><br/>第一部分讲的是注入程序：<br/><br/>dll注入的核心就是用Cr&#101;ateRemoteThread函数在目标进程中创建一个线程（如果你不知道线程是什么?just google it），该线程只有一个作用，就是LoadLibraryA我们的dll，而LoadLibraryA又会调用dll的DllMain函数并发送DLL_PROCESS_ATTACH参数告诉dll你被加载了。此时我们的dll就成为了目标进程的一部分，于是乎，你该干吗就可以干吗去了。<br/><br/>ok，来说说代码吧。下面是api申明，放在模块当中。<br/> <br/><br/> 程序代码<br/><br/>Option Explicit<br/>&#39;dll注入程序<br/>&#39;api申明模块<br/>&#39;<br/>&#39;蓝色炫影&nbsp;&nbsp;制作<br/>&#39;www.rekersoft.cn<br/>&#39;<br/>&#39;最后更新 2008/05/06<br/>&#39;您可以自由用于非商业用途。<br/>&#39;请保留此行版权信息，谢谢。<br/><br/>Public Const PROCESS_VM_READ = &amp;H10<br/>Public Const TH32CS_SNAPPROCESS = &amp;H2<br/>Public Const MEM_COMMIT = 4096<br/>Public Const MEM_DECOMMIT = &amp;H4000<br/>Public Const PAGE_READWRITE = 4<br/>Public Const PROCESS_Cr&#101;ate_THREAD = (&amp;H2)<br/>Public Const PROCESS_VM_OPERATION = (&amp;H8)<br/>Public Const PROCESS_VM_WRITE = (&amp;H20)<br/>Public Const PROCESS_ALL_ACCESS = &amp;H1F0FFF<br/>Public Const INFINITE = &amp;HFFFF&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#39;&nbsp;&nbsp;Infinite timeout<br/><br/>Public Declare Function VirtualAllocEx Lib &#34;kernel32&#34; (ByVal hProcess As Long, _<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ByVal lpAddress As Long, ByVal dwSize As Long, ByVal flAllocationType As Long, _<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ByVal flProtect As Long) As Long<br/>Public Declare Function VirtualFreeEx Lib &#34;kernel32&#34; (ByVal hProcess As Long, _<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ByVal lpAddress As Long, ByVal dwSize As Long, _<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ByVal dwFreeType As Long) As Long<br/>&#39;这两个api的作用是在目标进程中分配一段空白内存供程序使用。在vb的api浏览器中是找不到的。<br/><br/>Public Declare Function GetProcAddress Lib &#34;kernel32&#34; (ByVal hModule As Long, _<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ByVal lpProcName As String) As Long<br/>Public Declare Function GetModuleHandle Lib &#34;kernel32&#34; Alias &#34;GetModuleHandleA&#34; _<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(ByVal lpModuleName As String) As Long<br/>&#39;得到函数地址与dll模块地址<br/><br/>Public Declare Function Cr&#101;ateToolhelp32Snapshot Lib &#34;kernel32&#34; _<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(ByVal dwFlags As Long, ByVal th32ProcessID As Long) As Long<br/>Public Declare Function Process32First Lib &#34;kernel32&#34; (ByVal hSnapshot As Long, _<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; lppe As PROCESSENTRY32) As Long<br/>Public Declare Function Process32Next Lib &#34;kernel32&#34; (ByVal hSapshot As Long, _<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; lppe As PROCESSENTRY32) As Long<br/>&#39;这三个api用来遍历进程<br/><br/>Public Declare Function OpenProcess Lib &#34;kernel32&#34; _<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, _<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ByVal dwProcessId As Long) As Long<br/>Public Declare Function CloseHandle Lib &#34;kernel32&#34; (ByVal hObject As Long) As Long<br/>&#39;打开与关闭进程句柄<br/><br/>Public Declare Function WriteProcessMemory Lib &#34;kernel32&#34; _<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(ByVal hProcess As Long, ByVal lpBaseAddress As Long, lpBuffer As Any, _<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ByVal nSize As Long, lpNumberOfBytesWritten As Long) As Long<br/>&#39;这里注意lpBaseAddress的传送方式是byval，和api浏览器中的声明是不一样的。 _<br/>byval是传值，默认是byref是传址，也就是传递的是参数在内存中的地址<br/>Public Declare Function Cr&#101;ateRemoteThread Lib &#34;kernel32&#34; _<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(ByVal hProcess As Long, ByVal lpThreadAttributes As Long, _<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ByVal dwStackSize As Long, ByVal lpStartAddress As Long, _<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ByVal lpParameter As Long, ByVal dwCreationFlags As Long, _<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lpThreadId As Long) As Long<br/>&#39;这里也是一样，几个参数的传递方式与api浏览器中的声明不一样<br/>Public Declare Function WaitForSingleObject Lib &#34;kernel32&#34; _<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(ByVal hHandle As Long, ByVal dwMilliseconds As Long) As Long<br/>Public Declare Function GetExitCodeThread Lib &#34;kernel32&#34; _<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(ByVal hThread As Long, lpExitCode As Long) As Long<br/>&#39;这两个函数程序当中没用到。在窗体代码中有注释。<br/><br/>Public Type PROCESSENTRY32<br/>&nbsp;&nbsp;&nbsp;&nbsp;dwSize&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;As Long<br/>&nbsp;&nbsp;&nbsp;&nbsp;cntUseage&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; As Long<br/>&nbsp;&nbsp;&nbsp;&nbsp;th32ProcessID&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; As Long<br/>&nbsp;&nbsp;&nbsp;&nbsp;th32DefaultHeapID&nbsp;&nbsp; As Long<br/>&nbsp;&nbsp;&nbsp;&nbsp;th32ModuleID&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;As Long<br/>&nbsp;&nbsp;&nbsp;&nbsp;cntThreads&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;As Long<br/>&nbsp;&nbsp;&nbsp;&nbsp;th32ParentProcessID As Long<br/>&nbsp;&nbsp;&nbsp;&nbsp;pcPriClassBase&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;As Long<br/>&nbsp;&nbsp;&nbsp;&nbsp;swFlags&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; As Long<br/>&nbsp;&nbsp;&nbsp;&nbsp;szExeFile&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; As String * 1024<br/>End Type<br/> <br/><br/><br/>接着在窗体中画一个Text1用来输入准备注入的dll名，外加2个Button，Command1是注入，Command2是卸载。<br/>窗体代码：<br/><br/> <br/><br/> 程序代码<br/><br/>Option Explicit<br/>&#39;dll注入程序<br/>&#39;主窗体代码<br/>&#39;<br/>&#39;蓝色炫影&nbsp;&nbsp;制作<br/>&#39;www.rekersoft.cn<br/>&#39;<br/>&#39;最后更新 2008/05/06<br/>&#39;您可以自由用于非商业用途。<br/>&#39;请保留此行版权信息，谢谢。<br/><br/>Public Sub Inject()<br/>&#39;注入子程序<br/><br/>Dim MySnapHandle&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;As Long&nbsp;&nbsp; &#39;存放进程快照句柄<br/>Dim ProcessInfo&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; As PROCESSENTRY32<br/>Dim MyRemoteProcessId&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; As Long&nbsp;&nbsp; &#39;目标进程pid<br/>Dim MyDllFileName&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; As String &#39;dll文件路径<br/>Dim MyDllFileLength&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; As Long&nbsp;&nbsp; &#39;dll文件名长度<br/>Dim MyDllFileBuffer&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; As Long&nbsp;&nbsp; &#39;写入dll文件名的内存地址<br/>Dim MyAddr&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;As Long&nbsp;&nbsp; &#39;执行远程线程代码的起始地址。这里等于LoadLibraryA的地址<br/>Dim MyReturn&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;As Long<br/><br/>MySnapHandle = Cr&#101;ateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0)<br/>ProcessInfo.dwSize = Len(ProcessInfo)<br/>&#39;建立进程快照<br/><br/>If Process32First(MySnapHandle, ProcessInfo) &lt;&gt; 0 Then<br/>&#39;开始遍历进程<br/>Do<br/>&nbsp;&nbsp;&nbsp;&nbsp;If InStr(ProcessInfo.szExeFile, &#34;explorer.exe&#34;) &gt; 0 Then<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#39;遍历进程,查找explorer.exe<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MyDllFileName = App.Path &amp; &#34;\&#34; &amp; IIf(LCase(Right(Text1, 4)) = &#34;.dll&#34;, Text1, Text1.Text &amp; &#34;.dll&#34;)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#39;dll文件路径<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MyDllFileLength = LenB(StrConv(MyDllFileName, vbFromUnicode)) + 1<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#39;这里把dll文件名从Unicode转换成Ansi，否则英文字母是2个字节。 _<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 顺便说一下，学过C的应该知道字符串要以/0标志结尾，所以dll文件名长度要加上1个字节存放Chr(0)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MyRemoteProcessId = OpenProcess(PROCESS_ALL_ACCESS, False, ProcessInfo.th32ProcessID)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#39;得到进程的句柄<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;If MyRemoteProcessId = 0 Then MsgBox &#34;OpenProcess Error&#34;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MyDllFileBuffer = VirtualAllocEx(MyRemoteProcessId, 0, MyDllFileLength, MEM_COMMIT, PAGE_READWRITE)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#39;在目标进程中申请分配一块空白内存区域。内存的起始地址保存在MyDllFileBuffer中。 _<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 这块内存区域我们用来存放dll文件路径，并作为参数传递给LoadLibraryA。<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;If MyDllFileBuffer = 0 Then MsgBox &#34;VirtualAllocEx Error&#34;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MyReturn = WriteProcessMemory(MyRemoteProcessId, MyDllFileBuffer, ByVal (MyDllFileName), MyDllFileLength, 0)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#39;在分配出来的内存区域中写入dll路径径。注意第二个参数传递的是MyDllFileBuffer的内容， _<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 而不是MyDllFileBuffer的内存地址。<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;If MyReturn = 0 Then MsgBox &#34;WriteProcessMemory Error&#34;<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MyAddr = GetProcAddress(GetModuleHandle(&#34;Kernel32&#34;), &#34;LoadLibraryA&#34;)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#39;得到LoadLibraryA函数的起始地址。他的参数就是我们刚才写入的dll路径。但是LoadLibraryA本身是不知道参数在哪里的。 _<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 接下来我们就用Cr&#101;ateRemoteThread函数告诉他参数放在哪里了。<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;If MyAddr = 0 Then MsgBox &#34;GetProcAddress Error&#34;<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MyResult = Cr&#101;ateRemoteThread(MyRemoteProcessId, 0, 0, MyAddr, MyDllFileBuffer, 0, 0)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#39;好了,现在用Cr&#101;ateRemoteThread在目标进程创建一个线程，线程起始地址指向LoadLibraryA， _<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 参数就是MyDllFileBuffer中保存的dll路径。<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;If MyResult = 0 Then MsgBox &#34;error Cr&#101;ateRemoteThread&#34;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#39;接下来你可以使用WaitForSingleObject等待线程执行完毕。 _<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 并用GetExitCodeThread得到线程的退出代码，用来判断时候正确执行了dll中的代码。<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CloseHandle MyResult<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CloseHandle MyRemoteProcessId<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#39;扫地工作<br/>&nbsp;&nbsp;&nbsp;&nbsp;End If<br/>Loop While Process32Next(MySnapHandle, ProcessInfo) &lt;&gt; 0<br/>End If<br/><br/>CloseHandle MySnapHandle<br/>End Sub<br/><br/>Private Sub Command1_Click() &#39;点击注入按钮<br/>Inject &#39;执行注入<br/>End Sub<br/><br/>接下来我们讲怎么把注入进去的dll卸载掉，其实与注入基本上是一样的，只不过用到的API要换一下。<br/>我们先在目标进程当中执行GetModuleHandleA，得到我们dll的句柄，然后再远程执行FreeLibrary，把我们的dll卸载。<br/>那么这里有个问题，如何得到GetModuleHandleA的返回值呢？<br/>那就要用到WaitForSingleObject，这个函数的作用是等待远程线程执行完毕，之后我们只要调用GetExitCodeThread得到远程线程的退出码就行了。因为远程线程是调用GetModuleHandleA，所以退出码就是GetModuleHandleA的返回值。<br/><br/>代码如下：<br/><br/> <br/><br/> 程序代码<br/><br/>Private Sub Enject()<br/><br/>Dim MySnapHandle As Long<br/>Dim ProcessInfo As PROCESSENTRY32<br/>Dim MyRemoteProcessId As Long<br/>Dim MyDllFileLength As Long<br/>Dim MyDllFileBuffer As Long<br/>Dim MyReturn As Long<br/>Dim MyAddr As Long<br/>Dim MyResult As Long<br/>Dim MyDllFileName As String<br/>Dim dwHandle As Long<br/><br/>MySnapHandle = Cr&#101;ateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0)<br/>ProcessInfo.dwSize = Len(ProcessInfo)<br/><br/><br/>If Process32First(MySnapHandle, ProcessInfo) &lt;&gt; 0 Then<br/>Do<br/>&nbsp;&nbsp;&nbsp;&nbsp;If InStr(ProcessInfo.szExeFile, &#34;explorer.exe&#34;) &gt; 0 Then<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MyRemoteProcessId = OpenProcess(PROCESS_ALL_ACCESS, False, ProcessInfo.th32ProcessID)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;If MyRemoteProcessId = 0 Then MsgBox &#34;error OpenProcess&#34;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MyStartAddr = GetProcAddress(GetModuleHandle(&#34;Kernel32&#34;), &#34;GetModuleHandleA&#34;)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#39;与注入一样,只不过这里换成了GetModuleHandleA. _<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 原理就是先在目标进程执行GetModuleHandleA得到我们的dll的地址，然后再用FreeLibrary卸载掉我们的dll。<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;If MyStartAddr = 0 Then MsgBox &#34;error GetProcAddress&#34;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MyDllFileName = IIf(LCase(Right(Text1, 4)) = &#34;.dll&#34;, Text1, Text1.Text &amp; &#34;.dll&#34;)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MyDllFileLength = LenB(StrConv(MyDllFileName, vbFromUnicode)) + 1<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MyDllFileBuffer = VirtualAllocEx(MyRemoteProcessId, 0, MyDllFileLength, MEM_COMMIT, PAGE_READWRITE)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;If MyDllFileBuffer = 0 Then MsgBox &#34;error VirtualAllocEx&#34;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MyReturn = WriteProcessMemory(MyRemoteProcessId, MyDllFileBuffer, ByVal (MyDllFileName), MyDllFileLength, temp)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;If MyReturn = 0 Then MsgBox &#34;error WriteProcessMemory&#34;<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MyResult = Cr&#101;ateRemoteThread(MyRemoteProcessId, 0, 0, MyAddr, MyDllFileBuffer, 0, temp)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#39;都与注入一样。执行到这里就得到了<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;WaitForSingleObject MyResult, INFINITE &#39;等待远程线程执行完毕。<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;GetExitCodeThread MyResult, dwHandle &#39;这里可以得到远程线程的返回值，也就是GetModuleHandleA返回的我们的dll的句柄。<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;VirtualFreeEx MyRemoteProcessId, MyDllFileBuffer, MyDllFileLength, MEM_DECOMMIT<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#39;释放掉我们申请的内存段<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CloseHandle MyResult<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MyAddr = GetProcAddress(GetModuleHandle(&#34;Kernel32&#34;), &#34;FreeLibrary&#34;)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;If MyAddr = 0 Then MsgBox &#34;error FreeLibrary&#34;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MyResult = Cr&#101;ateRemoteThread(MyRemoteProcessId, 0, 0, MyAddr, dwHandle, 0, temp)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#39;这次不需要再用WriteProcessMemory写入FreeLibrary的参数了， _<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 因为我们的dll的句柄刚才已经保存在dwHandle里面了。<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;If MyResult = 0 Then MsgBox &#34;error Cr&#101;ateRemoteThread&#34;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CloseHandle MyResult<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CloseHandle MyRemoteProcessId<br/>&nbsp;&nbsp;&nbsp;&nbsp;End If<br/>Loop While Process32Next(MySnapHandle, ProcessInfo) &lt;&gt; 0<br/>End If<br/><br/><br/>CloseHandle MySnapHandle<br/><br/>End Sub<br/> <br/><br/>我们再加上几个按钮的动作，整个注入程序就完成了<br/> <br/><br/> 程序代码<br/><br/>Private Sub Command1_Click()<br/>Inject<br/>End Sub<br/><br/>Private Sub Command2_Click()<br/>Enject<br/>End Sub<br/><br/>Private Sub Form_Load()<br/>Text1 = GetSetting(App.Title, &#34;dllname&#34;, &#34;dllname&#34;)<br/>End Sub<br/><br/>Private Sub Form_Unload(Cancel As Integer)<br/>SaveSetting App.Title, &#34;dllname&#34;, &#34;dllname&#34;, Text1<br/>End Sub<br/><br/>Private Sub Text1_GotFocus()<br/>Text1.SelStart = 0<br/>Text1.SelLength = Len(Text1.Text)<br/>End Sub<br/> <br/><br/><br/>在text1里面输入想要注入的dll文件名，然后点Command1就行了。<br/><br/>明天讲注入的dll怎么写……<br/><br/>实在对不起，最近太忙了，没什么时间更新blog。<br/><br/>今天讲一下dll怎么写。<br/><br/>需要装一个vb插件：vbAdvance<br/>利用它可以让生成dll文件。<br/><br/>具体用法我就不讲了，很简单。我主要讲一下代码。<br/>由于是利用loadlibrary来注入，所以只会执行dllmain函数，然后返回<br/>因为dll不是exe，没有自己的消息循环，执行完了dllmain函数就返回了，所以我们要想个办法让他一直可以发挥作用。其实很简单，就是SetTimer和KillTimer。<br/>新建一个工程，类型选择vbAdvance提供的dll模板<br/> <br/><br/> 程序代码<br/><br/>Option Explicit<br/>Private Declare Function SetTimer Lib &#34;user32&#34; (ByVal hwnd As Long, ByVal nIDEvent As Long, ByVal uElapse As Long, ByVal lpTimerFunc As Long) As Long<br/>Private Declare Function KillTimer Lib &#34;user32&#34; (ByVal hwnd As Long, ByVal nIDEvent As Long) As Long<br/>Private Declare Function MessageBox Lib &#34;user32&#34; Alias &#34;MessageBoxA&#34; (ByVal hwnd As Long, ByVal lpText As String, ByVal lpCaption As String, ByVal wType As Long) As Long<br/><br/>Private Const DLL_PROCESS_ATTACH&nbsp;&nbsp;&nbsp;&nbsp;As Long = 1<br/>Private Const DLL_THREAD_ATTACH&nbsp;&nbsp;&nbsp;&nbsp; As Long = 2<br/>Private Const DLL_PROCESS_DETACH&nbsp;&nbsp;&nbsp;&nbsp;As Long = 0<br/>Private Const DLL_THREAD_DETACH&nbsp;&nbsp;&nbsp;&nbsp; As Long = 3<br/><br/>&#39;这个是Dll主函数，加载/卸载dll时会调用<br/>Public Function DllMain(ByVal hinstDLL As Long, ByVal fdwReason As Long, ByVal lpvReserved As Long) As Long<br/>Sel&#101;ct Case fdwReason<br/>&nbsp;&nbsp;&nbsp;&nbsp;Case DLL_PROCESS_ATTACH &#39;dll加载<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#39;RuntimeInitialize hinstDLL &#39;vbAdvance提供的初始化函数，用来初始化vb运行库。我这里没有用，这样我们就不能使用vb的函数了，都要自己实现。<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;getHandle<br/>&nbsp;&nbsp;&nbsp;&nbsp;Case DLL_PROCESS_DETACH &#39;dll卸载<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;KillTimer Handle, 1 &#39;杀掉timer<br/>End Sel&#101;ct<br/>DllMain = 1 &#39;返回true。<br/>End Function<br/><br/>Private Sub getHandle()<br/>&nbsp;&nbsp;&nbsp;&nbsp;Handle = FindWindow(&#34;Progman&#34;, &#34;Program Manager&#34;) &#39;用来得到explorer.exe的句柄，当然，你也可以用GetCurrentProcess，因为此时dll已经是explorer.exe进程的一部分了<br/>&nbsp;&nbsp;&nbsp;&nbsp;SetTimer Handle, 1, 5000, AddressOf timer1_Timer &#39;SetTimer第一个参数是进程句柄，我们把explorer句柄传进去，第二个是timer的编号，用来区分timer的。第三个是时间间隔。第四个参数是一个回调函数。我们用AddressOf操作符把timer1_Timer函数的地址传进去。这样到了我们设定的时间间隔，系统就会自动调用timer_timer<br/>End Sub<br/><br/>Public Sub timer_Timer()<br/>&nbsp;&nbsp;&nbsp;&nbsp;&#39;这里就可以做你想做的事情了。<br/>&nbsp;&nbsp;&nbsp;&nbsp;&#39;这个例子当中，此过程每5秒执行一次。<br/>end Sub<br/> <br/><br/><br/>另外我们可以改写默认的窗口函数，接收消息。这样我们可以利用我们的程序向被注入的进程发送消息来控制dll。<br/><br/>dll注入到此就结束了。<br/>这篇文章有点凑数了，还望海涵。<br/><br/>]]></summary>
	  <link rel="alternate" type="text/html" href="http://www.chinahacker.net/article.asp?id=108" /> 
	  <id>http://www.chinahacker.net/default.asp?id=108</id>
  </entry>	
		
  <entry>
	  <title type="html"><![CDATA[最简单的VB动态调用外部函数源代码（vb使用函数指针）VB use function pointer]]></title>
	  <author>
		 <name>gaby</name>
		 <uri>http://www.chinahacker.net/</uri>
		 <email>freeshell2002@yahoo.com</email>
	  </author>
	  <category term="" scheme="http://www.chinahacker.net/default.asp?cateID=4" label="网文网摘" /> 
	  <updated>2010-03-19T13:56:07+08:00</updated>
	  <published>2010-03-19T13:56:07+08:00</published>
		  <summary type="html"><![CDATA[此篇博文为<br/><a href="http://www.vbgood.com/viewthread.php?tid=69444" target="_blank" rel="external">http://www.vbgood.com/viewthread.php?tid=69444</a>&amp;extra=page%3D1<br/>的源代码<br/><br/><br/>实现思路:<br/>我是个懒人，我的目标就是干最少的活，完成最多的事情。<br/>当我看到网上那么多帖子中讨论的方法都很麻烦时，我觉得应该有更简单的办法。<br/>调用api(或者其他函数指针)其实就是call过去，我的第一反应是：<br/>建一个空的function。<br/>得到api的入口，然后复制代码，覆盖掉我的function。<br/>执行我的function就等于执行了api。<br/><br/>但仔细一想不行，很多api会jmp +xxx，这样的话，我不能保证把jmp到的代码都复制下来<br/>如果自己检测jmp，会变得很麻烦。<br/><br/>那么如果复制代码不行，那我不复制行不行？<br/>接下来很容易就想到了，为什么不改写我的function，让他直接跳转到api呢？<br/>好像可以耶~call不行，因为会有压栈动作，我这个汇编盲这点还是知道的。<br/>那么就jmp吧……最近看api hook看得太多了，经典的5个字节。<br/>jmp的好处多多，没有任何多余动作，参数完整保留到jmp目的地。<br/><br/>问题又来了，怎么才可以知道我的function在哪里呢？<br/>容易，经常用到回调函数的朋友一定知道Addressof操作符吧，它的作用就是返回函数的入口。<br/>但是vb里面是不能直接使用a=Addressof b的，必须在函数中调用。那么我们就走个弯路：<br/>a=Clng(&#34;&amp;H&#34; &amp; Hex(Addressof b))<br/>把Addressof b当作参数传给Hex函数就可以了，得到16进制，然后再用Clng转换成10进制。<br/>这样就得到了b函数的地址了。<br/>那么接下来就容易了，只要在a地址处写入5个字节就行了，具体哪五个字节其实我也不知道，<br/>我随便找了个程序，od载入一下，找了个jmp看一下16进制代码，明白了，原来是E9啊。<br/>后面4个字节容易，算一下就行了。它=目标地址-E9的地址-5。<br/><br/>好了，问题基本解决。那么参数呢？走一步算一步吧，实验对象经典的MessageBoxA<br/>4个参数。那么我就新建一个模块，输入2行代码：<br/>Public Function myFunc(ByVal a As Long = 0, ByVal b As Long = 0, ByVal c As Long = 0, ByVal d As Long = 0) As Long<br/>End Function<br/>再来个主窗口：<br/>text1=Clng(&#34;&amp;H&#34; &amp; Hex(Addressof myFunc))<br/>再来个按钮：<br/>call myFunc(0,0,0,0)<br/><br/>编译，od载入，ctrl+g到text1里显示的地址，哈哈<br/>xor eax,eax<br/>ret<br/>nop<br/>还真简单，od里at MessageBoxA，然后记下MessageBoxA的地址，<br/>返回myFunc地址，把原来的代码修改成jmp MessageBoxA-myFuc -5。<br/>回到程序里点按钮，哈哈，msgbox出现了。<br/><br/>接下来就容易了，先测试下传参数怎么样。<br/>call myFunc(me.hwnd, strptr(&#34;123&#34;),strptr(&#34;456&#34;),0)<br/>因为myFunc的原型4个参数都是byval的long,而MessageBoxA的2、3个参数是字符串指针，<br/>所以我就用strptr得到字符串的地址，然后传过去，就不会有问题了。<br/>执行一下，果然没错。<br/><br/>再来看看多个参数怎么办。我想到了Optional,这样就可以不用管参数个数了。<br/>因为如果有2个必选参数，4个Optional参数，那么你传2个参数进去，后面的4个参数因为不存在就不会压栈，<br/>如果api有3、4、5、6个参数，我只要按参数个数传就可以了，少于myFunc的参数会自动省略掉。这是我觉得最巧妙的地方,所以不会有参数数量问题<br/><br/>试验一下吧：<br/>改成<br/>Public Function myFunc(Optional ByVal a As Long = 0, Optional ByVal b As Long = 0, Optional ByVal c As Long = 0, _<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Optional ByVal d As Long = 0, Optional ByVal e As Long = 0, Optional ByVal f As Long = 0) As Long<br/><br/>End Function<br/>其他不变。。。执行一下看看，omg，成功了，哈~<br/>写上10个参数，应该可以应付任何api了吧？<br/><br/>哈哈，那么到这里原理大家都明白了吧？<br/>至于如何写入那5个字节的jmp就随意了，CopyMemory和WriteProcessMemory都可以<br/>我的程序用的是WriteProcessMemory，用起来顺手。<br/>剩下的大家就看源代码吧~实现的核心代码其实就8行<br/><img src="http://www.chinahacker.net/images/download.gif" alt="下载文件" style="margin:0px 2px -4px 0px"/> <a href="http://www.chinahacker.net/attachments/month_1003/8201031913564.rar" target="_blank">点击下载此文件</a><br/>]]></summary>
	  <link rel="alternate" type="text/html" href="http://www.chinahacker.net/article.asp?id=107" /> 
	  <id>http://www.chinahacker.net/default.asp?id=107</id>
  </entry>	
		
  <entry>
	  <title type="html"><![CDATA[一些Ring3下结束进程的方法.Ring3 terminate-process method]]></title>
	  <author>
		 <name>gaby</name>
		 <uri>http://www.chinahacker.net/</uri>
		 <email>freeshell2002@yahoo.com</email>
	  </author>
	  <category term="" scheme="http://www.chinahacker.net/default.asp?cateID=4" label="网文网摘" /> 
	  <updated>2010-03-19T13:46:34+08:00</updated>
	  <published>2010-03-19T13:46:34+08:00</published>
		  <summary type="html"><![CDATA[OpenProcess-&gt;TerminateProcess 这个很常用<br/><br/>OpenProcess-&gt;Cr&#101;ateRemoteThread-&gt;ExitProcess 这个比较麻烦<br/><br/>下面的大多数是用ntdll.dll中的函数了。。用来结束一些顽固进程<br/><br/>Thread32First/Thread32Next-&gt;OpenThread-&gt;TerminateThread<br/><br/>DebugActiveProcess<br/><br/>ZwOpenProcess-&gt;ZwTerminateProcess<br/><br/>ZwOpenProcess(PID+1/+2/+3)-&gt;ZwTerminateProcess<br/><br/>ZwOpenProcess-&gt;ZwProtectVirtualMemory-&gt;ZwWriteVirtualMemory<br/><br/>ZwQueryInformationProcess-&gt;ZwOpenThread-&gt;ZwTerminateThread<br/><br/>ZwQuerySystemInformation-&gt;ZwOpenProcess-&gt;ZwDuplicateHandle-&gt;ZwQueryInformationProcess-&gt;ZwTerminateProcess<br/><br/>ZwQuerySystemInformation-&gt;ZwOpenProcess-&gt;ZwDuplicateHandle-&gt;ZwQueryInformationThread-&gt;ZwTerminateThread<br/><br/>ZwQuerySystemInformation-&gt;ZwOpenProcess-&gt;ZwDuplicateHandle-&gt;ZwQueryInformationProcess-&gt;DbgUiDebugActiveProcess<br/><br/>3种经典方法：<br/><br/>PostMessage(WM_CLOSE)<br/><br/>PostMessage(WM_QUIT)<br/><br/>PostMessage(NC_DESTORY)<br/>]]></summary>
	  <link rel="alternate" type="text/html" href="http://www.chinahacker.net/article.asp?id=106" /> 
	  <id>http://www.chinahacker.net/default.asp?id=106</id>
  </entry>	
		
  <entry>
	  <title type="html"><![CDATA[教你自制最便宜的时光机]]></title>
	  <author>
		 <name>gaby</name>
		 <uri>http://www.chinahacker.net/</uri>
		 <email>freeshell2002@yahoo.com</email>
	  </author>
	  <category term="" scheme="http://www.chinahacker.net/default.asp?cateID=4" label="网文网摘" /> 
	  <updated>2010-03-19T13:42:53+08:00</updated>
	  <published>2010-03-19T13:42:53+08:00</published>
		  <summary type="html"><![CDATA[1、准备一张厚厚的，防水的，质量好的纸，至少要100克的，但表面不能太光滑，防止墨迹脱落。<br/><br/>2、在纸上用郑重的语气写上，给我的第N代子孙，我是你的祖先XXX，出生在XXXX年，我留下这张纸的时间是XXX年XX月XX日.........................<br/><br/>3、按照以上的基调，写完这封信，明确提出要你的子孙坐时光机回来看你。<br/><br/>4、最后别忘了说一句，“如果你们那个年代还没发明时光机，请继续封存这封信给你的子孙”<br/><br/>5、用一个绝对可靠的保险箱把这封信存起来，当然，要非常小心，保证几百上千年后你的子孙必然会看到。<br/><br/>6、如果一切顺利，几分钟之内你就可以看到你的子孙坐着时光机，轰然而来。。。 否则即可证明未来不会有时光机<br/><br/><br/>成功的朋友请在这留言。]]></summary>
	  <link rel="alternate" type="text/html" href="http://www.chinahacker.net/article.asp?id=105" /> 
	  <id>http://www.chinahacker.net/default.asp?id=105</id>
  </entry>	
		
  <entry>
	  <title type="html"><![CDATA[一道很黄很暴力的智力题]]></title>
	  <author>
		 <name>gaby</name>
		 <uri>http://www.chinahacker.net/</uri>
		 <email>freeshell2002@yahoo.com</email>
	  </author>
	  <category term="" scheme="http://www.chinahacker.net/default.asp?cateID=4" label="网文网摘" /> 
	  <updated>2010-03-19T12:54:21+08:00</updated>
	  <published>2010-03-19T12:54:21+08:00</published>
		  <summary type="html"><![CDATA[有这样一道智力题，感觉很有有意思，在这里写一下，呵呵。<br/><br/>两个男的两个女的都有性病。现在只有两个套套，问怎么才能让两个男的分别和两个女的搞（就是说总共要搞4次）而不交叉感染。任两个人之间有间接的XX都算要感染。套套可以重复用（就是说可以不射）。<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;为了让大家理解题意，这里再说明一下传统的方法为什么是错的。如果让两个男的各套各的套，依次搞两个女的，那么两个女的就要交叉感染，因为同一个套套接触过两个女的。<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;答案在下面，白的。<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;让第一个男的同时戴两个套套（这样很爽的:-) ），把第一个女的干了，然后把外面那层套套取出来给第二个男的戴上，让第二个男的也把第一个女的搞了；第一个男的接着（用他里面那个套套）把剩下的那个MM做了，然后把套套取下来给第二个男的套在外面（第二个男的就套了两个套了），让第二个男的搞第二个女的。<br/>]]></summary>
	  <link rel="alternate" type="text/html" href="http://www.chinahacker.net/article.asp?id=104" /> 
	  <id>http://www.chinahacker.net/default.asp?id=104</id>
  </entry>	
		
  <entry>
	  <title type="html"><![CDATA[Freeiris-老杨语录]]></title>
	  <author>
		 <name>gaby</name>
		 <uri>http://www.chinahacker.net/</uri>
		 <email>freeshell2002@yahoo.com</email>
	  </author>
	  <category term="" scheme="http://www.chinahacker.net/default.asp?cateID=4" label="网文网摘" /> 
	  <updated>2010-02-10T18:49:13+08:00</updated>
	  <published>2010-02-10T18:49:13+08:00</published>
		  <summary type="html"><![CDATA[人生最重要的不是所在的位置，而是所朝的方向。同样是个B，你一路向北能变成NB，撞破南墙不回头，就只能当个SB。]]></summary>
	  <link rel="alternate" type="text/html" href="http://www.chinahacker.net/article.asp?id=102" /> 
	  <id>http://www.chinahacker.net/default.asp?id=102</id>
  </entry>	
		
  <entry>
	  <title type="html"><![CDATA[squid 2.7 通过域名反向代理多个服务器配置成功[转]]]></title>
	  <author>
		 <name>gaby</name>
		 <uri>http://www.chinahacker.net/</uri>
		 <email>freeshell2002@yahoo.com</email>
	  </author>
	  <category term="" scheme="http://www.chinahacker.net/default.asp?cateID=4" label="网文网摘" /> 
	  <updated>2010-02-02T12:23:38+08:00</updated>
	  <published>2010-02-02T12:23:38+08:00</published>
		  <summary type="html"><![CDATA[visible_hostname squid1.abc.com<br/><br/>#设定squid的主机名,如无此项squid将无法启动<br/><br/>http_port 80 accel vhost vport<br/><br/>#设定squid为accel加速模式,vhost必须要加.否则将无法将主机头转发至后端服务器,访问时就会出现无法找到主机头的错误<br/><br/>cache_peer 192.168.1.88 parent 80 0 no-query o&#114;iginserver name=contentchina<br/><br/>cache_peer 192.168.1.88 parent 80 0 no-query o&#114;iginserver name=bbs<br/><br/>cache_peer 192.168.1.1 parent 80 0 no-query o&#114;iginserver name=ihompy<br/><br/>#定义不同的父节点,将节点设为no-query以及originserver说明这些节点是实际服务器<br/><br/>cache_peer_domain contentchina aaa.abc.com<br/><br/>cache_peer_domain bbs bbb.abc.com<br/><br/>cache_peer_domain ihompy ccc.abc.com<br/><br/>#设定不同域名转发到不同的cache_peer上,如果没有这项.不同域名的域名可能被分发到同一台服务器上.<br/><br/>acl all src 0.0.0.0/0.0.0.0<br/><br/>no_cache deny all<br/><br/>http_access allow all<br/><br/>#允许所有客户端访问<br/><br/>cache_log /var/log/squid/cache.log<br/><br/>#记录日志<br/><br/>#***********ACL存取控制*************<br/><br/>#acl QueryString url_regex .php?<br/><br/>#***********缓冲存取控制*************<br/><br/>#no_cache deny QueryString<br/><br/>#不对符合QueryString的ACL内容进行缓冲<br/><br/>#***********性能优化配置*************<br/><br/>maximum_object_size 320010 KB<br/><br/>#大于此容量的对象将不会被保存在磁盘上,默认大小是4M,如果squid服务器用于缓冲flash等大型文件,建议将此值变大.否则过大的文件在下次重启后将需要重新获取<br/><br/>maximum_object_size_in_memory 100 KB<br/><br/>#最大位于内存中的对象的大小,默认大小是8K,如果服务器内存很大.可以适当提高此值的大小,建议根据网站的80%图片的大小来定.或者根据WEB服务器实际存取文件中最常访问的文件大小来定制<br/><br/>#***********其他可选配置*************<br/><br/>#dns_nameservers 10.0.0.1 192.172.0.4<br/><br/>#配置DNS服务器地址.获取后端时将从此dns获取IP地址<br/><br/>#cache_mgr ggg_g@tom.com<br/><br/>#在错误日志中出现的webmaster地址.]]></summary>
	  <link rel="alternate" type="text/html" href="http://www.chinahacker.net/article.asp?id=101" /> 
	  <id>http://www.chinahacker.net/default.asp?id=101</id>
  </entry>	
		
</feed>

