﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>C++博客-geforceX的编程小苑-文章分类-备看文档</title><link>http://www.cppblog.com/geforcex/category/435.html</link><description /><language>zh-cn</language><lastBuildDate>Fri, 23 May 2008 19:38:15 GMT</lastBuildDate><pubDate>Fri, 23 May 2008 19:38:15 GMT</pubDate><ttl>60</ttl><item><title>数据加密技术介绍</title><link>http://www.cppblog.com/geforcex/articles/7766.html</link><dc:creator>geforceX</dc:creator><author>geforceX</author><pubDate>Sun, 28 May 2006 03:42:00 GMT</pubDate><guid>http://www.cppblog.com/geforcex/articles/7766.html</guid><wfw:comment>http://www.cppblog.com/geforcex/comments/7766.html</wfw:comment><comments>http://www.cppblog.com/geforcex/articles/7766.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/geforcex/comments/commentRss/7766.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/geforcex/services/trackbacks/7766.html</trackback:ping><description><![CDATA[我们经常需要一种措施来保护我们的数据，防止被一些怀有不良用心的人所看到或者破坏。在信息时代，信息可以帮助团体或个人，使他们受益，同样，信息也可以用来对他们构成威胁，造成破坏。在竞争激烈的大公司中，工业间谍经常会获取对方的情报。因此，在客观上就需要一种强有力的安全措施来保护机密数据不被窃取或篡改。数据加密与解密从宏观上讲是非常简单的，很容易理解。加密与解密的一些方法是非常直接的，很容易掌握，可以很方便的对机密数据进行加密和解密。 <br />　　一：数据加密方法 <br /><br />　　在传统上，我们有几种方法来加密数据流。所有这些方法都可以用软件很容易的实现，但是当我们只知道密文的时候，是不容易破译这些加密算法的（当同时有原文和密文时，破译加密算法虽然也不是很容易，但已经是可能的了）。最好的加密算法对系统性能几乎没有影响，并且还可以带来其他内在的优点。例如，大家都知道的PKZIP，它既压缩数据又加密数据。又如，DBMS的一些软件包总是包含一些加密方法以使复制文件这一功能对一些敏感数据是无效的，或者需要用户的密码。所有这些加密算法都要有高效的加密和解密能力。 <br /><br />　　幸运的是，在所有的加密算法中最简单的一种就是“置换表”算法，这种算法也能很好达到加密的需要。每一个数据段（总是一个字节）对应着“置换表”中的一个偏移量，偏移量所对应的值就输出成为加密后的文件。加密程序和解密程序都需要一个这样的“置换表”。事实上，80x86 CPU系列就有一个指令‘XLAT’在硬件级来完成这样的工作。这种加密算法比较简单，加密解密速度都很快，但是一旦这个“置换表”被对方获得，那这个加密方案就完全被识破了。更进一步讲，这种加密算法对于黑客破译来讲是相当直接的，只要找到一个“置换表”就可以了。这种方法在计算机出现之前就已经被广泛的使用。 <br /><br />　　对这种“置换表”方式的一个改进就是使用2个或者更多的“置换表”，这些表都是基于数据流中字节的位置的，或者基于数据流本身。这时，破译变的更加困难，因为黑客必须正确的做几次变换。通过使用更多的“置换表”，并且按伪随机的方式使用每个表，这种改进的加密方法已经变的很难破译。比如，我们可以对所有的偶数位置的数据使用A表，对所有的奇数位置使用B表，即使黑客获得了明文和密文，他想破译这个加密方案也是非常困难的，除非黑客确切的知道用了两张表。 <br /><br />　　与使用“置换表”相类似，“变换数据位置”也在计算机加密中使用。但是，这需要更多的执行时间。从输入中读入明文放到一个buffer中，再在buffer中对他们重排序，然后按这个顺序再输出。解密程序按相反的顺序还原数据。这种方法总是和一些别的加密算法混合使用，这就使得破译变的特别的困难，几乎有些不可能了。例如，有这样一个词，变换起字母的顺序，slient 可以变为listen，但所有的字母都没有变化，没有增加也没有减少，但是字母之间的顺序已经变化了。 <br /><br />　　但是，还有一种更好的加密算法，只有计算机可以做，就是字/字节循环移位和XOR操作。如果我们把一个字或字节在一个数据流内做循环移位，使用多个或变化的方向（左移或右移），就可以迅速的产生一个加密的数据流。这种方法是很好的，破译它就更加困难！而且，更进一步的是，如果再使用XOR操作，按位做异或操作，就就使破译密码更加困难了。如果再使用伪随机的方法，这涉及到要产生一系列的数字，我们可以使用Fibbonaci数列。对数列所产生的数做模运算（例如模3），得到一个结果，然后循环移位这个结果的次数，将使破译次密码变的几乎不可能！但是，使用Fibbonaci数列这种伪随机的方式所产生的密码对我们的解密程序来讲是非常容易的。 <br /><br />　　在一些情况下，我们想能够知道数据是否已经被篡改了或被破坏了，这时就需要产生一些校验码，并且把这些校验码插入到数据流中。这样做对数据的防伪与程序本身都是有好处的。但是感染计算机程序的病毒才不会在意这些数据或程序是否加过密，是否有数字签名。所以，加密程序在每次load到内存要开始执行时，都要检查一下本身是否被病毒感染，对与需要加、解密的文件都要做这种检查！很自然，这样一种方法体制应该保密的，因为病毒程序的编写者将会利用这些来破坏别人的程序或数据。因此，在一些反病毒或杀病毒软件中一定要使用加密技术。 <br /><br />　　循环冗余校验是一种典型的校验数据的方法。对于每一个数据块，它使用位循环移位和XOR操作来产生一个16位或32位的校验和 ，这使得丢失一位或两个位的错误一定会导致校验和出错。这种方式很久以来就应用于文件的传输，例如 XMODEM-CRC。 这是方法已经成为标准，而且有详细的文档。但是，基于标准CRC算法的一种修改算法对于发现加密数据块中的错误和文件是否被病毒感染是很有效的。 <br /><br />　　二．基于公钥的加密算法 <br /><br />　　一个好的加密算法的重要特点之一是具有这种能力：可以指定一个密码或密钥，并用它来加密明文，不同的密码或密钥产生不同的密文。这又分为两种方式：对称密钥算法和非对称密钥算法。所谓对称密钥算法就是加密解密都使用相同的密钥，非对称密钥算法就是加密解密使用不同的密钥。非常著名的PGP公钥加密以及RSA加密方法都是非对称加密算法。加密密钥，即公钥，与解密密钥，即私钥，是非常的不同的。从数学理论上讲，几乎没有真正不可逆的算法存在。例如，对于一个输入‘a’执行一个操作得到结果‘b’,那么我们可以基于‘b’，做一个相对应的操作，导出输入‘a’。在一些情况下，对于每一种操作，我们可以得到一个确定的值，或者该操作没有定义（比如，除数为0）。对于一个没有定义的操作来讲，基于加密算法，可以成功地防止把一个公钥变换成为私钥。因此，要想破译非对称加密算法，找到那个唯一的密钥，唯一的方法只能是反复的试验，而这需要大量的处理时间。 <br /><br />　　RSA加密算法使用了两个非常大的素数来产生公钥和私钥。即使从一个公钥中通过因数分解可以得到私钥，但这个运算所包含的计算量是非常巨大的，以至于在现实上是不可行的。加密算法本身也是很慢的，这使得使用RSA算法加密大量的数据变的有些不可行。这就使得一些现实中加密算法都基于RSA加密算法。PGP算法(以及大多数基于RSA算法的加密方法)使用公钥来加密一个对称加密算法的密钥，然后再利用一个快速的对称加密算法来加密数据。这个对称算法的密钥是随机产生的，是保密的，因此，得到这个密钥的唯一方法就是使用私钥来解密。 <br /><br />　　我们举一个例子：假定现在要加密一些数据使用密钥‘12345’。利用RSA公钥，使用RSA算法加密这个密钥‘12345’，并把它放在要加密的数据的前面（可能后面跟着一个分割符或文件长度，以区分数据和密钥），然后，使用对称加密算法加密正文，使用的密钥就是‘12345’。当对方收到时，解密程序找到加密过的密钥，并利用RSA私钥解密出来，然后再确定出数据的开始位置，利用密钥‘12345’来解密数据。这样就使得一个可靠的经过高效加密的数据安全地传输和解密。 <br /><br />　　一些简单的基于RSA算法的加密算法可在下面的站点找到： <br /><br />ftp://ftp.funet.fi/pub/crypt/cryptography/asymmetric/rsa <br /><br />　　三．一个崭新的多步加密算法 <br /><br />　　现在又出现了一种新的加密算法，据说是几乎不可能被破译的。这个算法在1998年6月1日才正式公布的。下面详细的介绍这个算法: <br /><br />　　使用一系列的数字（比如说128位密钥），来产生一个可重复的但高度随机化的伪随机的数字的序列。一次使用256个表项，使用随机数序列来产生密码转表，如下所示： <br /><br />　　把256个随机数放在一个距阵中，然后对他们进行排序，使用这样一种方式（我们要记住最初的位置）使用最初的位置来产生一个表，随意排序的表，表中的数字在0到255之间。如果不是很明白如何来做，就可以不管它。但是，下面也提供了一些原码（在下面）是我们明白是如何来做的。现在，产生了一个具体的256字节的表。让这个随机数产生器接着来产生这个表中的其余的数，以至于每个表是不同的。下一步，使用"shotgun technique"技术来产生解码表。基本上说，如果 a映射到b，那么b一定可以映射到a，所以b[a[n]] = n.（n是一个在0到255之间的数）。在一个循环中赋值，使用一个256字节的解码表它对应于我们刚才在上一步产生的256字节的加密表。 <br /><br />　　使用这个方法，已经可以产生这样的一个表，表的顺序是随机，所以产生这256个字节的随机数使用的是二次伪随机,使用了两个额外的16位的密码.现在，已经有了两张转换表，基本的加密解密是如下这样工作的。前一个字节密文是这个256字节的表的索引。或者，为了提高加密效果，可以使用多余8位的值，甚至使用校验和或者CRC算法来产生索引字节。假定这个表是256*256的数组,将会是下面的样子: <br /><br />crypto1 = a[crypto0][value] <br /><br />　　变量""crypto1""是加密后的数据，""crypto0""是前一个加密数据（或着是前面几个加密数据的一个函数值）。很自然的，第一个数据需要一个“种子”，这个“种子” 是我们必须记住的。如果使用256*256的表，这样做将会增加密文的长度。或者，可以使用你产生出随机数序列所用的密码，也可能是它的CRC校验和。顺便提及的是曾作过这样一个测试: 使用16个字节来产生表的索引,以128位的密钥作为这16个字节的初始的"种子"。然后，在产生出这些随机数的表之后，就可以用来加密数据，速度达到每秒钟100k个字节。一定要保证在加密与解密时都使用加密的值作为表的索引，而且这两次一定要匹配。 <br /><br />　　加密时所产生的伪随机序列是很随意的，可以设计成想要的任何序列。没有关于这个随机序列的详细的信息，解密密文是不现实的。例如：一些ASCII码的序列，如“eeeeeeee"可能被转化成一些随机的没有任何意义的乱码，每一个字节都依赖于其前一个字节的密文，而不是实际的值。对于任一个单个的字符的这种变换来说，隐藏了加密数据的有效的真正的长度。 <br /><br />　　如果确实不理解如何来产生一个随机数序列，就考虑FIBBONACCI数列，使用2个双字（64位）的数作为产生随机数的种子，再加上第三个双字来做XOR操作。 这个算法产生了一系列的随机数。算法如下： <br /><br />unsigned long dw1, dw2, dw3, dwMask; <br /><br />int i1; <br /><br />unsigned long aRandom[256]; <br /><br />dw1 = {seed #1}; <br /><br />dw2 = {seed #2}; <br /><br />dwMask = {seed #3}; <br /><br />// this gives you 3 32-bit "seeds", or 96 bits total <br /><br />for(i1=0; i1 &lt; 256; i1++) <br /><br />{ <br /><br />dw3 = (dw1 + dw2) ^ dwMask; <br /><br />aRandom[i1] = dw3; <br /><br />dw1 = dw2; <br /><br />dw2 = dw3; <br /><br />} <br /><br />如果想产生一系列的随机数字，比如说，在0和列表中所有的随机数之间的一些数，就可以使用下面的方法： <br /><br />int __cdecl MySortProc(void *p1, void *p2) <br /><br />{ <br /><br />unsigned long **pp1 = (unsigned long **)p1; <br /><br />unsigned long **pp2 = (unsigned long **)p2; <br /><br />if(**pp1 &lt; **pp2) <br /><br />return(-1); <br /><br />else if(**pp1 &gt; *pp2) <br /><br />return(1); <br /><br />return(0); <br /><br />} <br /><br />... <br /><br />int i1; <br /><br />unsigned long *apRandom[256]; <br /><br />unsigned long aRandom[256]; // same array as before, in this case <br /><br />int aResult[256]; // results go here <br /><br />for(i1=0; i1 &lt; 256; i1++) <br /><br />{ <br /><br />apRandom[i1] = aRandom + i1; <br /><br />} <br /><br />// now sort it <br /><br />qsort(apRandom, 256, sizeof(*apRandom), MySortProc); <br /><br />// final step - offsets for pointers are placed into output array <br /><br />for(i1=0; i1 &lt; 256; i1++) <br /><br />{ <br /><br />aResult[i1] = (int)(apRandom[i1] - aRandom); <br /><br />} <br /><br />... <br /><br />　　变量""aResult""中的值应该是一个排过序的唯一的一系列的整数的数组，整数的值的范围均在0到255之间。这样一个数组是非常有用的，例如：对一个字节对字节的转换表，就可以很容易并且非常可靠的来产生一个短的密钥（经常作为一些随机数的种子）。这样一个表还有其他的用处，比如说：来产生一个随机的字符，计算机游戏中一个物体的随机的位置等等。上面的例子就其本身而言并没有构成一个加密算法，只是加密算法一个组成部分。 <br /><br />　　作为一个测试，开发了一个应用程序来测试上面所描述的加密算法。程序本身都经过了几次的优化和修改，来提高随机数的真正的随机性和防止会产生一些短的可重复的用于加密的随机数。用这个程序来加密一个文件，破解这个文件可能会需要非常巨大的时间以至于在现实上是不可能的。 <br /><br />四．结论： <br /><br />　　由于在现实生活中，我们要确保一些敏感的数据只能被有相应权限的人看到，要确保信息在传输的过程中不会被篡改，截取，这就需要很多的安全系统大量的应用于政府、大公司以及个人系统。数据加密是肯定可以被破解的，但我们所想要的是一个特定时期的安全，也就是说，密文的破解应该是足够的困难，在现实上是不可能的，尤其是短时间内。 <br /><img src ="http://www.cppblog.com/geforcex/aggbug/7766.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/geforcex/" target="_blank">geforceX</a> 2006-05-28 11:42 <a href="http://www.cppblog.com/geforcex/articles/7766.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>DES算法简介</title><link>http://www.cppblog.com/geforcex/articles/7762.html</link><dc:creator>geforceX</dc:creator><author>geforceX</author><pubDate>Sun, 28 May 2006 02:50:00 GMT</pubDate><guid>http://www.cppblog.com/geforcex/articles/7762.html</guid><wfw:comment>http://www.cppblog.com/geforcex/comments/7762.html</wfw:comment><comments>http://www.cppblog.com/geforcex/articles/7762.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/geforcex/comments/commentRss/7762.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/geforcex/services/trackbacks/7762.html</trackback:ping><description><![CDATA[
		<img height="10" src="http://www.infosecurity.org.cn/article/images/2005061301/200561320243474877801.gif" width="10" border="0" />
		<font color="#003399">
				<b>1 简介</b>
		</font>
		<br />  DES是Data Encryption Standard（数据加密标准）的缩写。它是由IBM公司研制的一种加密算法，美国国家标准局于1977年公布把它作为非机要部门使用的数据加密标准，二十年来，它一直活跃在国际保密通信的舞台上，扮演了十分重要的角色[10]。<br />  DES是一个分组加密算法，他以64位为分组对数据加密。同时DES也是一个对称算法：加密和解密用的是同一个算法。它的密匙长度是56位（因为每个第8位都用作奇偶校验），密匙可以是任意的56位的数，而且可以任意时候改变。其中有极少量的数被认为是弱密匙，但是很容易避开他们。所以保密性依赖于密钥。<br /><b><font color="#003399"><img height="10" src="http://www.infosecurity.org.cn/article/images/2005061301/200561320243474877801.gif" width="10" border="0" /> 2 算法框架[11]</font></b>：<br />  DES对64(bit)位的明文分组M进行操作，M经过一个初始置换IP置换成m0，将m0明文分成左半部分和右半部分m0=(L0,R0)，各32位长。然后进行16轮完全相同的运算，这些运算被称为函数f，在运算过程中数据与密匙结合。经过16轮后，左，右半部分合在一起经过一个末置换，这样就完成了[12]。<br />  在每一轮中，密匙位移位，然后再从密匙的56位中选出48位。通过一个扩展置换将数据的右半部分扩展成48位，并通过一个异或操作替代成新的32位数据，在将其置换换一次。这四步运算构成了函数f。然后，通过另一个异或运算，函数f的输出与左半部分结合，其结果成为新的右半部分，原来的右半部分成为新的左半部分。将该操作重复16次，就实现了。具体图4所示。<br /><br />     <img src="http://www.cppblog.com/images/cppblog_com/geforcex/275/r_200561320243475877802.jpg" /><br /><br />                               图4　DES算法框图<br /><br /><b><font color="#003399"><img height="10" src="http://www.infosecurity.org.cn/article/images/2005061301/200561320243474877801.gif" width="10" border="0" /> 3 DES解密</font></b><br />  在经过所有的代替、置换、异或盒循环之后，你也许认为解密算法与加密算法完全不同。恰恰相反，经过精心选择的各种操作，获得了一个非常有用的性质：加密和解密使用相同的算法。<br />DES加密和解密唯一的不同是密匙的次序相反。如果各轮加密密匙分别是K1,K2,K3….K16那么解密密匙就是K16,K15,K14…K1。<br /><b><font color="#003399"><img height="10" src="http://www.infosecurity.org.cn/article/images/2005061301/200561320243474877801.gif" width="10" border="0" /> 4 DES的几种工作方式</font></b><br />  <font color="#cc3300">第一种电子密本方式（ECB）</font><br />   将明文分成n个64比特分组，如果明文长度不是64比特的倍数，则在明文末尾填充适当数目的规定符号。对明文组用给定的密钥分别进行加密，行密文C=(C0,C1,……,Cn-1)其中Ci=DES(K,xi),i=0,1,…..,n-1。<br />  <font color="#cc3300">第二种密文分组链接方式（CBC）</font><br />   在CBC方式下，每个明文组xi在加密前与先一组密文按位模二加后，再送到DES加密，CBC方式克服了ECB方式报内组重的缺点，但由于明文组加密前与一组密文有关，因此前一组密文的错误会传播到下一组。<br />  <font color="#cc3300">第三种密文反馈方式（CFB），可用于序列密码</font><br />   明文X＝(x0,x1,……,xn-1)，其中xi由t个比特组成0<t≤64。cfb实际上将des作为一个密钥流发生器，在t比特密文的反馈下，每次输出t比特乱数对t比特明文进行加密。由于cfb是密文反馈，它对密文错误较敏感，t比特密文中只要有一个比特错误，就会导致连续数个t 比特出错。<br="">   <font color="#cc3300">第四种输出反馈方式（OFB），可用于序列密码</font><br />   与CFB唯一不同的是OFB是直接取DES输出的t个比特，而不是取密文的t个比特，其余都与CFB相同。但它取的是DES的输出，所以它克服了CFB的密文错误传播的缺点 </t≤64。cfb实际上将des作为一个密钥流发生器，在t比特密文的反馈下，每次输出t比特乱数对t比特明文进行加密。由于cfb是密文反馈，它对密文错误较敏感，t比特密文中只要有一个比特错误，就会导致连续数个t><img src ="http://www.cppblog.com/geforcex/aggbug/7762.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/geforcex/" target="_blank">geforceX</a> 2006-05-28 10:50 <a href="http://www.cppblog.com/geforcex/articles/7762.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>提高RS-485网络可靠性的若干措施</title><link>http://www.cppblog.com/geforcex/articles/3526.html</link><dc:creator>geforceX</dc:creator><author>geforceX</author><pubDate>Sun, 26 Feb 2006 07:56:00 GMT</pubDate><guid>http://www.cppblog.com/geforcex/articles/3526.html</guid><wfw:comment>http://www.cppblog.com/geforcex/comments/3526.html</wfw:comment><comments>http://www.cppblog.com/geforcex/articles/3526.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/geforcex/comments/commentRss/3526.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/geforcex/services/trackbacks/3526.html</trackback:ping><description><![CDATA[<P style="MARGIN-TOP: 0px; MARGIN-BOTTOM: 0px; TEXT-INDENT: 24px" align=left><FONT class=v15><FONT color=#0000ff>徐继红（Maxim北京办事处）<BR></FONT><BR><BR>&nbsp;&nbsp;&nbsp; 建议性标准RS-485作为一种多点、差分数据传输的电气规范现已成为业界应用最为广泛的标准通信接口之一。这种通信接口允许在简单的一对双绞线上进行多点、双向通信、它所具有的噪声抑制能力、数据传输速率、电缆长度及可靠性是其他标准无法比拟的。正因为此，许多不同领域都采用RS-485作为数据传输链路。例如汽车电子、电信设备、局域网、蜂窝基站、工业控制、仪器仪表等等。这项标准得到广泛接受的另外一个原因是它的通用性。RS-485标准只对接口的电气特性做出规定，而不涉及接插件、电缆或协议，在此基础上用户可以建立自己的高层通信协议。</FONT></P>
