一、cmd脚本基本知识

  行注释:

REM 这里是注释的内容

  输出一个空行;紧跟着一个点。

echo.

  屏幕暂停,按回车键脚本继续执行;单词的英文意思就是暂停。

pause

  取消命令回显(在脚本中不现实执行的是那些命令);回显可以调试错误时看清楚错在哪一行。

@echo off

  显示当前目录

C:\Program Files (x86)\run>cd
C:\Program Files (x86)\run

  自定义提示符;“#”号后边有个空格;出来的效果就咋个linux一样的。

C:\Users\Administrator>prompt # 
#

  “@echo off”中@的含义

  在cmd执行命令时,不易觉察。要是写个脚本,仅仅包含一行时,带不带“@”,效果就很明显了。就例子“@echo off”看,想关闭回显,带了就在该命令执行时起作用,不带就是后边语句执行起作用。



二、BAT与CMD中的部分参数
  1、环境变量

    %windir%     —— 操作系统文件夹,“C:\windows”
    %programfiles%   —— 应用程序默认安装目录,“C:\Program Files”
    %systemdrive%   —— 操作系统所在磁盘,“C:”
    %systemroot%   —— 操作系统文件夹,“C:\windows”
    %TEMP%      —— 当前用户的临时目录:

                “C:\Users\USER\AppData\Local\Temp”

    %TMP%      —— 当前用户的临时目录,同上

    %USERNAME%    —— 当前用户

                Administrator

:查看目前操作的用户

#



  2、cmd内置命令(可以在CMD命令行模式中输入HELP获得)

    ATTRIB   —— 显示或更改文件属性。
    BREAK   —— 设置或清除扩展式 CTRL+C 检查。
    CALL    —— 从另一个批处理程序调用这一个。
    CD     —— 显示当前目录的名称或将其更改。
    CHDIR   —— 显示当前目录的名称或将其更改。
    CHKDSK   —— 检查磁盘状态。
    COLOR   —— 设置默认控制台的颜色属性:color 0F,黑底白字

            (参数是两个十六进制数字,表示背景色、前景色)。
    COPY    —— 将至少一个文件复制到另一个位置。
    DEL    —— 删除至少一个文件。
    DIR    —— 显示一个目录中的文件和子目录。
    ECHO    —— 显示消息;打开或关上“命令回显”。
    EXIT    —— 退出命令解释、或脚本。
    FC     —— 比较两个或两套文件,并显示不同处。
    FIND    —— 在文件中搜索文本字符串。
    FINDSTR  —— 在多个文件中搜索字符串。
    FOR    —— 循环语句

    IF    —— 选择语句
    MD    —— 创建目录。
    MOVE   —— 将文件从一个目录移到另一个目录。
    PATH   —— 显示或设置可执行文件的搜索路径。
    PAUSE   —— 暂停批文件的处理并显示消息。
    PROMPT  —— 更改 Windows 命令提示符。
    RD   —— 删除目录。
    REM   —— 记录批文件或 CONFIG.SYS 中的注释。
    REN   —— 重命名文件。
    REPLACE  —— 替换文件。
    SET   —— 显示、设置或删除 Windows 环境变量。
    SETLOCAL   —— 开始批文件中环境更改的本地化。
    SHIFT   —— 更换批文件中可替换参数的位置。
    SORT   —— 对输入进行分类。
    START   —— 启动另一个窗口来运行指定的程序或命令。
    TITLE   —— 设置 CMD.EXE 会话的窗口标题。
    TYPE   —— 显示文本文件的内容。



  3、外部命令(C:\Windows\System32\)


    net   —— (*复杂难以解释)

    netstat   —— (*复杂难以解释)

    ping   —— 可以检测网络的运行状态的程序,从WINDOWS时×××始就有了

    regsvr32   —— 服务注册程序,一般是插件的注册,也可以是解码器
    reg   —— (*复杂难以解释)

    shutdown   —— (*复杂难以解释)

    systeminfo   —— 查看系统当前配置情况的参数,也可以显示出运行时间等
    taskkill   —— 进程删除程序,这个可以关闭至少一个进程
    tasklist   ——查看当前进程列表的程序

    where   ——搜索文件位置




三、制作带向导功能的特殊结构脚本
  看到标题大家可能会有点郁闷:BAT、CMD脚本也可以实现向导功能?
  很荣幸的告诉大家,是的。BAT、CMD脚本不但可以实现脚本的向导功能,而且还可以结合大量的参数,组合成一个只需要不到100KB就可以通吃所有系统的工具包!

  本介绍部分可以配合“结合Universal Extractor进行简单软件的绿化制作”所写的制作过程进行实况编写,不过限于篇幅关系,这里只对带有向导的BAT、CMD脚本进行解析。



  首先让我们看一个简单的不能再简单的例子

@echo off
cls




四、利用第三方工具进行基于脚本的软件的生成
  这段时间在网上发现两个很好玩的工具:EXE2BAT 1.0 与 文件转换VBS.VBS。前者会把所有EXE文件经过DEBUG程序编写成BAT脚本,让用户在执行BAT脚本的同时可以还原该脚本中包含的文件,默认会执行还原后的文件,当然我们可以修改生成后的脚本;后者会把所有文件都编写成BAT脚本,执行这个BAT文件的用户将得到原文件,过程不说也很清楚,这里就PASS。
  
  目前已经搞到了EXE2BAT的程序源代码,编译用的好象还是WIN32语言的样子(我看不懂……),以下是源代码——

