开始之前先简单说明下cmd文件和bat文件的区别:在本质上两者没有区别,都是简单的文本编码方式,都可以用记事本创建、编辑和查看。两者所用的命令行代码也是共用的,只是cmd文件中允许使用的命令要比bat文件多。cmd文件只有在windows2000以上的系统中才能运行,而bat文件则没有这个限制。从它们的文件描述中也可以看出以上的区别:cmd文件的描述是“windows nt命令脚本”, bat文件的描述是“ms dos批处理文件”
如果没有一定的相关知识恐怕不容易看懂和理解批处理文件,也就更谈不上自己动手编写了.批处理文件是无格式的文本文件,它包含一条或多条命令。它的文件扩展名为 .bat 或 .cmd。在命令提示下键入批处理文件的名称,或者双击该批处理文件,系统就会调用cmd.exe按照该文件中各个命令出现的顺序来逐个运行它们。使用批处理文件(也被称为批处理程序或脚本),可以简化日常或重复性任务。当然我们的这个版本的主要内容是介绍批处理在入侵中一些实际运用,例如我们后面要提到的用批处理文件来给系统打补丁、批量植入后门程序等。下面就开始我们批处理学习之旅吧。
1. 简单批处理内部命令简介1) echo 命令 打开回显或关闭请求回显功能,或显示消息。如果没有任何参数,echo 命令将显示当前回显设置。 @echooff echohello world Sample 2 : @echo off echo 1 echo. echo 2 echo on echo 3 pause 在实际应用中我们会把这条命令和重定向符号(也称为管道符号,一般用> >> ^)结合来实现输入一些命令到特定格式的文件中.这将在以后的例子中体现出来。 c:\>dir *.txt > 1.txt c:\>dir *.txt >> 1.txt 2) @ 命令 表示不显示@后面的命令,在入侵过程中(例如使用批处理来格式化敌人的硬盘)自然不能让对方看到你使用的命令啦。 3) goto 命令指定跳转到标签,找到标签后,程序将处理从下一行开始的命令。 4) rem 命令注释命令,在C语言中相当与/*--------*/,它并不会被执行,只是起一个注释的作用,便于别人阅读和你自己日后修改。 5) pause 命令运行 Pause 命令时,将显示下面的消息: 6) call 命令从一个批处理程序调用另一个批处理程序,并且不终止父批处理程序。call 命令接受用作调用目标的标签。如果在脚本或批处理文件外使用 call,它将不会在命令行起作用 语法 7) start 命令Start 启动单独的“命令提示符”窗口来运行指定程序或命令。如果在没有参数的情况下使用,start 将打开第二个命令提示符窗口。
语法 start ["title"] [/dPath] [/min] [/max] [{/separate |/shared}] [{/low | /normal | /high | /realtime | /abovenormal | belownormal}][/wait] [/B] [FileName] [parameters]
参数 "title" 指定在“命令提示符”窗口标题栏中显示的标题。 /dpatch 指定启动目录。 /i 将 Cmd.exe 启动环境传送到新的“命令提示符”窗口。 /min 启动新的最小化窗口。 /max 启动新的最大化窗口。 /separate 在单独的内存空间启动 16 位程序。 /shared 在共享的内存空间启动 16 位程序。 /low 以空闲优先级启动应用程序。 /normal 以一般优先级启动应用程序。 /high 以高优先级启动应用程序。 /realtime 以实时优先级启动应用程序。 /abovenormal 以超出常规优先级的方式启动应用程序。 /belownormal 以低出常规优先级的方式启动应用程序。 /wait 启动应用程序,并等待其结束。 /b 启动应用程序时不必打开新的“命令提示符”窗口。除非应用程序启用 CTRL+C,否则将忽略 CTRL+C 操作。使用 CTRL+BREAK 中断应用程序。 非执行文件只要将文件名作为命令键入,即可通过其文件关联运行该文件。有关使用 assoc 和 ftype 在命令脚本中创建这些关联的详细信息,请参阅“”。 在运行的命令的第一个标记为“CMD”字符串但不包括扩展名或路径限定符时,“CMD”将被 COMSPEC 变量的值取代。这样可以防止用户从当前目录选取 cmd。 当您运行 32 位图形用户界面 (GUI) 应用程序时,cmd 不会在返回到命令提示符之前等待应用程序退出。如果从命令脚本运行应用程序,则不会发生这种新情况。在运行的命令中第一个符号不包括扩展名的情况下,Cmd.exe 使用 PATHEXT 环境变量的值确定要查找的扩展名以及查找顺序。PATHEXT 变量的默认值为:COM;.EXE;.BAT;.CMD(语法与 PATH 变量相同,使用分号分开不同元素)。当您搜索可执行文件且在任何扩展名上都没有匹配项时,start 将搜索目录名。
具体例子: 说明:如果你所在程序的路径中带有空格,那么必须用“”把路径括起来,否则系统会提示找不到XX文件,另外,在运行某些程序时,需在路径的前面加一对空白的“”,表示创建一个空白的窗口,它指向的程序是XXXXXXXX。还有就是别忘了空格。
当我想运行位于“D:\draw\”的“photoshop.exe”使,应该使用以下命令: start “”“D:\draw\photoshop.exe” 表示以常规窗口运行程序
如果想让程序以最大化窗口运行,则使用以下命令:
start /max“”“D:\draw\photoshop.exe” 表示以最大化窗口运行程序
最小化这是这样:
start /min "" "D:\draw\photoshop.exe" 表示以最小化窗口运行程序
等待某个程序允许完毕,也就是窗口关闭后,再打开下一个程序这可以这样:
start /w "" "D:\draw\photoshop.exe" start "" cmd.exe
start /min “” “e:\t.cmd” 8) choice 命令choice 使用此命令可以让用户输入一个字符,从而运行不同的命令。使用时应该加/c:参数,c:后应写提示可输入的字符,之间无空格。它的返回码为1234…… :defrag 此文件运行后,将显示 defrag,mem,end[D,M,E]? 用户可选择d m e ,然后if语句将作出判断,d表示执行标号为defrag的程序段,m表示执行标号为mem的程序段,e表示执行标号为end的程序段,每个程序段最后都以goto end将程序跳到end标号处,然后程序将显示good bye,文件结束。
9) If 命令if 表示将判断是否符合规定的条件,从而决定执行不同的命令。 有三种格式: 2、if exist 文件名 待执行的命令 如if exist config.sys edit config.sys 3、if errorlevel / if not errorlevel 数字 待执行的命令 10)for 命令FOR这条命令基本上都被用来处理文本,但还有其他一些好用的功能! 看看他的基本格式(这里我引用的是批处理中的格式,直接在命令行只需要一个%号) 参数:FOR有4个参数 /d /l /r /f 他们的作用我在下面用例子解释 可以在CMD输入for /?看系统提供的帮助!对照一下 %%variable 指定一个单一字母可替换的参数。
/d 录(而不是指定目录中的文件组)执行指定的 Command。 系统帮助的格式:FOR /D%%variable IN (set) DO command @echo off 把他保存放在C盘根目录执行,就会把C盘目录下的全部目录名字打印出来,而文件名字一个也不显示! @echo off 这样的话如果你当前目录下有目录名字只有1-3个字母的,就会显示出来,没有就不显示了
@echo off 保存到C盘下执行,会显示什么呢?自己看吧! /R 当前目录。如果 Set 只是一个句点 (.),则只枚举目录树。 上面我们知道,/D只能显示当前路径下的目录名字,那么现在这个/R也是和目录有关,他能干嘛呢?放心他比 /D强大多了! @echo off 咋们把这个BAT保存到D盘随便哪里然后执行,我会就会看到,他把C盘根目录,和每个目录的子目录下面全部 的EXE文件都列出来了,这里的c:\就是目录了。 再来一个 参数不一样了,这个命令前面没加那个C:\也就是搜索路径,这样他就会以当前目录为搜索路径,比如你这 个BAT你把他防灾d:\test目录下执行,那么他就会把D:\test目录和他下面的子目录的全部EXE文件列出 来!!!
。/L 将通过对 Start# 与 End# 进行比较来执行迭代变量。如果 Start# 小于 End#,就会执行该命令。 如果迭代变量超过 End#,则命令解释程序退出此循环。还可以使用负的 Step# 以递减数值的方式逐步执 行此范围内的值。例如,(1,1,5)生成序列 1 2 3 4 5,而 (5,-1,1) 则生成序列 (5 4 3 2 1)。语法是: 系统帮助的格式:for /L%% Variable in (Start#,Step#,End#) do Command 例如: @echo off 保存执行看效果,他会打印从1 2 3 4 5 这样5个数字 再看这个例子 执行后是不是吓了一跳,怎么多了5个CMD窗口,呵呵!如果把那个 (1,1,5)改成 (1,1,65535)会有什么结果, 我先告诉大家,会打开65535个CMD窗口....这么多你不死机算你强! 当然我们也可以把那个startcmd改成md %%i 这样就会建立指定个目录了!!!名字为1-65535 看完这个被我赋予破坏性质的参数后,我们来看最后一个参数 /f 含有/F的for详细说明 含有/F的for有很大的用处,在批处理中使用的最多,用法如下: FOR/F ["options"] %%i IN ("string") DO command FOR/F ["options"] %%i IN ('command') DO command 这个可能是最常用的,也是最强的命令,主要用来处理文件和一些命令的输出结果。 file代表一个或多个文件 string 代表字符串 command代表命令 ["options"]可选 对于FOR /F %%i IN (file) DO command file为文件名,按照官方的说法是,for会依次将file中的文件打开,并且在进行到下一个文件之前将每个文件读取到内存,按照每一行分成一个一个的元素,忽略空白的行,看个例子。 假如文件a.txt中有如下内容: 第1行第1列第1行第2列第1行第3列 你想显示a.txt中的内容,会用什么命令呢?当然是type,type a.txt for也可以完成同样的命令: for /f %%i in(a.txt) do echo %%i 还是先从括号执行,因为含有参数/f,所以for会先打开a.txt,然后读出a.txt里面的所有内容,把它作为一个集合,并且以每一行作为一个元素,所以会产生这样的集合, {"第1行第1列第1行第2列第1行第3列", //第一个元素 "第2行第1列第2行第2列第2行第3列", //第二个元素 "第3行第1列第3行第2列第3行第3列"} //第三个元素 集合中只有3个元素,同样用%%i依次代替每个元素,然后执行do后面的命令。 具体过程: 用%%i代替"第1行第1列第1行第2列第1行第3列",执行do后面的echo %%i,显示"第1行第1列第1行第2列第1行第3列", 用%%i代替"第2行第1列第2行第2列第2行第3列",执行echo %%i,显示"第2行第1列第2行第2列第2行第3列", 依次,直到每个元素都代替完为止。 为了加强理解/f的作用,请执行一下两个命令,对比即可明白: for/f %%i in (a.txt) do echo %%i //这个会显示a.txt里面的内容,因为/f的作用,会读出a.txt中 for%%i in (a.txt) do echo %%i //而这个只会显示a.txt这个名字,并不会读取其中的内容。 通过上面的学习,我们发现for /f会默认以每一行来作为一个元素,但是如果我们还想把每一行再分解更小的内容,该怎么办呢?不用担心,for命令还为我们提供了更详细的参数,使我们将每一行分为更小的元素成为可能。 它们就是:delims和tokens delims 用来告诉for每一行应该拿什么作为分隔符,默认的分隔符是空格和tab键 比如,还是上面的文件,我们执行下面的命令: for/f "delims= " %%i in (a.txt) do echo %%i 显示的结果是: 第1行第1列 为什么是这样的呢。因为这里有了delims这个参数,=后面有一个空格,意思是再将每个元素以空格分割,默认是只取分割之后的第一个元素。 执行过程是: 将第一个元素"第1行第1列第1行第2列第1行第3列"分成三个元素:"第1行第1列" "第1行第2列" "第1行第3列",它默认只取第一个,即"第1行第1列",然后执行do后面的命令,依次类推。 但是这样还是有局限的,如果我们想要每一行的第二列元素,那又如何呢? 这时候,tokens跳出来说,我能做到。 它的作用就是当你通过delims将每一行分为更小的元素时,由它来控制要取哪一个或哪几个。 还是上面的例子,执行如下命令: for/f "tokens=2 delims= " %%i in (a.txt) do echo %%i 执行结果: 第1行第2列 如果要显示第三列,那就换成tokens=3。 同时tokens支持通配符*,以及限定范围。 如果要显示第二列和第三列,则换成tokens=2,3或tokens=2-3,如果还有更多的则为:tokens=2-10之类的。 此时的命令为: for/f "tokens=2,3 delims= " %%i in (a.txt) do echo %%i %%j 怎么多出一个%%j? 这是因为你的tokens后面要取每一行的两列,用%%i来替换第二列,用%%j来替换第三列。 并且必须是按照英文字母顺序排列的,%%j不能换成%%k,因为i后面是j 执行结果为: 第1行第2列第1行第3列 对以通配符*,就是把这一行全部或者这一行的剩余部分当作一个元素了。 比如: for/f "tokens=* delims= " %%i in (a.txt) do echo %%i 执行结果为: 第1行第1列第1行第2列第1行第3列 其实就跟for /f %%i in (a.txt) do echo %%i的执行结果是一样的。 再如: for/f "tokens=2,* delims= " %%i in (a.txt) do echo %%i %%j 执行结果为: 第1行第2列第1行第3列 用%%i代替第二列,用%%j代替剩余的所有 最后还有skip合eol,这俩个简单,skip就是要忽略文件的前多少行,而eol用来指定当一行以什么符号开始时,就忽略它。 比如: for/f "skip=2 tokens=*" %%i in (a.txt) do echo %%i 结果为: 第3行第1列第3行第2列第3行第3列 用skip来告诉for跳过前两行。 如果不加tokens=*的话,执行结果为: 第3行第1列 不知道怎么回事。 再如,当a.txt内容变成: .第1行第1列第1行第2列第1行第3列 执行for /f "eol=. tokens=*"%%i in (a.txt) do echo %%i结果是: 第3行第1列第3行第2列第3行第3列 用eol来告诉for忽略以"."开头的行。 同样也必须加tokens=*,否则只会显示"第3行第1列" 2. 如何在批处理文件中使用参数批处理中可以使用参数,一般从1%到 9%这九个,当有多个参数时需要用shift来移动,这种情况并不多见,我们就不考虑它了。 sample2: 3. 如何使用组合命令(Compound Command)1.&Usage:第一条命令 & 第二条命令 [& 第三条命令...] 用这种方法可以同时执行多条命令,而不管命令是否执行成功 Sample: Directory of c:\\Ex4rc 2002-05-14 23:51 <DIR> . 2.&&Usage:第一条命令 && 第二条命令[&& 第三条命令...] 用这种方法可以同时执行多条命令,当碰到执行出错的命令后将不执行后面的命令,如果一直没有出错则一直执行完所有命令; Sample: C:\\>dir c:\\Ex4rch && dir z: Directory of c:\\Ex4rch 2002-05-14 23:55 <DIR> . 在做备份的时候可能会用到这种命令会比较简单,如: 3.||Usage:第一条命令 || 第二条命令 [|| 第三条命令...] 用这种方法可以同时执行多条命令,当碰到执行正确的命令后将不执行后面的命令,如果没有出现正确的命令则一直执行完所有命令; Sample: Directory of C:\\Ex4rch 2002-05-14 23:55 14 sometips.gif 组合命令使用的例子: 4. 管道命令的使用1. | 命令Usage:第一条命令 | 第二条命令 [| 第三条命令...] sample:
2. >、>>输出重定向命令将一条命令或某个程序输出结果的重定向到特定文件中, > 与 >>的区别在于,>会清除调原有文件中的内容后写入指定文件,而>>只会追加内容到指定文件中,而不会改动其中的内容。 sample1: sample2: 3. < 、>& 、<&< 从文件中而不是从键盘中读入命令输入。
5. 如何用批处理文件来操作注册表在入侵过程中经常会操作注册表的特定的键值来实现一定的目的,例如:为了达到隐藏后门、木马程序而删除Run下残余的键值。或者创建一个服务用以加载后门。当然我们也会修改注册表来加固系统或者改变系统的某个属性,这些都需要我们对注册表操作有一定的了解。下面我们就先学习一下如何使用.REG文件来操作注册表.(我们可以用批处理来生成一个REG文件) 1).创建创建分为两种,一种是创建子项(Subkey) 我们创建一个文件,内容如下: Windows Registry Editor Version 5.00 [HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\hacker] 然后执行该脚本,你就已经在HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft下创建了一个名字为“hacker”的子项。 另一种是创建一个项目名称 Windows Registry Editor Version 5.00 [HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run] 这样就在[HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run]下 2).修改修改相对来说比较简单,只要把你需要修改的项目导出,然后用记事本进行修改,然后导入(regedit /s)即可。
3).删除我们首先来说说删除一个项目名称,我们创建一个如下的文件: Windows Registry Editor Version 5.00 [HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run] 执行该脚本,[HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run]下的"Ex4rch"就被删除了;
附1: WIN2000下的9个批处理命令批处理文件是将一系列命令按一定的顺序集合为一个可执行的文本文件,其扩展名为BAT。 1) REM REM 是个注释命令一般是用来给程序加上注解的,该命令后的内容在程序执行的时候将不会被显示和执行。例: 2) ECHO ECHO 是一个回显命令主要参数有OFF和 ON,一般用ECHO message来显示一个特定的消息 。例: 3) GOTO GOTO 即为跳转的意思。在批处理中允许以":XXX"来构建一个标号然后用GOTO :标号直接来执行标号后的命令。例 4) CALL CALL 命令可以在批处理执行过程中调用另一个批处理,当另一个批处理执行完后再继续执行原来的批处理。例: 5) PAUSE PAUSE 停止系统命令的执行并显示下面的内容。例: 6) IF IF 条件判断语句,语法格式如下: 3、 IF [NOT] EXIST filename command 7) FOR FOR这个命令比较特殊是一个循环执行命令的命令,同时FOR的循环里面还可以套用FOR在进行循环。这篇我们介绍基本的用法就不做套用的循环了,后面再来讲解套用的循环。在批处理中FOR的命令如下: /F 从指定的文件中读取数据作为变量 8) SETLOCAL 开始批处理文件中环境改动的本地化操作。在执行 SETLOCAL 之后 9) SHIFT SHIFT命令可以让在命令上的的命令使用超过10个(%0~%9)以上的可替代参数例:
附2:特殊的符号与批处理在命令行下有些符号是不允许使用的但有些符号却有着特殊的意义。 1) 符号(@) @在批处理中的意思是关闭当前行的回显。我们从上面知道用命令echo off可以关掉整个批处理的命令回显但却不能不显示echo off这个命令。现在我们在这个命令前加上@这样echo off这一命令就被@关闭了回显从而达到所有命令均不回显得要求。 2) 符号(>) >的意思是传递并覆盖。他所起的作用是将运行后的回显结果传递到后面的范围(后面可是文件也可是默认的系统控制台)例: 3) 符号(>>) 符号>>的作用与符号>相似,但他们的区别在于>>是传递并在文件末尾追加,>>也可将回显传递给控制台(用法同上)例: 4) 符号(|) |是一个管道传输命令意思是将上一命令执行的结果传递给下一命令去处理。例: 5) 符号(^) ^ 是对特殊符号 > 、<、 &、的前导字符。在命令中他将以上的3个符号的特殊动能去掉仅仅只吧他们当成符号而不使用他们的特殊意义。例: 6) 符号(&) &符号允许在一行中使用2个以上不同的命令,当第一个命令执行失败将不影响第2个命令的执行。例: 7) 符号(&&) &&符号也是允许在一行中使用2个以上不同的命令,当第一个命令执行失败后后续的命令将不会再被执行。例: 8) 符号("") " "符号允许在字符串中包含空格。进入一个特殊的目录可以用如下方法例: 9) 符号(,) ,符号相当于空格。在某些特殊的情况下可以用,来代替空格使用。例: 10) 符号(;) ;符号当命令相同的时候可以将不同的目标用;隔离开来但执行效果不变。如执行过程中发生错误则只返回错误报告但程序还是会继续执行。例: |
|