<P style="MARGIN-TOP: 0px; MARGIN-BOTTOM: 0px; TEXT-INDENT: 24px" align=left><FONT class=v15>尽管RS-485标准已被广泛接受，但是对于它在实际应用中的一些具体问题并没有得到深入广泛的认识，甚至存在着种种误区，以至于影响到整个系统的性能。本文在回顾RS-485标准的基础上，重点讨论几个实际应用中常被忽视的问题。</FONT></P>
<P style="TEXT-INDENT: 24px" align=left><FONT class=v15><B>RS-485标准回顾</B></FONT></P>
<P style="MARGIN-TOP: 0px; MARGIN-BOTTOM: 0px; TEXT-INDENT: 24px" align=left><FONT class=v15>RS-485标准最初由电子工业协会（EIA）于1983年制订并发布，后由TIA-通讯工业协会修订后命名为TIA/EIA-485-A，不过工程师还是习惯地称之为RS-485。RS-485由RS-422发展而来，后者是为弥补RS-232之不足而提出的。为改进RS-232通信距离短、速率低的缺点，RS-422定义了一种平衡通信接口，将传输速率提高到10Mbps，传输距离延长到4000英尺（速率低于100kbps时），并允许在一条平衡线上连接最多10个接收器。RS-422是一种单机发送、多机接收的单向、平衡传输规范，为扩展应用范围，随后又为其增加了多点、双向通信能力，即允许多个发送器连接到同一条总线上，同时增加了发送器的驱动能力和冲突保护特性，扩展了总线共模范围，这就是后来的EIA RS-485标准。</FONT></P>
<P style="MARGIN-TOP: 0px; MARGIN-BOTTOM: 0px; TEXT-INDENT: 24px" align=left><FONT class=v15>RS-485是一个电气接口规范，它只规定了平衡驱动器和接收器的电特性，而没有规定接插件、传输电缆和通信协议。RS-485标准定义了一个基于单对平衡线的多点、双向（半双工）通信链路，是一种极为经济、并具有相当高噪声抑制、传输速率、传输距离和宽共模范围的通信平台。RS-485接口的主要特点如下：</FONT></P>
<UL>
<LI>平衡伟输； 
<LI>多点通信； 
<LI>驱动器输出电压（带载）：≥｜1.5V｜； 
<LI>接收器输入门限：±200mV； 
<LI>-7V至+12V总线共模范围； 
<LI>最大输入电流：1.0mA/-0.8mA（12Vin/-7Vin）； 
<LI>最大总线负载：32个单位负载（UL）； 
<LI>最大传输速率：10Mbps； 
<LI>最大电缆长度：4000英尺。 </LI></UL>
<P style="TEXT-INDENT: 24px"><FONT class=v15><B>网络配置</B></FONT> </P>
<P style="TEXT-INDENT: 24px"><FONT class=v15>RS-485支持半双工或全双工模式，网络拓扑一般采用终端匹配的总线型结构，不支持环形或星形网络。最好采用一条总线将各个节点串接起来，从总线到每个节点的引出线长度应尽量短，以便使引出线中的反射信号对总线信号的影响最低。图1所示为实际应用中常见的一些错误连接方式（a，c，e）和正确的连接方式（b，d，f）。a，c，e三种不恰当的网络连接尽管在某些情况下（短距离、低速率）仍然可以正常工作，但随着通信距离的延长或通信速率的提高，其不良影响会越来越严重，主要原因是信号在各支路末端反射后与原信号叠加，造成信号质量下降。除此之外还应注意总线特性阻抗的连续性，在阻抗不连续点也会发生信号的反射。例如，总线的不同区段采用不同电缆、某一段总线上有过多收发器紧靠在一起安装、或者是有过长分支线引出总线时都会出现阻抗不连续点。总之，应该提供一条单一、连续的信号通道作为总线。</FONT> </P>
<P align=center><IMG height=209 src="mhtml:file://E:\GYS\lunwen\lunwen\论文文献\485文献\提高RS-485网络可靠性的若干措施.mht!http://72hours.51.net/series/images/123-b-1.jpg" width=171 align=center border=0></P>
<P align=center><FONT class=v15 color=#000000>图1:几种错误的网络连接方式及正确的方式</FONT></P>
<P style="TEXT-INDENT: 24px" align=left><FONT class=v15>有关总线上允许连接的收发器数标准并没有做出规定，但规定了最大总线负载为32个单位负载（UL）。每单位负载的最大输入电流为1.0mA/-0.8mA，相当于约12kΩ。为了扩展总线节点数，器件生产厂商增大收发器输入电阻。例如MAX487，MAX1487的输入电阻增加至48kΩ以上（1/4UL），节点数就可增加至128个，96kΩ输入电阻的MAX1483允许节点数可到256个。</FONT></P>
<P style="TEXT-INDENT: 24px" align=left><FONT class=v15><B>总线匹配</B></FONT></P>
<P style="MARGIN-TOP: 0px; MARGIN-BOTTOM: 0px; TEXT-INDENT: 24px" align=left><FONT class=v15>是否对RS-485总线进行终端匹配取决于数据传输速率、电缆长度及信号转换速率。UART是在每个数据位的中点采样数据的，只要反射信号在开始采样时衰减到足够低就可以不考虑匹配。有一条经验性的准则可以用来判断在什么样的数据速率和电缆长度时需要进行匹配：当信号的转换时间（上升或下降时间）超过电信号沿总线单向传输所需时间的3倍以上时就可以不加匹配。例如具有限斜率特性的RS-485接口MAX483输出信号的上升或下降时间最小为250ns，典型双绞线上的信号传输速率约为0.2m/ns（24AWG PVC电缆），那么只要数据速率在250kbps以内、电缆长度不超过16米，采用MAX483作为RS-485接口时就可以不加终端匹配。</FONT></P>
<P style="MARGIN-TOP: 0px; MARGIN-BOTTOM: 0px; TEXT-INDENT: 24px" align=left><FONT class=v15>当考虑终端匹配时，有多种匹配方案可以选择。最简单的就是在总线两端各接一只阻值等于电缆特性阻抗的电阻（图2a）。大多数双绞线特性阻抗大约在100Ω至120Ω之间。这种匹配方法简单有效，但有一个缺点，匹配电阻要消耗较大功率，对于功耗限制比较严格的系统不太适合。另外一种比较省电的匹配方式是RC匹配（图2b）。利用一只电容C隔断直流成分可以节省大部分功率。但电容C的取值是个难点，需要在功耗和匹配质量间进行折衷。除上述两种外，还有一种采用二极管的匹配方案（图2c）。这种方案虽未实现真正的"匹配"，但它利用二极管的钳位作用迅速削弱反射信号，达到改善信号质量的目的。节能效果显著。</FONT></P>
<P align=center><IMG height=76 src="mhtml:file://E:\GYS\lunwen\lunwen\论文文献\485文献\提高RS-485网络可靠性的若干措施.mht!http://72hours.51.net/series/images/123-b-2.jpg" width=182 border=0></P>
<P align=center><FONT class=v15 color=#000000>图2：几种终端匹配方案</FONT></P>
<P style="TEXT-INDENT: 24px" align=left><FONT class=v15><B>引出线</B></FONT></P>
<P style="TEXT-INDENT: 24px" align=left><FONT class=v15>RS-485总线上的每个收发器通过一段引出线接入总线，引出线过长时，由于信号在引出线中的反射，也会影响总线上的信号质量。和前面的讨论一样，系统所能允许的引出线长度也和信号的转换时间、数据速率有关。下面的经验公式可以用来估算引出线的最大长度：</FONT></P>
<P style="TEXT-INDENT: 24px" align=left><FONT class=v15>Lmax=（tRISE×0.2m/ns）/10</FONT></P>
<P style="TEXT-INDENT: 24px" align=left><FONT class=v15>以MAX483为例，对应于250ns的上升/下降时间，总线允许的最大引出线长度约为5米。</FONT></P>
<P style="TEXT-INDENT: 24px" align=left><FONT class=v15>从以上的分析可以看出，减缓信号的前后沿斜率有利于降低对于总线匹配、引出线长度的要求，改善信号质量，同时，还使信号中的高频成分降低，减少电磁辐射，因此，有些器件生产厂商在RS-485接口器件中增加了摆率限制电路来减缓信号前后沿，但这种做法也限制了数据传输速率。由此看来，在选择接口器件时，并不是速率越高越好，应该根据系统要求，选择最低速率的器件。</FONT></P>
<P style="TEXT-INDENT: 24px" align=left><FONT class=v15><B>失效保护</B></FONT></P>
<P style="TEXT-INDENT: 24px" align=left><FONT class=v15>RS-485标准规定接收器门限为±200mV。这样规定能够提供比较高的噪声抑制能力，但同时也带来了一个问题：当总线电压在±200mV中间时接收器输出状态不确定。由于UART以一个前导"0"触发一次接收动作，所以接收器的不定态可能会使UART错误地接收一些数据，导致系统误动作。当总线空闲、开路或短路时都有可能出现两线电压差低于200mV的情况，必须采取一定措施避免接收器处于不定态。传统的做法是给总线加偏置，当总线空闲或开路时，利用偏置电阻将总线偏置在一个确定的状态（差分电压≥200mV）。但这种方法仍然不能解决总线短路时的问题，为此，有些器件制造商将接收门限移到-200mV/-50mV，巧妙地解决了这个问题。例如Maxim公司为MAX3080系列RS-485接口，不但省去了外部偏置电阻，而且解决了总线短路情况下的失效保护问题。</FONT></P>
<P style="TEXT-INDENT: 24px" align=left><FONT class=v15><B>地线与接地</B></FONT></P>
<P style="TEXT-INDENT: 24px" align=left><FONT class=v15>电子系统的接地是一个非常关键而又常常被忽视的问题，接地处理不当经常会导致不能稳定工作甚至危及系统安全。对于RS-485网络来讲也是一样，没有一个合理的接地系统可能会使系统的可靠性大打折扣，尤其是在工作环境比较恶劣的情况下，对于接地的要求更为严格。有关RS-485网络的接地问题很少有资料提及，在设计者中也存在着很多误区，致使通信可靠性降低、接口损坏率较高。一个典型的错误观点就是认为RS-485通信链路不需要信号地，而只是简单地用一对双绞线将各个接口的"A"、"B"端连接起来。这种处理方法在某些情况下也可以工作，但给系统埋下了隐患，主要有以下两方面的问题：</FONT></P>
<P align=center><IMG height=135 src="mhtml:file://E:\GYS\lunwen\lunwen\论文文献\485文献\提高RS-485网络可靠性的若干措施.mht!http://72hours.51.net/series/images/123-b-3.jpg" width=360 border=0></P>
<P align=center><FONT class=v15 color=#ff0000>图3:地电位差导致的共模干扰问题</FONT></P>
<UL>
<LI>
<P align=left>共模干扰问题。的确，RS-485接口采用差分方式传输信号，并不需要相对于某个参照点来检测信号，系统只需检测两线之间的电位差就可以了。但应该注意的是，收发器只有在共模电压不超出一定范围（-7V至+12V）的条件下才能正常工作。当共模电压超出此范围就会影响通信的可靠，直至损坏接口。如图3所示，当发送器A向接收器B发送数据时，发送器A的输出共模电压为VOS，由于两个系统具有各自独立的接地系统，存在着地电位差VGPD。那么，接收器输入端的共模电压就会达到VCM=VOS+VGPD。RS-485标准规定VOS≤3V，但VGPD可能会有很大幅度（十几伏甚至数十伏），并可能伴有强干扰信号，致使接收器共模输入VCM超出正常范围，并在信号线上产生干扰电流，轻则影响正常通信，重则损坏接口。</P>
<LI>
<P align=left>电磁辐射（EMI）问题。驱动器输出信号中的共模部分需要一个返回通路，如果没有一个低阻的返回通道（信号地），就会以辐射的形式返回源端，整个总线就会像一个巨大的天线向外辐射电磁波。</P></LI></UL>
<P style="TEXT-INDENT: 24px"><FONT class=v15>因此，尽管是差分传输，对于RS-485网络来讲，一条低阻的信号地还是必不可少的。如图4a所示，一条低阻的信号地将两个接口的工作地连接起来，使共模干扰电压VGPD被短路。这条信号地可以是额外的一对线（非屏蔽双绞线）、或者是屏蔽双绞线的屏蔽层。值得注意的是，这种做法仅对高阻型共模干扰有效，由于干扰源内阻大，短接后不会形成很大的接地环路电流，对于通信不会有很大影响。当共模干扰源内阻较低时，会在接地线上形成较大的环路电流，影响正常通信。笔者认为，可以采取以下三种措施：</FONT></P>
<P align=center><IMG height=125 src="mhtml:file://E:\GYS\lunwen\lunwen\论文文献\485文献\提高RS-485网络可靠性的若干措施.mht!http://72hours.51.net/series/images/123-b-4.jpg" width=360 border=0></P>
<P align=center><FONT class=v15 color=#ff0000>图4:地线与接地方案</FONT></P>
<P style="MARGIN-TOP: 0px; MARGIN-BOTTOM: 0px; MARGIN-LEFT: 42px; TEXT-INDENT: -18px" align=left>1、若干扰源内阻不是非常小，可以考虑在接地线上加限流电阻限制干扰电流。接地电阻的增加可能会使共模电压升高，但只要控制在适当的范围内就不会影响正常通信（图4b）；</P>
<P style="MARGIN-TOP: 0px; MARGIN-BOTTOM: 0px; MARGIN-LEFT: 42px; TEXT-INDENT: -18px" align=left>2、采用浮地技术，隔断接地环路。当共模干扰内阻很小时上述方法已不能奏效，此时可以考虑将引入干扰的节点（例如处于恶劣的工作环境的现场仪表）浮置起来（也就是系统的电路地与机壳或大地隔离），这样就隔断了接地环路，不会形成很大的环路电流（图4c）；</P>
<P style="MARGIN-TOP: 0px; MARGIN-BOTTOM: 0px; MARGIN-LEFT: 42px; TEXT-INDENT: -18px" align=left>3、采用隔离接口。有些情况下，出于安全或其他方面的考虑，电路地必须与机壳或大地相连，不能悬浮，这时可以采用隔离接口来隔断接地回路，但是仍然应该有一条地线将隔离侧的公共端与其它接口的工作地相连（图4d）。</P>
<P style="TEXT-INDENT: 24px"><FONT class=v15><B>瞬态保护</B></FONT></P>
<P style="MARGIN-TOP: 0px; MARGIN-BOTTOM: 0px; TEXT-INDENT: 24px"><FONT class=v15>前面提到的接地措施只对低频率的共模干扰有保护作用，对于频率很高的瞬态干扰就无能为力了。因为引线电感的作用，对于高频瞬态干扰来讲，接地线实际等同于开路。这样的瞬态干扰可能会有成百上千伏的电压，但持续时间很短。在切换大功率感性负载（电机、变压器、继电器等）、闪电等过程中都会产生幅度很高的瞬态干扰，如果不加以适当防护就会损坏接口。对于这种瞬态干扰可以采用隔离或旁路的方法加以防护。</FONT></P>
<P style="MARGIN-TOP: 0px; MARGIN-BOTTOM: 0px; TEXT-INDENT: 24px"><FONT class=v15>图5a所示为隔离保护方案。这种方案实际上将瞬态高压转移到隔离接口中的电隔离层上，由于隔离层的高绝缘电阻，不会产生损害性的浪涌电流，起到保护接口的作用。通常采用高频变压器、光耦等元件实现接口的电气隔离，已有器件厂商将所有这些元件集成在一片IC中，使用起来非常简便，如Maxim公司的MAX1480/MAX1490，隔离电压可以到2500V。这种方案的优点是可以承受高电压、持续时间较长的瞬态干扰，实现起来也比较容易，缺点是成本较高。</FONT></P>
<P style="MARGIN-TOP: 0px; MARGIN-BOTTOM: 0px; TEXT-INDENT: 24px"><FONT class=v15>图5b所示为旁路保护方案。这种方案利用瞬态抑制元件（如TVS、MOV、气体放电管等）将危害性的瞬态能量旁路到大地，优点是成本较低，缺点是保护能力有限，只能保护一定能量以内的瞬态干扰，持续时间不能很长，而且需要有一条良好的连接大地的通道，实现起来比较困难。</FONT></P>
<P style="MARGIN-TOP: 0px; MARGIN-BOTTOM: 0px; TEXT-INDENT: 24px"><FONT class=v15>实际应用中可以将二者结合起来灵活运用（图5c）。隔离接口对大幅度瞬态干扰进行隔离，而旁路元件保护隔离接口不被过高的瞬态电压击穿。</FONT></P>
<P align=center><IMG height=304 src="mhtml:file://E:\GYS\lunwen\lunwen\论文文献\485文献\提高RS-485网络可靠性的若干措施.mht!http://72hours.51.net/series/images/123-b-5.jpg" width=170 border=0></P>
<P align=center><FONT class=v15>图5：瞬态保护方案</FONT></P>
<P style="TEXT-INDENT: 24px"><FONT class=v15><B>结论</B></FONT></P>
<P style="TEXT-INDENT: 24px"><FONT class=v15>RS-485标准定义了一个极为坚固和可靠的通信链路，具有高噪声抑制、宽共模范围、长传输距离、冲突保护等特性，但一个真正可靠的RS-485网络还有赖于合理的应用。合理的网络布局、信号通道的连续性、周全的保护措施等，在设计之初就应该有一个总体规划。</FONT></P><img src ="http://www.cppblog.com/geforcex/aggbug/3526.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/geforcex/" target="_blank">geforceX</a> 2006-02-26 15:56 <a href="http://www.cppblog.com/geforcex/articles/3526.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>灰鸽子第四章：双管齐下，手工和软件清除灰鸽子</title><link>http://www.cppblog.com/geforcex/articles/2343.html</link><dc:creator>geforceX</dc:creator><author>geforceX</author><pubDate>Sun, 01 Jan 2006 03:41:00 GMT</pubDate><guid>http://www.cppblog.com/geforcex/articles/2343.html</guid><wfw:comment>http://www.cppblog.com/geforcex/comments/2343.html</wfw:comment><comments>http://www.cppblog.com/geforcex/articles/2343.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/geforcex/comments/commentRss/2343.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/geforcex/services/trackbacks/2343.html</trackback:ping><description><![CDATA[<SPAN class=tpc_content><FONT size=5><FONT color=red>灰鸽子第四章：双管齐下，手工和软件清除灰鸽子</FONT></FONT><BR><BR><FONT size=2>一.灰鸽子的手工检测<BR>&nbsp; 由于灰鸽子拦截了API调用，在正常模式下服务端程序文件和它注册的服务<BR><BR>项均被隐藏，也就是说你即使设置了“显示所有隐藏文件”也看不到它们。此外<BR><BR>，灰鸽子服务端的文件名也是可以自定义的，这都给手工检测带来了一定的困难<BR><BR>。<BR>&nbsp; 但是，通过仔细观察我们发现，对于灰鸽子的检测仍然是有规律可循的。从<BR><BR>上面的运行原理分析可以看出，无论自定义的服务器端文件名是什么，一般都会<BR><BR>在操作系统的安装目录下生成一个以“_hook.dll”结尾的文件。通过这一点，我<BR><BR>们可以较为准确手工检测出灰鸽子 服务端。<BR>&nbsp; 由于正常模式下灰鸽子会隐藏自身，因此检测灰鸽子的操作一定要在安全模<BR><BR>式下进行。进入安全模式的方法是：启动计算机，在系统进入Windows启动画面前<BR><BR>，按下F8键(或者在启动计算机时按住Ctrl键不放)，在出现的启动选项菜单中，<BR><BR>选择“Safe Mode”或“安全模式”。<BR>&nbsp; 1、由于灰鸽子的文件本身具有隐藏属性，因此要设置Windows显示所有文件<BR><BR>。打开“我的电脑”，选择菜单“工具”—》“文件夹选项”，点击“查看”，<BR><BR>取消“隐藏受保护的操作系统文件”前的对勾，并在“隐藏文件和文件夹”项中<BR><BR>选择“显示所有文件和文件夹”，然后点击“确定”。<BR><BR>&nbsp; 2、打开Windows的“搜索文件”，文件名称输入“_hook.dll”，搜索位置选<BR><BR>择Windows的安装目录（默认98/xp为C:\windows，2k/NT为C:\Winnt）。 <BR><BR>3、经过搜索，我们在Windows目录（不包含子目录）下发现了一个名为<BR><BR>Game_Hook.dll的文件。<BR><BR>4、根据灰鸽子原理分析我们知道，如果Game_Hook.DLL是灰鸽子的文件，则在操<BR><BR>作系统安装目录下还会有Game.exe和Game.dll文件。打开Windows目录，果然有这<BR><BR>两个文件，同时还有一个用于记录键盘操作的GameKey.dll文件。<BR>　<BR><BR>&nbsp; 经过这几步操作我们基本就可以确定这些文件是灰鸽子 服务端了，下面就<BR><BR>可以进行手动清除。<BR>二、灰鸽子的手工清除<BR>&nbsp; 经过上面的分析，清除灰鸽子就很容易了。清除灰鸽子仍然要在安全模式下<BR><BR>操作，主要有两步：1、清除灰鸽子的服务；2删除灰鸽子程序文件。<BR>&nbsp; 注意：为防止误操作，清除前一定要做好备份。<BR>&nbsp; （一）、清除灰鸽子的服务<BR>注意清除灰鸽子的服务一定要在注册表里完成，对注册表不熟悉的网友请找熟悉<BR><BR>的人帮忙操作，清除灰鸽子的服务一定要先备份注册表，或者到纯DOS下将注册表<BR><BR>文件更名，然后在去注册表删除灰鸽子的服务。因为病毒会和EXE文件进行关联<BR>&nbsp; 2000／XP系统：<BR>&nbsp; 1、打开注册表编辑器（点击“开始”－》“运行”，输入“Regedit.exe”<BR><BR>，确定。），打开 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services注<BR><BR>册表项。<BR>&nbsp; 2、点击菜单“编辑”－》“查找”，“查找目标”输入“game.exe”，点击<BR><BR>确定，我们就可以找到灰鸽子的服务项（此例为Game_Server，每个人这个服务项<BR><BR>名称是不同的）。　<BR><BR>&nbsp; 3、删除整个Game_Server项。<BR>&nbsp; 98／me系统：<BR>&nbsp; 在9X下，灰鸽子启动项只有一个，因此清除更为简单。运行注册表编辑器，<BR><BR>打开HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run项，<BR><BR>我们立即看到名为Game.exe的一项，将Game.exe项删除即可。<BR><BR>&nbsp; （二）、删除灰鸽子程序文件<BR>&nbsp; 删除灰鸽子程序文件非常简单，只需要在安全模式下删除Windows目录下的<BR><BR>Game.exe、Game.dll、Game_Hook.dll以及Gamekey.dll文件，然后重新启动计算<BR><BR>机。至此，灰鸽子VIP 2005 服务端已经被清除干净。<BR>以上介绍的方法适用于我们看到的大部分灰鸽子木马及其变种，然而仍有极少数<BR><BR>变种采用此种方法无法检测和清除。同时，随着灰鸽子新版本的不断推出，作者<BR><BR>可能会加入一些新的隐藏方法、防删除手段，手工检测和清除它的难度也会越来<BR><BR>越大。<BR>三、防止中灰鸽子病毒需要注意的事项<BR>1. 给系统安装补丁程序。通过Windows Update安装好系统补丁程序(关键更新、<BR><BR>安全更新和Service pack)，其中MS04-011、MS04-012、MS04-013、MS03-001、<BR><BR>MS03-007、MS03-049、MS04-032等都被病毒广泛利用，是非常必要的补丁程序<BR>　　2. 给系统管理员帐户设置足够复杂足够强壮的密码，最好能是10位以上，字<BR><BR>母+数字+其它符号的组合；也可以禁用/删除一些不使用的帐户<BR>　　3. 经常更新杀毒软件（病毒库），设置允许的可设置为每天定时自动更新。<BR><BR>安装并合理使用网络防火墙软件，网络防火墙在防病毒过程中也可以起到至关重<BR><BR>要的作用，能有效地阻挡自来网络的攻击和病毒的入侵。部分盗版Windows用户不<BR><BR>能正常安装补丁，这点也比较无奈，这部分用户不妨通过使用网络防火墙来进行<BR><BR>一定防护<BR>　　4. 关闭一些不需要的服务，条件允许的可关闭没有必要的共享，也包括C$、<BR><BR>D$等管理共享。完全单机的用户可直接关闭Server服务。这些都可以用winxp总管<BR><BR>等优化软件关闭。<BR>WinXP 总管 v4.9.3 中文注册版<BR></FONT><A href="http://www.366tian.net/soft/data/soft/219.html" target=_blank><FONT size=2>http://www.366tian.net/soft/data/soft/219.html</FONT></A><BR><FONT size=2>　　5. 不要随便打开或运行陌生、可疑文件和程序，如邮件中的奇怪附件，外挂<BR><BR>程序等。<BR>五、灰鸽子（Huigezi、Gpigeon）专用检测清除工具<BR>软件名称： 灰鸽子（Huigezi、Gpigeon）专用检测清除工具 <BR>界面语言： 简体中文 <BR>软件类型： 国产软件 <BR>运行环境： /Win9X/Me/WinNT/2000/XP/2003 <BR>授权方式： 免费软件 <BR>软件大小： 414KB <BR>软件简介： 由灰鸽子工作室开发的,针对灰鸽子专用清除器!可以清除VIP2005版<BR><BR>灰鸽子服务端程序(包括杀毒软件杀不到的灰鸽子服务端)和灰鸽子 [辐射正式版] <BR><BR>和 DLL版服务端 牵手版服务端<BR>运行DelHgzvip2005Server.exe文件清除VIP2005版灰鸽子服务端程序，运行<BR><BR>un_hgzserver.exe文件清除灰鸽子 [辐射正式版] 和 DLL版服务端 牵手版服务端<BR>下载地址：<BR></FONT><A href="http://www.366tian.net/soft/data/soft/875.html" target=_blank><FONT size=2>http://www.366tian.net/soft/data/soft/875.html</FONT></A><FONT size=2> <BR><BR><BR>结束语：写完了这篇教程，我也该准备重装系统了，因为我运行了自己生成的木<BR><BR>马，体验到了它的强大功能，不想手工去清除了，直接重装算了。<BR>&nbsp; &nbsp; 本文章本人收集的资料以及自己的心得体会，转载请注明来自<BR><BR></FONT><A href="http://bbs.5qzone.net/" target=_blank><FONT size=2>http://bbs.5qzone.net</FONT></A><FONT size=2>，如果文章有侵犯你的版权，请告诉我，我删掉</FONT><BR><BR><BR></SPAN><img src ="http://www.cppblog.com/geforcex/aggbug/2343.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/geforcex/" target="_blank">geforceX</a> 2006-01-01 11:41 <a href="http://www.cppblog.com/geforcex/articles/2343.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>灰鸽子第三章：服务端工作方式</title><link>http://www.cppblog.com/geforcex/articles/2342.html</link><dc:creator>geforceX</dc:creator><author>geforceX</author><pubDate>Sun, 01 Jan 2006 03:40:00 GMT</pubDate><guid>http://www.cppblog.com/geforcex/articles/2342.html</guid><wfw:comment>http://www.cppblog.com/geforcex/comments/2342.html</wfw:comment><comments>http://www.cppblog.com/geforcex/articles/2342.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/geforcex/comments/commentRss/2342.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/geforcex/services/trackbacks/2342.html</trackback:ping><description><![CDATA[<SPAN class=tpc_content><FONT size=5><FONT color=red>灰鸽子第三章：服务端工作方式</FONT></FONT><BR><BR><FONT size=2>灰鸽子是国内一款著名后门。比起前辈冰河、黑洞来，灰鸽子可以说是国内后门<BR><BR>的集大成者。其丰富而强大的功能、灵活多变的操作、良好的隐藏性使其他后门<BR><BR>都相形见绌。客户端简易便捷的操作使刚入门的初学者都能充当黑客。当使用在<BR><BR>合法情况下时，灰鸽子是一款优秀的远程控制软件。但如果拿它做一些非法的事<BR><BR>，灰鸽子就成了很强大的黑客工具。这就好比火药，用在不同的场合，给人类带<BR><BR>来不同的影响。对灰鸽子完整的介绍也许只有灰鸽子作者本人能够说清楚，在此<BR><BR>我们只能进行简要介绍。<BR>&nbsp; 灰鸽子客户端和服务端都是采用Delphi编写。黑客利用客户端程序配置出服<BR><BR>务端程序。可配置的信息主要包括上线类型（如等待连接还是主动连接）、主动<BR><BR>连接时使用的公网IP（域名）、连接密码、使用的端口、启动项名称、服务名称<BR><BR>，进程隐藏方式，使用的壳，代理，图标等等。<BR>&nbsp; 服务端对客户端连接方式有多种，使得处于各种网络环境的用户都可能中毒<BR><BR>，包括局域网用户（通过代理上网）、公网用户和ADSL拨号用户等。<BR>&nbsp; 下面介绍服务端：<BR>&nbsp; 配置出来的服务端文件文件名为G_Server.exe（这是默认的，当然也可以改<BR><BR>洌Ｈ缓蠛诳屠靡磺邪旆ㄓ掌没г诵蠫_Server.exe程序。具体采用什么办法<BR><BR>，读者可以充分发挥想象力，这里就不赘述。<BR>G_Server.exe运行后将自己拷贝到Windows目录下(98/xp下为系统盘的windows目<BR><BR>录，2k/NT下为系统盘的Winnt目录)，然后再从体内释放G_Server.dll和<BR><BR>G_Server_Hook.dll到windows目录下。G_Server.exe、G_Server.dll和<BR><BR>G_Server_Hook.dll三个文件相互配合组成了灰鸽子服务端， &nbsp; <BR><BR>G_Server_Hook.dll负责隐藏灰鸽子。通过截获进程的API调用隐藏灰鸽子的文件<BR><BR>、服务的注册表项，甚至是进程中的模块名。截获的函数主要是用来遍历文件、<BR><BR>遍历注册表项和遍历进程模块的一些函数。所以，有些时候用户感觉种了毒，但<BR><BR>仔细检查却又发现不了什么异常。有些灰鸽子会多释放出一个名为<BR><BR>G_ServerKey.dll的文件用来记录键盘操作。注意，G_Server.exe这个名称并不固<BR><BR>定，它是可以定制的，比如当定制服务端文件名为A.exe时，生成的文件就是<BR><BR>A.exe、A.dll和A_Hook.dll。<BR>&nbsp; Windows目录下的G_Server.exe文件将自己注册成服务（9X系统写注册表启<BR><BR>动项），每次开机都能自动运行，运行后启动G_Server.dll和G_Server_Hook.dll<BR><BR>并自动退出。G_Server.dll文件实现后门功能，与控制端客户端进行通信；<BR><BR>G_Server_Hook.dll则通过拦截API调用来隐藏病毒。因此，中毒后，我们看不到<BR><BR>病毒文件，也看不到病毒注册的服务项。随着灰鸽子服务端文件的设置不同，<BR><BR>G_Server_Hook.dll有时候附在Explorer.exe的进程空间中，有时候则是附在所有<BR><BR>进程中。<BR>&nbsp; 灰鸽子的作者对于如何逃过杀毒软件的查杀花了很大力气。由于一些API函数<BR><BR>被截获，正常模式下难以遍历到灰鸽子的文件和模块，造成查杀上的困难。要卸<BR><BR>载灰鸽子动态库而且保证系统进程不崩溃也很麻烦，因此造成了近期灰鸽子在互<BR><BR>联网上泛滥的局面。</FONT></SPAN><img src ="http://www.cppblog.com/geforcex/aggbug/2342.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/geforcex/" target="_blank">geforceX</a> 2006-01-01 11:40 <a href="http://www.cppblog.com/geforcex/articles/2342.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>灰鸽子第二章：好马配好鞍，服务端正确配置</title><link>http://www.cppblog.com/geforcex/articles/2341.html</link><dc:creator>geforceX</dc:creator><author>geforceX</author><pubDate>Sun, 01 Jan 2006 03:39:00 GMT</pubDate><guid>http://www.cppblog.com/geforcex/articles/2341.html</guid><wfw:comment>http://www.cppblog.com/geforcex/comments/2341.html</wfw:comment><comments>http://www.cppblog.com/geforcex/articles/2341.html#Feedback</comments><slash:comments>13</slash:comments><wfw:commentRss>http://www.cppblog.com/geforcex/comments/commentRss/2341.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/geforcex/services/trackbacks/2341.html</trackback:ping><description><![CDATA[<SPAN class=tpc_content><FONT size=5><FONT color=red>灰鸽子第二章：好马配好鞍，服务端正确配置</FONT></FONT><BR><BR><FONT size=2>灰鸽子是一款要交钱的软件，也就是说，你使用VIP版的话是要交给作者每年几十<BR><BR>块钱的使用费（不作任何评论）<BR><BR>因此网上也就有很多高手破解灰鸽子，让灰鸽子可以不用到灰鸽子的官方网站进<BR><BR>行验证，从而可以不用交钱就可以使用，<BR>相关版本有：影子鹰破解专用版，爱儿破解版，以及华夏黑客联盟的灰鸽子<BR><BR>sunray破解版。<BR><BR>今天我们就用"灰鸽子sunray破解版"来向大家详细解析这款木马的服务端配置方<BR><BR>式，只可实验，不可做坏事，大家不喜欢请跳过这一章。<BR><BR>第一节：未雨绸缪，实验准备。<BR>&nbsp; &nbsp; 第一,关闭杀毒软件，这点不用我说了吧~~~因为是木马，下载了之后如<BR><BR>果杀毒软件监控开着的话肯定会被删除的。 &nbsp; &nbsp; <BR>&nbsp; &nbsp; 第二，当然是下载灰鸽子的软件啦~~~上网找，有很多~~~<BR><BR>&nbsp; &nbsp; <BR>&nbsp; &nbsp; 第三，申请一个免费的主页空间，为什么要呢？因为灰鸽子是可以反弹<BR><BR>式链接的，也就是说，服务端通过登陆你的主页的特定文件就可以主动连接到你<BR><BR>的电脑让你控制了。（这一点，等一下会详细解说）<BR><BR>第二节：实战开始。<BR><BR>把我们刚才下来的文件解压到某个文件夹，记住，不要改文件夹的名字，后面会<BR><BR>用到。<BR><BR>解压的文件里面有以下几个文件：<BR>H_Client.exe 这个是客户端的主要文件，可以配置文件，生成服务端，可以远<BR><BR>程控制客户端。<BR>http.exe 这个是本地http服务器，因为我们的灰鸽子是破解版的，通常正式版<BR><BR>的灰鸽子会到官方的服务器上去验证你的软件是否正版，所以这个软件就是用来<BR><BR>在本机子上建一个服务器，骗过软件的，从而达到破解的目的。<BR>sunray.exe 这个里面其实也就只是一个host，它把</FONT><FONT color=#0000ff size=2>http://www.huigezi.com</FONT><FONT size=2>这<BR><BR>个网站的域名本地解析到本机，而不是解析到官方网站。<BR>vip_2005_0113.rar 这个是验证的软件，当我们的软件解析到本机的时候它就会<BR><BR>下载这一个到客户端，用来验证用的。<BR>其它的文件还有config2005.asp，Operate.ini 还有四个文件夹，他们分别是<BR><BR>(dat images login sound)我也不知道什么用的。应该是配置用的。<BR><BR><BR>&nbsp; &nbsp; 第一步：在你的电脑上新建一个ip.txt的文本文件，内容如下：<BR></FONT><FONT color=#0000ff size=2>http://huigezi212.126.131.43:8000end</FONT><BR><FONT size=2>其中212.126.131.43这个是我的电脑IP地址，8000是连接的端口，你可以把它写<BR><BR>成你自己的IP地址，端口一般不要去改动，然后把这个文件上传到你刚才申请的<BR><BR>空间,如果你的电脑是动态IP的话，那你就要经常更新这个文件的内容，然后上传<BR><BR>到空间，它的目的是客户端上线的话就会去这个网站读取这个文件，然后主动和<BR><BR>你取得连接。<BR>&nbsp; &nbsp; 第二步，首先运行 sunray.exe，然后运行 http.exe 点开始服务！<BR>&nbsp; &nbsp; 第三步，运行客户端，也就是H_Client.exe这个文件，我们可以看到以<BR>下界面，如图1<BR><BR>点击配置服务程序，用来生成服务端，如图2<BR>&nbsp; &nbsp; 点击“自动上线”选项，有几个要点要说的，<BR>&nbsp; &nbsp; <BR>&nbsp; &nbsp; 1）“备用自动上线，URL转向域名或网页文件，这里呢，填写你刚才申<BR><BR>请到的网站空间地址和ip.txt，比如http://你的网站地址/ip.txt<BR>（当然，如果你是固定IP的话呢，可以写你的IP地址，那么前面的申请空间，上<BR><BR>传文件几步可以省略）<BR>&nbsp; &nbsp; 2） “自动连接密码”，这个是表示你可以连接到的电脑所要用到的密<BR><BR>码，如果为空的话，也没什么大不了的，顶多就是别人也可以用你的“肉鸡”<BR>&nbsp; &nbsp; 3）“配置说明”建议你把“只使用备用自动上线”前的勾打上，因为我<BR><BR>们的软件是破解版的，官方的那个服务器我们是用不了啦~~~<BR>&nbsp; &nbsp; 4）“用户名称”“用户密码”这两个地方乱填些数字进去就行了，破解<BR><BR>版用不了正式版的服务器的，它是服务器用来验证软件是否“正版”用的。<BR><BR><BR>&nbsp; &nbsp; “安装选项”选项卡，建议修改一下名字，以免被发现，其它的自己看<BR><BR>着办，看着喜欢就选吧~~~^_^<BR>&nbsp; &nbsp; “启动项”这个很重要，建议你修改一下名字，它主要是服务端随系统<BR><BR>自动启动用的，也是自己看着办。其中的“生成服务”这一项是为了达到隐藏用<BR><BR>的，这也是我们经常说的手工清除木马的关键。也是长期以来很多人说无法清除<BR><BR>灰鸽子的原因，因为它写成了服务，这个的优先级是系统级的，所有使用这台电<BR><BR>脑的用户都会启动木马。<BR>&nbsp; &nbsp; “代理服务”，嘻嘻，就是你控制的电脑可以给我们做为一台代理服务<BR><BR>器，说不定人家公布出来的代理服~务器地址有一部分是这些电脑的哦~~~<BR>&nbsp; &nbsp; “高级选项”这里主要是用来对付杀毒软件和防火墙用的，默认是插入<BR><BR>IEXPLORER，启动隐藏文件隐藏插入的IE进程，以及使用UPX压缩，这里就不用去<BR><BR>改它的，默认就行。<BR>&nbsp; &nbsp; "服务器图标”是用来伪装用的，你自己选项自己喜欢的图标吧~~~<BR><BR>配置好了就点击生成服务器，软件会优先从官方验证，但没效，出错了后就从本<BR><BR>地服务器验证，这就是我们要本机建http服务器的原因。好了，到此，服务端就<BR><BR>生成了，不要运行它，运行了你就会中木马的，（不准做坏事）<BR><BR>软件使用方法：当别人中了你的木马后，它会从你的网站读取ip.txt这个文件，<BR><BR>然后主动连接到你的电脑，如果你此时也打开了客户端的话，连接建立成功，你<BR><BR>可以控制这台电脑了。具体有什么内容你自己摸索，<BR>如果你是动态IP地址的话，那么你要每次把新的ip.txt上传到网站上去~~~</FONT><BR><IMG height=402 alt=21_256015.jpg src="http://www.cppblog.com/images/cppblog_com/geforcex/275/21_256015.jpg" width=417 border=0></SPAN><img src ="http://www.cppblog.com/geforcex/aggbug/2341.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/geforcex/" target="_blank">geforceX</a> 2006-01-01 11:39 <a href="http://www.cppblog.com/geforcex/articles/2341.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>灰鸽子第一章：软件相关介绍</title><link>http://www.cppblog.com/geforcex/articles/2340.html</link><dc:creator>geforceX</dc:creator><author>geforceX</author><pubDate>Sun, 01 Jan 2006 03:37:00 GMT</pubDate><guid>http://www.cppblog.com/geforcex/articles/2340.html</guid><wfw:comment>http://www.cppblog.com/geforcex/comments/2340.html</wfw:comment><comments>http://www.cppblog.com/geforcex/articles/2340.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/geforcex/comments/commentRss/2340.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/geforcex/services/trackbacks/2340.html</trackback:ping><description><![CDATA[<SPAN class=tpc_content><FONT size=5><FONT color=red>灰鸽子第一章：软件相关介绍</FONT></FONT><FONT size=2>：这些是来自文件的介绍来的<BR><BR>灰鸽子 [VIP 专业版]<BR><BR>&nbsp; 1.只用一个端口来传输所有通讯数据！普通同类软件都用到了两个或两个以<BR><BR>上的端口来完成！<BR><BR>&nbsp; 2.支持可以控制Internet连接共享、HTTP透明代理上网的电脑！软件智能读<BR><BR>取系统设定的代理服务器信息，无需用户设置！<BR><BR>&nbsp; 3.无需知道服务端IP，自动上线功能让服务端自动上线报道！灰鸽子专用的<BR><BR>上线系统无需您注册免费域名才能使用,同时也提供了备用上线方式，在我们的专<BR><BR>用上线系统出现故障时，您可以使用备用上线方式来使用自动上线功能。在使用<BR><BR>专用上线系统时，你还可以控制远程电脑通过Socks5代理来中转自动上线。<BR><BR>&nbsp; 4.自动上线可以在第一次设置分组，自定义上线图像，上线备注等，这样都<BR><BR>可以让你轻而易举的找到目标主机，同时设置连接密码保证了服务主机的安全性<BR><BR>！同时具用牵手版的搜索符合条件主机的功能：<BR><BR>&nbsp; a.从主机窗口筛选：可以列出只有某个窗口的一批主机,可以轻松找到哪些人<BR><BR>在玩某个游戏！<BR><BR>&nbsp; b.从主机进程筛选：可以列出运行了某个程序的一批主机,例如QQ.exe,就可<BR><BR>以找到打开了QQ的自动上线主机有哪些了！<BR><BR>&nbsp; 5.文件管理：管理远程电脑的文件系统,支持复制、粘贴、删除，断点下载、<BR><BR>上传文件或文件夹，文件内容均以加密方式传输，确保通讯的安全性.<BR><BR>&nbsp; 6.远程控制命令：包括远程系统信息、剪切板信息、进程管理、窗口管理、<BR><BR>键盘记录、服务管理、管理管理、MS-DOS模拟、代理服务控制！<BR><BR>&nbsp; 7.注册表编辑器：可以像操作本机注册表一样的编辑远程注册表。<BR><BR>&nbsp; 8.常用命令广播，让你控制主机众多主机更多的方便！详细的在线主机线表<BR><BR>显示了：主机IP地址，地址位置，电脑名称，系统版本,备注等信息,<BR><BR>&nbsp; 9.除了具有语音监听、语音发送，还有远程视频监控功能，只有远程计算机<BR><BR>有摄像头，且正常打开没有被占用，那么你可以看到,远程摄像头捕获的图片！还<BR><BR>可以把远程摄像头捕获的画面存为Mpeg-1格式.远程语音也可以录制成Wav声音文<BR><BR>件。<BR><BR>&nbsp; 10.可以设置服务端开放Socks5代理服务器功能和HTTP代理服务功能！无需第<BR><BR>三方软件支持！支持Windows9x/ME/2000/Xp/2003。<BR><BR>&nbsp; 11.软件附带有四款实用工具：<BR><BR>&nbsp; &nbsp; a. EXE工具 : 可以修改任何EXE文件图标，支持真彩色！<BR>&nbsp; &nbsp; b. 内网端口映射器 : 它允许你将局域网内的服务映射到internet上，使<BR><BR>你在局域网内部也能使用自动上线功能！<BR>&nbsp; &nbsp; c. FTP服务器 : 可以开本机FTP服务！<BR>&nbsp; &nbsp; d. Web服务器 : 可以建立一个简单的Web服务器！<BR><BR>&nbsp; 12.服务端程序在 Windows 2000 / xp / 2003 可以以服务启动,支持发送多<BR><BR>种组合键,比如:Ctrl+Alt+del等等,适用于管理服务器主机!远程屏幕捕获还可以<BR><BR>录制为Mpeg-1文件格式.<BR><BR>&nbsp; 13.全中文友好操作界面，让你一目了然，漂亮皮肤让使用时也倍感亲切！<BR><BR><BR><BR>功能简单介绍： <BR>【1】对远程计算机文件管理：模枋 Windows 资源管理器，可以对文件进行复制<BR><BR>、粘贴、删除，重命名、远程运行等,可以上传下载文件或文件夹,操作简单易用<BR><BR>。 <BR>【2】远程控制命令：查看远程系统信息、剪切板查看、进程管理、服务管理、共<BR><BR>享管理！<BR>【3】捕获屏幕：不但可以连继的捕获远程电脑屏幕，还能把本地的鼠标及键盘传<BR><BR>动作送到远程实现实时控制功能！ <BR>【4】视频语音，可以监控远程摄像头,还有语音监听和发送功能，可以和远程主<BR><BR>机进行语音对话！<BR>【5】telnet(超级终端). <BR>【6】注册表模拟器：远程注册表操作就像操作本地注册表一样方便! <BR>【7】命令广播：可以对自动上线主机进行命令广播，如关机、重启、打开网页，<BR><BR>筛选符合条件的机等，点一个按钮就可以让N台机器同时关机或进行其它操作！ <BR>【8】服务端以服务方式启动，支持发送多种组合键，可以轻松管理远程服务器！ <BR>【9】专用的自动上线系统，直接使用灰鸽子注册ID即可实现远程服务端自动上线<BR><BR>！<BR>【10】多种自动上线方式：专用上线、DNS解析域名、固定IP等，用户自由选择！ <BR><BR>注册灰鸽子软件后享有：<BR><BR><BR>⒈享用软件的所有功能,没有任何限制!<BR>⒉能使用对应的灰鸽子注册版本，能得到此版后期修正的正式版本!<BR>⒊可以使用我们的专用上线系统，无需其它域名和空间支持!<BR>⒋得到我们更好的技术服务!<BR><BR>注：[VIP版] 包括 VIP2005、Version 1.2、Version 2.0 !<BR><BR>[企业版]用户只能使用企业版！不能使用其它版本！<BR>5.加入会员后，会自动加入官方论坛。享受官方技术支持</FONT><BR><SPAN class=tpc_content><FONT size=5><FONT color=red><IMG height=549 alt=stuphoto.jpg src="http://www.cppblog.com/images/cppblog_com/geforcex/275/stuphoto.jpg" width=680 border=0></FONT></FONT></SPAN></SPAN><img src ="http://www.cppblog.com/geforcex/aggbug/2340.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/geforcex/" target="_blank">geforceX</a> 2006-01-01 11:37 <a href="http://www.cppblog.com/geforcex/articles/2340.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>NSIS常见问题集锦 </title><link>http://www.cppblog.com/geforcex/articles/1463.html</link><dc:creator>geforceX</dc:creator><author>geforceX</author><pubDate>Thu, 01 Dec 2005 05:31:00 GMT</pubDate><guid>http://www.cppblog.com/geforcex/articles/1463.html</guid><wfw:comment>http://www.cppblog.com/geforcex/comments/1463.html</wfw:comment><comments>http://www.cppblog.com/geforcex/articles/1463.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/geforcex/comments/commentRss/1463.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/geforcex/services/trackbacks/1463.html</trackback:ping><description><![CDATA[&nbsp;&nbsp; 问：在安装过程中按“取消”的话，会弹出是否终止安装的确认窗口，请问怎样设置可以让这个窗口不要出现，按“取消”就直接退出呢？
<P>　　答：!define MUI_ABORTWARNING 把这句去掉就可以了。</P>
<P>&nbsp;</P>
<P>　　问：如何将显示的“setup 将安装...”中的“setup”去掉，除了用自定义字串来修改这个地方以外，如何把这个setup搞成其他的？比如“安装程序现在将...”</P>
<P>　　答：DirText "安装程序将安装 $(^NameDA) 在下列文件夹。要安装到不同文件夹，单击 [浏览(B)] 并选择其他的文件夹。 $_CLICK" </P>
<P>&nbsp;</P>
<P>　　问：如何定义欢迎页面的标题字体大小。</P>
<P>　　答：使用以下脚本</P>
<P>程序代码<BR>!define MUI_PAGE_CUSTOMFUNCTION_SHOW ChageFONT<BR>!insertmacro MUI_PAGE_WELCOME</P>
<P>Function ChageFONT<BR>GetDlgItem $0 $MUI_HWND 1201<BR>createFont $1 "Tahoma" "11" "700"<BR>SendMessage $0 ${WM_SETFONT} $1 0</P>
<P>&nbsp;</P>
<P><BR>　　问：添加版本号</P>
<P>引用内容<BR>VIProductVersion "1.2.3.4"<BR>VIAddVersionKey /LANG=${LANG_ENGLISH} "ProductName" "Test Application"<BR>VIAddVersionKey /LANG=${LANG_ENGLISH} "Comments" "A test comment"<BR>VIAddVersionKey /LANG=${LANG_ENGLISH} "CompanyName" "Fake company"<BR>VIAddVersionKey /LANG=${LANG_ENGLISH} "LegalTrademarks" "Test Application is a trademark of Fake company"<BR>VIAddVersionKey /LANG=${LANG_ENGLISH} "LegalCopyright" "?Fake company"<BR>VIAddVersionKey /LANG=${LANG_ENGLISH} "FileDescription" "Test Application"<BR>VIAddVersionKey /LANG=${LANG_ENGLISH} "FileVersion" "1.2.3"</P>
<P>　　在脚本中加入上面的代码，则为 NSIS 生成的 exe 添加版本信息。问题就是，能否让属性中语言显示为“中文（中国）”？</P>
<P>　　答：中文 ID 是 2052。 把 ${LANG_ENGLISH} 改为 2052。</P>
<P>&nbsp;</P>
<P>　　问：用 2052 之后确实变成“中文（中国）”了。但其他内容仍旧是乱码，不知有什么办法可以解决吗？</P>
<P>　　答：版本信息设置语句，放在 !insertmacro MUI_LANGUAGE 的后面，NSIS 要注重次序的。如果使用古典界面，放在 LoadLanguageFile "${NSISDIR}\Contrib\Language files\SimpChinese.nlf" 的后面。</P>
<P>&nbsp;</P>
<P>　　问：如何禁止显示 banner 。</P>
<P>　　答：图示的效果是因为安装程序初始化的时候，也就是 .onInit 函数里需要用到某个文件的时候安装程序需要搜索整个数据区块来把它解压出来，当安装程序比较大的时候搜索比较费时，这个时候才显示解压百分比。一般都是用 ReserveFile 来避开这种搜索。比如 Function .onInit 里有：</P>
<P>程序代码<BR>InitPluginsDir<BR>File "/oname=$PLUGINSDIR\io.ini" ".\io.ini"</P>
<P>　　或者其他类似的话，安装程序就需要搜索并解压这个文件。一般在脚本头部加： </P>
<P>程序代码<BR>ReserveFile ".\io.ini"</P>
<P>　　这样 io.ini 就保存在数据区块的尾部，安装程序初始化的时候就不用搜索整个数据区块了，相当于加快了安装程序的启动速度。</P>
<P>&nbsp;</P>
<P>　　问：根据以上方法使用了，确实不会再出现初始化的对话框了，但是在自定义的 InstallOptions 页显示前，程序还是会停顿一段时间，请问这是为何？如何避免？</P>
<P>　　答：某些控件比较消耗时间的，比如显示 ICON、位图 等，如果 InstallOptions 里含有这些控件可能会停顿。如果 InstallOptions 是第一个页面的话还要把 InstallOptions.dll 加入到 ReserveFile 参数里。再或者就是进入 InstallOptions 的时候含有比较复杂的指令，比如循环等。一般在加入 ReserveFile ${NSISDIR}\Plugins\InstallOptions.dll 既可避免。</P>
<P>&nbsp;</P>
<P>　　问：如何运行一个安装文件 .inf </P>
<P>　　答：ExecWait "RunDll32 advpack.dll,LaunchINFSection skins.inf,DefaultInstall" </P>
<P>&nbsp;</P>
<P>　　问：关联文件图标后，图标没变化。</P>
<P>　　答：刷新图标用， System::Call shell32.dll::SHChangeNotify(l, l, i, i) v (0x08000000, 0, 0, 0) </P>
<P>&nbsp;</P>
<P>　　问：我用NSIS做好了一个安装程序，因为数据较多，一共有400多M，用的LZMA压缩方式，做好后的安装程序约200M，但是我发现在运行这个安装程序时会在系统TEMP目录产生一个同安装后的全部内容同样大的临时文件（一边运行一边加大，最后到400多M去了），如果我做的程序小倒没什么，可是这个程序有400多M，除了要写入安装的数据外还要同样大小的空间放临时文件，这样子也实在是太花不来，我想请问：有什么办法能让其在安装时不使用这么多的临时空间吗？安装的脚本是用HM NIS Edit的向导生成的。</P>
<P>　　答：这是因为 NSIS 在用 LZMA 时采用了固实压缩，何谓固实压缩，其实就是把所有文件统一起来压缩，所以这样压出来的文件更加的小，同时也带来了一个问题，安装解压的时候，在临时文件夹中生成一个临时文件，随着安装的进程逐渐增大，到最后，需要临时文件会变成跟原安装程序一样大，也就是说，需要原安装程序 2 倍的空间才可以安装这个程序，所以对于安装大量文件时，这是不适合的。<BR>　　NSIS 2.07 版本之前 LZMA 算法是固实压缩的，没有非固实的选项，如果需要这样做，只有下载非固实压缩的编译器，但是 2.07 后的 NSIS 的 LZMA 压缩已经改为默认非固实压缩了，所以这个问题同时也不再存在。如果在制作少量文件的安装时，仍然想取用固实压缩可以加入 /SOLID 参数。<BR>　　像这样： SetCompressor /SOLID lzma</P>
<P>&nbsp;</P>
<P>　　问：能不能在 Section 区段中实现读取INI文件状态来安装。若选中单选框1则安装1中定义的文件。若不选中则不安装。若选中单选框2则安装2定义的文件。若不选则不安装。</P>
<P>　　答：使用以下代码</P>
<P>程序代码<BR>!include LogicLib.nsh<BR>Section -post<BR>SetOutPath $INSTDIR<BR>!insertmacro MUI_INSTALLOPTIONS_READ $INI_VALUE "info.ini" "Field 2" "State"<BR>${If} $INI_VALUE = 1<BR>File /a ".\file\fileA.exe"<BR>File /a ".\file\fileB.exe"<BR>${EndIf}<BR>!insertmacro MUI_INSTALLOPTIONS_READ $INI_VALUE "info.ini" "Field 3" "State"<BR>${If} $INI_VALUE = 1<BR>File /a ".\file\fileA.exe"<BR>${EndIf}<BR>SectionEnd</P>
<P><BR>　　或者使用以下代码</P>
<P>程序代码<BR>!include LogicLib.nsh<BR>Section -post<BR>SetOutPath $INSTDIR<BR>!insertmacro MUI_INSTALLOPTIONS_READ $INI_VALUE "info.ini" "Field 2" "State"<BR>${If} $INI_VALUE = 1<BR>;选中时执行的代码<BR>File /a ".\file\fileA.exe"<BR>File /a ".\file\fileB.exe"<BR>${Else}<BR>;不选中时执行的代码<BR>File /a ".\file\fileA.exe"<BR>${EndIf}<BR>SectionEnd</P>
<P>&nbsp;</P>
<P><BR>　　问：在 NSIS 中如何设置工作目录，例如一些文件的快捷方式，还有安装完一个软件后运行一个程序，而这个程序需要检测当前工作目录下的某个文件，这时候设置工作目录尤为重要，否则程序不能正常运行。</P>
<P>　　答：NSIS 中设定工作目录使用 SetOutPath，例如在运行程序的代码 ExecWait "$INSTDIR\test2.exe" 前放入 SetOutPath $INSTDIR，那么 $INSTDIR 将会成为当前的工作目录，建立快捷方式也会把工作目录设为 $INSTDIR。卸载之前运行某程序只需要把运行指令放到 Function un.onInit 里就行</P>
<P>&nbsp;</P>
<P>　　问：记得以前看到有帖子介绍过可在NSIS中调用.inf文件安装附加驱动程序，具体实现代码如下形式：</P>
<P>引用内容<BR>ExecWait "RunDll32 advpack.dll,LaunchINFSection drivers.inf,DefaultInstall"</P>
<P>　　偶在打包一小东东时使用了这一方法，但遇到的问题时，如果在卸载区段里设置能自动卸载安装过的驱动程序呢？</P>
<P>　　答：能否卸载需要看 INF 文件里面是否有卸载的区段，例如使用 NSIS 卸载 Windows Messenger 可以这样：</P>
<P>程序代码<BR>ExecWait "RunDll32 advpack.dll,LaunchINFSection $windir\INF\msmsgs.inf,BLC.Remove" </P>
<P>　　关于 BLC.Remove 的来源，可以打开 msmsgs.inf 文件后，能找到名称为 BLC.Remove 的区段，该区段用于卸载。区段的名称是编写者自己定制的。不同的inf文件，区段名也可能不同。其他的 *.inf 文件也可以按照此类做法。</P>
<P>&nbsp;</P>
<P>问：（问题如下）<BR>　　1、我做了一个可同时在简繁英下执行的安装程序。但有个很大的困惑。刚开始时做的是简体中文版，在简中下当然没问题，但在英/繁下，创建的中文程序组名和写注册表时显示的是乱码。于是想到写一个三者皆适合的安装程序。<BR>　　我的做法是这样的，在涉及到创建中文程序组和写注册表时，加入一个判断，如果英文或繁体，则分别创建英文文件名和big5内码文件名。但在繁体winxp和英文win2k下测试后，发现根本无法正常创建程序组，也无法正常生成uninstall.exe文件。而写入注册表的中文字符，也不能在繁体系统的注册表中正常显示，而是乱码。<BR>　　请教高手，这种多语言环境下该怎么处理，才能正常显示呢？ 总不能全部都给创建成英文的吧？<BR>　　2、另外有个小问题，如何让nsis做的安装程序不显示具体的安装文件名，而只显示“正在复制文件……”？　象foobar那样，可惜foobar也有个显示详细情况的按钮，我想在复制文件过程中完全不显示和提示被复制的文件情况。</P>
<P>答：（解答如下）<BR>　　1、最简单的处理办法就是给需要处理的资源进行一个定义，然后使用 LangString 定义不同的资源。给个示例：</P>
<P>程序代码<BR>Caption "$(CAPTION)"<BR>LangString CAPTION ${1033} "DreamMail Installation"<BR>LangString CAPTION ${2052} "DreamMail 安装向导"<BR>LangString CAPTION ${1028} "DreamMail 杆翾旧"</P>
<P>　　2、可以使用 DetailPrint ，示例，</P>
<P>程序代码<BR>DetailPrint "正在复制文件..." </P>
<P>&nbsp;</P>
<P><BR>　　问：NSIS对于安装卸载的ICO图标大小有什么要求?编译的时候出现以下错误提示：</P>
<P>引用内容<BR>Error finding icon resources: installer, uninstaller icon size mismatch - see the Icon instructions documentation for more information -- failing! </P>
<P><BR>　　答：只要保证安装图标与卸载图标大小相同即可。</P>
<P>&nbsp;</P>
<P>　　问：如何屏蔽如下图中的安装程序校验。</P>
<P>　　答：CRCCheck　on|off|force 指定安装前安装程序是否对自身执行一个 CRC。注意，如果用户使用了 /NCRC 命令行参数，且你没有指定 force 参数时，不会执行 CRC，这样有可能导致用户安装一个损坏的安装程序。<BR>　　安装程序 CRC 校验是默认打开的。可以在脚本中用 CRCCheck off 来默认禁止安装程序的 CRC 校验。不过这样做正如解释上说的可能安装会出现问题。作汉化的最好加上校验，免得安装程序的问题变成你汉化质量的问题。</P>
<P>&nbsp;</P>
<P>　　问：在安装的时候不是可以选择多种语言么？但是我怎样实现当选择英文时就装英文版，选择中文时就装中文版？</P>
<P>　　答：使用以下脚本：</P>
<P>程序代码<BR>StrCmp $LANGUAGE ${LANG_SIMPCHINESE} 0 +3<BR>File "你需要安装的中文文件"<BR>Goto lbl_finish<BR>File "你需要安装的英文文件"<BR>lbl_finish: </P>
<P>&nbsp;</P>
<P><BR>　　问：组件A 组件B 组件C 均为可选，A可单独安装，B或者C被选择的时候A必须被选择。</P>
<P>　　答：以下代码：</P>
<P>程序代码<BR>Section "组件 A" aaa<BR>　detailprint "A"<BR>SectionEnd</P>
<P>Section "组件 B" bbb<BR>　detailprint "B"<BR>SectionEnd</P>
<P>Section "组件 C" ccc<BR>　detailprint "C"<BR>SectionEnd</P>
<P>Function .onSelChange<BR>　SectionGetFlags ${bbb} $0<BR>　SectionGetFlags ${ccc} $1<BR>　IntOp $0 $0 &amp; 1<BR>　IntOp $1 $1 &amp; 1<BR>　IntCmp $0 1 0 +2<BR>　　SectionSetFlags ${aaa} 1<BR>　IntCmp $1 1 0 +2<BR>　　SectionSetFlags ${aaa} 1<BR>FunctionEnd</P>
<P><BR>　　解释：SectionGetFlags 表示获取某区段的flags状态（就是是否被勾选，选中返回值为1，反之为0）。SectionGetFlags ${bbb} $0 表示获取序号为${bbb}的区段的Flags状态并把返回值输出到变量 $0，C 区段相同。接着就是 StrCmp ，解释同上楼。SectionSetFlags ${aaa} 1 表示设置序号为 ${aaa} 区段的 Flags 状态为 1，即勾选。</P>
<P>&nbsp;</P>
<P>　　问：怎么让“许可协议”页面的标题栏，如程序中的“MutliPages 演示”修改为“MutliPages 演示：许可协议”。</P>
<P>　　答：首先创建一个函数，如下。</P>
<P>程序代码<BR>Function LicensePagePre<BR>SendMessage $HWNDPARENT ${WM_SETTEXT} 0 "STR:我爱你"<BR>FunctionEnd</P>
<P>　　然后在协议页面句子 </P>
<P>程序代码<BR>!insertmacro MUI_PAGE_LICENSE "c:\path\to\licence\YourSoftwareLicence.txt"</P>
<P>　　之前加入如下语句</P>
<P>程序代码<BR>!define MUI_PAGE_CUSTOMFUNCTION_PRE LicensePagePre</P>
<P>&nbsp;</P>
<P><BR>　　问：比如，我把 a.exe 用nsis包装好，安装到 c:\helloLib\a.exe，完成后，想把c:\helloLib\添加到系统环境变量的path里头，这样，在任何地方输入a.exe可执行。如何将路径添加到系统环境变量中？</P>
<P>　　答：以下代码实现：</P>
<P>程序代码<BR>ReadRegStr $0 HKLM "SYSTEM\CurrentControlSet\Control\Session Manager\Environment" "Path"<BR>WriteRegExpandStr HKLM "SYSTEM\CurrentControlSet\Control\Session Manager\Environment" "Path" "$0;C:\hellolib" </P>
<P>　　另类方法一：写注册表，如</P>
<P>程序代码<BR>[HKEY_CLASSES_ROOT\Applications\a.exe\shell\open\command]<BR>@="yourpath\a.exe" </P>
<P>　　另类方法二：</P>
<P>程序代码<BR>[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\a.exe]<BR>@="c:\helloLib\a.exe" </P>
<P>&nbsp;</P>
<P><BR>　　问：在NSIS中如何才能做到根据对于注册表键值的判断决定是否写入字串，如果判断出某个key存在，则写入相应的字串，如果不存在，则不写入字串。例如：我先要判断“HKLM SOFTWARE\nsis”这个key存不存在。如果存在则写入字串“DispName:nsis”，应该是用“WriteRegStr HKLM "SOFTWARE\nsis" "DispName" "nsis"”。如果不存在这个key，则不写入注册表，继续下面的安装。</P>
<P>　　答：以下代码实现：</P>
<P>程序代码<BR>ReadRegStr $0 HKLM SOFTWARE\nsis ""<BR>　IfErrors 0 +2<BR>　Goto +2<BR>WriteRegStr HKLM "SOFTWARE\nsis" "DispName" "nsis" </P>
<P>&nbsp;</P>
<P><BR>　　问：如何制作安装包的时候需要调用系统函数来检测当前安装包运行的操作系统的内码页。</P>
<P>　　答：以下代码显示系统语言：</P>
<P>程序代码<BR>System::Call "Kernel32::GetSystemDefaultLangID(v ..) i .s"<BR>Pop $0<BR>IntOp $0 $0 &amp; 0xFFFF<BR>MessageBox MB_OK $0</P>
<P>&nbsp;</P>
<P><BR>　　问：如何用NSIS注册字体？</P>
<P>　　答：以下代码：</P>
<P>程序代码<BR>!include WinMessages.nsh<BR>Section "MainSection" SEC01<BR>File /oname=$FONTS\tahoma.ttf tahoma.ttf<BR>Push "$FONTS\tahoma.ttf"<BR>System::Call "Gdi32::AddFontResource(t s) i .s"<BR>Pop $0<BR>IntCmp $0 0 0 +2 +2<BR>MessageBox MB_OK "注册字体失败"<BR>SendMessage ${HWND_BROADcast} ${WM_FONTCHANGE} 0 0<BR>SectionEnd</P>
<P>&nbsp;</P>
<P><BR>　　问：如何用 NSIS 安装输入法。</P>
<P>　　答：以下代码：</P>
<P>程序代码<BR>SetOutPath $SYSDIR<BR>File WBIME.ime<BR>Push "五笔输入法"<BR>Push "$SYSDIR\WBIME.ime"<BR>System::Call "Imm32::ImmInstallIME(t s, t s) i .s"<BR>System::Call "Imm32::ImmIsIME(i s) i .s"<BR>Pop $0<BR>IntCmp $0 1 0 +3 +3<BR>MessageBox MB_OK "输入法安装成功"<BR>Goto +2<BR>MessageBox MB_OK "输入法安装失败"</P><img src ="http://www.cppblog.com/geforcex/aggbug/1463.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/geforcex/" target="_blank">geforceX</a> 2005-12-01 13:31 <a href="http://www.cppblog.com/geforcex/articles/1463.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>网友对驱动开发前途的看法</title><link>http://www.cppblog.com/geforcex/articles/1345.html</link><dc:creator>geforceX</dc:creator><author>geforceX</author><pubDate>Sun, 27 Nov 2005 12:17:00 GMT</pubDate><guid>http://www.cppblog.com/geforcex/articles/1345.html</guid><wfw:comment>http://www.cppblog.com/geforcex/comments/1345.html</wfw:comment><comments>http://www.cppblog.com/geforcex/articles/1345.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/geforcex/comments/commentRss/1345.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/geforcex/services/trackbacks/1345.html</trackback:ping><description><![CDATA[<SPAN class=tpc_content><FONT size=2>如果你是冲钱来的，我先劝你打住，因为这个行当，从3K到十几K都有，你报的希望太高，恐怕失望会太大。 <BR><BR>要身体好（肯熬夜），有点智商（不要太高，否则去研究相对论），心理承受能力好点（不然由于经常郁闷，容易精神分裂）就可以了。 <BR><BR>光会做驱动 （我是指，有些驱动，特别是在WINDOWS下的驱动，不需要什么很深的东西就高出来了，我自己做的一个驱动就是，别人在硬件上做了个STRING，我读出来，分析一下，就完了，完全和写应用程序没有什么区别） 应该是不会MONEY太多的，驱动也是程序，不过就是运行在内核模式而已。你得知道很多HARDWARE的知识（比如PCI，USB等总线结构），或是网络的知识（TCP/IP协议，防火墙等），这样你的开发能力才算是高，老板才肯给你MONEY多多。不过，这够你学一些日子了。 <BR><BR>建议方向：嵌入试LINUX <BR>1 嵌入试应用广 <BR>2 LINUX免费，国内老板喜欢 <BR>3 即使你不做LINUX，也必须看，因为做别的东西，经常是在LINUX里找点东西，移植过去 <BR>4 （这点你肯定喜欢）同水平的开发，LINUX开发人员普遍MONEY比WINDOWS开发人员高。 </FONT></SPAN><img src ="http://www.cppblog.com/geforcex/aggbug/1345.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/geforcex/" target="_blank">geforceX</a> 2005-11-27 20:17 <a href="http://www.cppblog.com/geforcex/articles/1345.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>