#include <stdio.h>
#include <string.h>
#define M 65279
char *msg="GOOD_LUCK";
void help(void);
char exe2bat(char *,char *);
int main(int argc,char **argv)
{
  if(argc==1)
  {
    help();
  }
  exe2bat(argv[1],argv[2]);
  return 0;
}
void help()
{
  printf("\nWritten by W.Z.T <==Don't be lazy,Just go ahead==>\n\n");
  printf("exe2bat.exe input.exe output.bat\n");
  exit(0);
}
char exe2bat(char *s_f,char *t_f)
{
  FILE *s_fp,*t_fp;
  char *s_fe=s_f;
  char *t_fe=t_f;
  char c;
  char ch;
  long lenth;
  int i=1,k=256;
  if((s_fp=fopen(s_fe,"rb"))==NULL)
  {
    printf("Can't open the file %s.\n",s_fe);
    exit(0);
  }
  if((t_fp=fopen(t_fe,"w+"))==NULL)
  {
    printf("Can't create the file %s.\n",t_fe);
    exit(0);
  }
  fseek(s_fp,0,SEEK_END);
  lenth=ftell(s_fp);
  fseek(s_fp,0,SEEK_SET);
  printf("%ld,%x\n",lenth,lenth);
  if(lenth>=M)
  {
    printf("The exe file's lenth must be <= M-1\n");
    exit(0);
  }
  fputs("@echo e ",t_fp);
  fprintf(t_fp,"%04x ",k);
  while(!feof(s_fp))
  {
    k++;
    c = fgetc(s_fp);
    if(( unsigned char ) c<= ( unsigned char )15)
        fprintf(t_fp,"0",c);
    fprintf(t_fp,"%x ",(unsigned char)c);
    if(i%16==0)
    {
        fputs(">>sgl\n",t_fp);
        fputs("@echo e ",t_fp);
        fprintf(t_fp,"%04x ",k);
    }
    i++;
  }
  if(lenth%16!=0)
    fputs(">>%tmp%\\sgl\n",t_fp);
  fputs("@echo rcx>>sgl\n",t_fp);
  fprintf(t_fp,"@echo %x>>sgl\n",lenth,t_fp);
  fputs("@echo n tthacker>>sgl\n",t_fp);
  fputs("@echo w>>sgl\n",t_fp);
  fputs("@echo q>>sgl\n",t_fp);
  fputs("@debug<sgl>nul\n",t_fp);
  fputs("@del sgl\n",t_fp);
  fputs("@ren tthacker ",t_fp);
  fprintf(t_fp,"%s>>sgl\n",s_fe);
  fputs("@",t_fp);
  fprintf(t_fp,"%s",s_fe);
  fclose(s_fp);
  fclose(t_fp);
  puts(msg);
  return 0;
}


  文件转换VBS的源代码如下(大家可以复制后保存成VBS文件,然后把任意文件拉到这个VBS文件上,将在目录下多出一个BAT文件,那个就是你的文件的“BAT版”了)——

fp=wscript.arguments(0)
fn=right(fp,len(fp)-instrrev(fp,"\"))
with createobject("adodb.stream")
.type=1:.open:.loadfromfile fp:str=.read:sl=lenb(str)
end with
sll=sl mod 65536:slh=sl\65536
with createobject("scripting.filesystemobject").opentextfile(fp&".bat",2,true)
.write "@echo str="""
for i=1 to sl
bt=ascb(midb(str,i,1))
if bt<16 then .write "0"
.write hex(bt)
if i mod 128=0 then .write """_>>debug.vbs"+vbcrlf+"@echo +"""
next
.writeline """>>debug.vbs"+vbcrlf+"@echo with wscript.stdout:r=vbcrlf"_
+":for i=1 to len(str) step 48:.write ""e""+hex(256+(i-1)/2)"_
+":for j=i to i+46 step 2:.write "" ""+mid(str,j,2):next:.write r:next>>debug.vbs"
.writeline "@echo .write ""rbx""+r+"""+hex(slh)+"""+r+""rcx""+r+"""+hex(sll)_
+"""+r+""n debug.tmp""+r+""w""+r+""q""+r:end with"_
+">>debug.vbs&&cscript.
 //nologo debug.vbs|debug.exe>nul&&ren debug.tmp 
"""&fn&"""&del debug.vbs"
end with



  由于我现在写的是BAT、CMD批处理脚本的应用,所以在这里我们还是着重讲一下EXE2BAT。
我这里有一段由EXE2BAT生成的BAT脚本——

@echo e 100 D5 E2 BE CD CA C7 D7 AA BB BB BA F3 B5 C4 BD E1 >>tmp11
@echo e 110 B9 FB A3 AC B4 F3 BC D2 BB B9 C2 FA D2 E2 B0 C9 >>tmp11
@echo e 120 A3 BF 48 4F 48 4F A1 AB A1 AB 0D 0A 20 20 20 20 >>tmp11
@echo e 130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 >>tmp11
@echo e 140 20 20 20 20 20 20 20 20 20 20 20 A1 AA A1 AA 42 >>tmp11
@echo e 150 59 20 C1 FA C3 CE C7 EF >>tmp11
@echo rcx>>tmp11
@echo 58>>tmp11
@echo n tmp1>>tmp11
@echo w>>tmp11
@echo q>>tmp11
@debug<tmp11>nul
@Copy /b /y tmp1 readme.txt
@start readme.txt
@del tmp*



  大家将上面的代码复制后保存成一个.BAT文件后执行,看看你看到了什么?
  从这里大家可以看出,EXE2BAT的操作原理是先将文件经过DEBUG程序进行编码,然后分解成字符保存。但是由于DEBUG不支持中文,所以如果转换的文件的文件名不是英文,转换后的文件名将会是乱码。




wKiom1hXZLqSUXNuAAAJaS9FXEM805.png