首页
社区
课程
招聘
[旧帖] [求助]解答批处理。BAT的代码的意思 0.00雪花
发表于: 2008-11-6 14:46 5102

[旧帖] [求助]解答批处理。BAT的代码的意思 0.00雪花

2008-11-6 14:46
5102
下面批处理加密文件的代码,看不懂是什么意思,哪们大虾能我解答?

@if not exist "%~f1" (@echo File doesn't exist!&@goto :eof) else (echo exit|cmd /kprompt e100 FF FE 20 26 63 6C 73 0D 0A $_rcx$_9$_n t12.5$_w$_q$_|debug>nul&&@copy t12.5+"%~f1" "%~dpn1"_jm.bat>nul&&echo Successful!&del t12.5)

源文件下载
http://www.live-share.com/files/364288/____BAT____.rar.html

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (5)
雪    币: 201
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
首先说一下,这个批处理底做了什么:
这个批处理的加密,就是在输入文件的前面加了9个字节,而且是固定内容 0xFF 0xFE 0x20 0x26 0x63 0x6C 0x73 0x0D 0x0A, 后面开始连接文件的原始内容.

但是为什么开始的内容是"0xFF 0xFE 0x20 0x26 0x63 0x6C 0x73 0x0D 0x0A"就不知道了.
"0xFF 0xFE" 表示字符编码是 Unicode
"0x20" ANSI格式的空格
"0x26 0x63 0x6C 0x73" ANSI格式的字符串 "&cls"
"0x0D 0x0A" ANSI格式的回车

所以,我猜测这个批处理的内容应该是这样的
ANSI格式:"0x20 0x26 0x63 0x6C 0x73 0x0D 0x0A"
Unicode格式:"0xFF 0xFE 0x20 0x00 0x26 0x00 0x63 0x00 0x6C 0x00 0x73 0x00 0x0D 0x00 0x0A 0x00"

相对应的内容为:
ANSI格式:
cls
@if not exist "%~f1" (@echo File doesn't exist!&@goto :eof) else (echo exit|cmd /kprompt e100 20 26 63 6C 73 0D 0A $_rcx$_7$_n t12.5$_w$_q$_|debug>nul&@copy t12.5+"%~f1" "%~dpn1"_jm.bat>nul&echo Successful!&del t12.5)

Unicode格式:
cls
@if not exist "%~f1" (@echo File doesn't exist!&@goto :eof) else (echo exit|cmd /kprompt e100 FF FE 20 00 26 00 63 00 6C 00 73 00 0D 00 0A 00 $_rcx$_F$_n t12.5$_w$_q$_|debug>nul&@copy t12.5+"%~f1" "%~dpn1"_jm.bat>nul&echo Successful!&del t12.5)

需要解密的话,就是将文件前面的增加的几个字节删除即可.

==========================================
注意:下面为了解释明了而断行,批处理中不能断行.

将批处理断行如下:

批处理文件名:test.bat
--------------
1  cls
2  @if not exist "%~f1"
4    (
5       @echo File doesn't exist!
6       &
7       @goto :eof
8    )
9  else
10   (
11      echo exit|cmd /kprompt e100 FF FE 20 26 63 6C 73 0D 0A $_rcx$_9$_n t12.5$_w$_q$_|debug>nul
12      &
13      &
14      @copy t12.5+"%~f1" "%~dpn1"_jm.bat>nul
15      &
16      &
17      echo Successful!
18      &
19      del t12.5
20   )

下面详细说明
==========================
1  cls
//简单的进行清屏

2  @if not exist "%~f1"
4    (
8    )
9  else
10   (
20   )
//构成判断结构,
//行2,其中的"%~f1"是将第一个参数转换为文件路径+文件名+扩展名.例如: 输入"C:\>test.bat infile.txt",那么"%~f1"就是"C:\infile.txt".

4    (
5       @echo File doesn't exist!
6       &
7       @goto :eof
8    )
//构成语句块
//行5,输出一个提示"File doesn't exist!"
//行6,语句连接字符
//行7,跳转到 :EOF 标签,该标签为默认标签,意思是批处理执行结束.

10   (
11      echo exit|cmd /kprompt e100 FF FE 20 26 63 6C 73 0D 0A $_rcx$_9$_n t12.5$_w$_q$_|debug>nul
12      &
13      &
14      @copy t12.5+"%~f1" "%~dpn1"_jm.bat>nul
15      &
16      &
17      echo Successful!
18      &
19      del t12.5
20   )
//构成语句块
//行11,该语句比较复杂,再次拆分如下:
-------------
11-1      echo exit
11-2      |
11-3      cmd /kprompt e100 FF FE 20 26 63 6C 73 0D 0A $_rcx$_9$_n t12.5$_w$_q$_
11-4      |
11-5      debug
11-6      >
11-7      nul
//行11-1,输出字符"exit"
//行11-2,管道命令
//行11-3,利用改变命令符命令"CMD /KPROMPT [text]",构建字符串"e100 FF FE 20 26 63 6C 73 0D 0A $_rcx$_9$_n t12.5$_w$_q$_"
//行11-4,管道命令
//行11-5,执行DEBUG程序
//行11-6,输出
//行11-7,表示"空"

为了解释方便,再次将行11-3进行拆分.
------------
11-3-1      cmd /kprompt e100 FF FE 20 26 63 6C 73 0D 0A $_
11-3-2      rcx $_
11-3-3      9 $_
11-3-4      n t12.5 $_
11-3-5      w $_
11-3-6      q $_
//在上面的"$_"表示回车

哈哈!估计已经看的有点头大了,不过已经拆分的差不多了,开始正式对行11进行解释^_^
首先,对于使用管道操作的指令,需要从右边向左边读.首先排除行11-6的内容,看行11-1到行11-5的内容.
但是,执行却仍旧是从左边向右边执行,所以下面的解释可能比较混乱-_-!

那么,现在解释开始,系统执行带参数的DEBUG命令,参数内容为行11-3的输出内容,
但是,行11-3却运行了CMD命令,所以需要先运行这个命令.
这个命令的内容是"C:\>cmd /kprompt e100 FF FE 20 26 63 6C 73 0D 0A $_rcx$_9$_n t12.5$_w$_q$_",
这个命令输出的字符串是"e100 FF FE 20 26 63 6C 73 0D 0A [回车]rcx[回车]9[回车]n t12.5[回车]w[回车]q[回车]"
现在命令行建立出来,但是,此时仍旧在CMD的命令控制下,所以需要使用EXIT来退出,所以刚好接受了行11-1的"EXIT[回车]"命令,将CMD退出.

将这个构建好的字符串再管道给行11-5.那么DEBUG程序得到参数,构建好的命令行如下:
"C:\>DEBUG[回车] e100 FF FE 20 26 63 6C 73 0D 0A [回车]rcx[回车]9[回车]n t12.5[回车]w[回车]q[回车]"
--------------
现在对这个命令进行解释:
C:\>debug[回车]                           //运行DEBUG程序
-e100 FF FE 20 26 63 6C 73 0D 0A [回车]   //在内存0x100的地方输入9个十六进制内容 0xFF 0xFE 0x20 0x26 0x63 0x6C 0x73 0x0D 0x0A
-rcx [回车]                               //修改CX寄存器(文件长度)
CX 0000
:9 [回车]                                 //修改为0x0009
-n t12.5 [回车]                           //文件名为"t12.5"
-w [回车]                                 //写到磁盘
Writing 00009 bytes
-q [回车]                                 //退出DEBUG

此时可以看到,在当前批处理程序所在的目录下,建立了一个名字叫"t12.5"的临时文件,内容为9个字节.接下来开始执行11-6.

//行11-6,是一个输出命令,上一个命令的输出内容,输出到后面的对象上.
//行11-7,接受行11-6传输来的信息,但是行11-7的内容为"nul",表示空.也就是说,因为该语句,行11将没有任何回显内容.
(注:如果想看回显内容,将行11-6和行11-7内容删除)

//行12,语句连接字符
//行13,语句连接字符
(注:本人认为,此处多输入了一个"&".输入一个即可)

//行14,为单一的连接拷贝命令,命令内容"C:\>copy t12.5+"%~f1" "%~dpn1"_jm.bat".
命令中的"%~dpn1"是将第一个参数转换为文件路径+文件名.例如: 输入"C:\>test.bat infile.txt",那么"%~dpn1"就是"C:\infile".
(注:"%~f1"请参考行2的解释)
(注:">"和"nul"请参考行11-6和行11-7的解释.)
用例子解释这个命令,意思是说,将建立的t12.5连接infile.txt文件,输出到infile_jm.bat.

//行15,语句连接字符
//行16,语句连接字符
(注:本人认为,此处多输入了一个"&".输入一个即可)

//行17,输出"Successful!"

//行18,语句连接字符

//行19,删除中间过度文件"t12.5"
2008-11-6 23:16
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
当时看第一眼时,一个字晕.
太详细了,谢谢分享下.
2008-11-7 15:02
0
雪    币: 191
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
2楼的大虾,写得太棒了,
用该方法加密的文件,可以用WINHEX用打开文件,可以还原原源码!
2008-11-9 14:13
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
这BAT加密工具正是黑客档案第9月的光盘BAT加密免杀工具
2008-11-10 04:15
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
汇编部分正在学,但是其它部分还勉强看得懂,二楼的朋友说得基本上解惑,但是对于两处“&&”的用法可简省则似乎有些小问题,在批处理中,“&&”表示前面的语句成功执行后才执行后面语句,与之相对应的还有“||”表示前面语句执行失败后运行后边语句,因为在批处理里面if else只对判断逻辑表达式值,对于一个命令的运行结果只有靠errorlevel去判断,所以此时的&&,||就充当了这个if else的作用,有个例子说明此点:
C:\DOCUME~1\ADMINI~1>echo hello & echo success | echo faiture
hello
faiture


C:\DOCUME~1\ADMINI~1>echo hello && echo success || echo faiture
hello
success


C:\DOCUME~1\ADMINI~1>1 2>nul && echo success || echo faiture
faiture
2008-11-12 08:41
0
游客
登录 | 注册 方可回帖
返回
//