Board logo

标题: [其他] 批处理怎样实现文件头加密法? [打印本页]

作者: plp626    时间: 2011-3-12 15:24     标题: 批处理怎样实现文件头加密法?


批处理加密其中一个方法就是利用unicode 文件头(文件前两个字节十六进制为“FF FE”,此法以实用性被广泛应用)

只是有个致命缺陷:代码的第二行要跟一个cls语句把错误给刷掉,如果在命令行下调用的话,会把屏幕已经输出的信息也给刷掉了,关于这个缺陷原来在cn-dos的时候一直没有得到解决。

我想到了batman那个多行回退的代码
set/p=【制表符】【若干退格符】<nul(不知道的会员可以搜索哈)
然后,今天我觉得这个问题在理论上便解决了。


再然后,bat,vbs混合编程的那个清屏也可以用这个代码来代替cls了;





只是理论归理论,真正要给出一段简短的代码需要N多次测试。

现在求该代码(提示下,这并不是件容易的事,要得到最简短的代码需要你一番折腾的)

(提示,对于文件头FFEF数据,大家可以借助debug命令生成包含该数据的文件)

给出有效代码:加20PB,给出最精简代码加50PB





[ 本帖最后由 plp626 于 2011-3-12 18:02 编辑 ]
作者: CrLf    时间: 2011-3-12 16:59

知道了技巧,退行容易,但是如何做到判断非空行数和不清空原来的内容呢?
写了个处理1.bat的半成品,目前在1.bat被call的时候表现尚可,但是直接运行1.bat时就问题大大的,因为无从猜测运行时会有几行的多余回显。
  1. '&echo off&cls&Start /wait wscript -e:vbs "%~f0"&findstr>>Unicode.tmp /v S %0&copy /b Unicode.tmp+1.bat Unicode.tmp&move Unicode.tmp 1.bat&exit
  2. Set Unicode = CreateObject("Scripting.FileSystemObject").CreateTextFile("Unicode.tmp",,True)
  3. ' 2>nul&@echo [请把此处替换为9个tab键]
复制代码
干脆上传一份算了,本楼代码就是那个《文件头加密.bat》,新建.bat用于创建新的1.bat,call.bat用于运行1.bat(没用到call命令,所以没出错,耶)看效果。
附件已更新
作者: CrLf    时间: 2011-3-12 17:08

我晕,加了code以后回车被砍掉了,2楼代码第四行有个回车,不能省的。
那一大段tab和退格键本来可以用for /l稍作简化,但既然尚未竣工我也就懒得去搞了,意思意思就好
作者: plp626    时间: 2011-3-12 17:41

原帖由 zm900612 于 2011-3-12 16:59 发表
知道了技巧,退行容易,但是如何做到判断非空行数和不清空原来的内容呢?
写了个处理1.bat的半成品,目前在1.bat被call的时候表现尚可,但是直接运行1.bat时就问题大大的,因为无从猜测运行时会有几行的多余回显。
...



d:\Docume
123
请按任意键继续. . .

怎么有一些字符没消去?
==============
问下大家,怎么设置成白色字体黑色背景啊

[ 本帖最后由 plp626 于 2011-3-12 17:47 编辑 ]
作者: plp626    时间: 2011-3-12 17:51

回2楼,我说的那部分代码是没有多余的命令的,

你可以把它保存问 unicode.bat
然后加密时,用
  1. copy/b uniode.bat + 你要加密的文件.bat  已加密.bat
复制代码
对任何文件进行加密
所以你的uniode.bat 无需添加@echo off 这样的代码。。。。
作者: CrLf    时间: 2011-3-12 17:54

我没加@echo off啊,加@只是为了屏蔽本条命令的回显
作者: plp626    时间: 2011-3-12 17:58

原帖由 zm900612 于 2011-3-12 17:54 发表
我没加@echo off啊,加@只是为了屏蔽本条命令的回显


你没搞错吧?
  1.    ? 2>nul&(@echo                   )||echo 123123123
  2. @echo off
  3. echo 123
  4. pause
复制代码

作者: caruko    时间: 2011-3-12 22:36

我试过D0,查看bat文件头,前2字节是 C0 20
改成FF EF,没有变化啊
照样可以notepad打开
作者: CrLf    时间: 2011-3-12 23:02

貌似传错附件了...
好吧,我再上传一下,call是已测无误的,当然前提是在call之前已经echo off过了
作者: yxiaopeng    时间: 2011-3-14 22:58

这个加密是成功了,可是怎么才能解密啊?
作者: CrLf    时间: 2011-3-14 23:02

echo;>a.txt
copy /b a.txt 要解密的文件
这样原来文件头是FF F0,解密后变成0D 0A FF F0,就不会被当成unicode格式了
作者: CrLf    时间: 2011-6-10 16:54

  1. @echo off
  2. chcp 437
  3. wmic os>tmp
  4. set /p head=<tmp
  5. echo !head! 2^>nul>head
  6. copy /b head+%0 unicode
复制代码
或者[code]

晕,最简单的那个方案因为有特殊字符无法直接贴出来,请看附件
作者: plp626    时间: 2011-6-10 18:39

@echo off
chcp 437
wmic os>tmp
set /p head=nul>head
copy /b head+%0 unicode或者

晕,最简单的那个方案因为有特殊字符无法直接贴出来,请看附件
zm900612 发表于 2011-6-10 16:54


现在不是已经有防论坛特殊字符过滤的方法了吗?

看来那个方法推广还有个过程。
作者: CrLf    时间: 2011-6-10 18:52

13# plp626


不是的,特殊字符是一个FF字符和一个汉字,分开没事,放在一起就发不了。
如果用那个函数的话,那直接生成fffe就行了,也无需再用别的方式
作者: plp626    时间: 2011-6-10 18:56

13# plp626


不是的,特殊字符是一个FF字符和一个汉字,分开没事,放在一起就发不了。
如果用那个函数的话,那直接生成fffe就行了,也无需再用别的方式
zm900612 发表于 2011-6-10 18:52


不知道你的具体情况,你把特殊字符方变量里应该可以的:
5楼专门介绍这个方法,
http://bbs.bathome.net/viewthrea ... romuid=353#pid79254
作者: CrLf    时间: 2011-6-11 12:47

昨天在batman的帮助下,终于有了新突破:
  1. @find /v "find"<%~s0>样本文件.bat
  2. 文件头 2>nul 3>"[tab][tab] [tab][tab][tab][tab][tab][tab][tab][tab][tab][tab][tab]
  3. @(for %%a in (test) do echo test)>tmp
  4. @for /f "skip=2" %%a in (tmp) do @echo[tab][tab]
  5. echo 123
  6. pause
复制代码
在测试中的表现非常棒,能够区分关闭回显和打开回显的情况
现在唯一的心病就是对回显的判断了,如何摆脱临时文件呢?
作者: CrLf    时间: 2011-6-11 16:44

复制代码双击生成样本文件(需调用ASCMap获取特殊字符):
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. chcp 437 >nul
  4. call ASCMap $
  5. echo !$:~0xff,1!!$:~0xfe,1!  2^>nul 3^>"!$:~0x9,1!!$:~0x9,1! !$:~0x9,1!!$:~0x9,1!!$:~0x9,1!!$:~0x9,1!!$:~0x9,1!!$:~0x9,1!!$:~0x9,1!!$:~0x9,1!!$:~0x9,1!!$:~0x9,1!!$:~0x9,1!
  6. echo @(for %%%%a in (test^) do echo test^)^>tmp
  7. echo @for /f "skip=2" %%%%a in (tmp^) do @echo !$:~0x9,1!!$:~0x9,1!
  8. echo echo 123
  9. echo pause
  10. )>样本文件.bat
  11. chcp 936 >nul
  12. echo  测试
  13. echo on
  14. 样本文件.bat
  15. pause
复制代码

作者: plp626    时间: 2011-6-11 17:36

掉用ascmap是为了获取制表符,你最好说明下;
为了代码精简,制表符获取用!$:~9,1!好些;
作者: CrLf    时间: 2011-6-11 17:42

17楼代码因为代码页的原因,未能生成样本...

以下是plp修改后的版本:
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. set file=样本文件
  4. chcp 437 >nul
  5. call ASCMap $
  6. set t=!$:~9,1!
  7. (echo !$:~0xff,1!!$:~0xfe,1!  2^>nul 3^>"!t!!t! !t!!t!!t!!t!!t!!t!!t!!t!!t!!t!!t!
  8. echo @(for %%%%a in (test^) do echo test^)^>tmp
  9. echo @for /f "skip=2" %%%%a in (tmp^) do @echo !t!!t!
  10. echo echo 123
  11. echo pause
  12. )>!file!.bat
  13. chcp 936 >nul
  14. echo  测试
  15. echo on
  16. call 样本文件.bat
  17. pause
复制代码
测试成功
其中!$:~0xff,1!!$:~0xfe,1!代表fffe文件头,而!$:~9,1!为tab制表符
作者: CrLf    时间: 2011-6-11 19:10

echo;>a.txt
copy /b a.txt 要解密的文件
这样原来文件头是FF F0,解密后变成0D 0A FF F0,就不会被当成unicode格式了
zm900612 发表于 2011-3-14 23:02



现在更好的解密方法是
  1. copy nul+a.bat 解密.bat
复制代码

作者: 601997526    时间: 2011-6-11 23:27

这个讨论的有点不是太明白,不知道你们到底是在讨论些什么,但要不输出错误信息不一定要用cls呀,只要让cmd把错误信息屏蔽不就好了吗
a.bat
  1. @echo off 1>&3 2>&4 3>nul 4>nul
  2. echo 123&abc
  3. pause&call b.bat
  4. pause
复制代码
b.bat
  1. echo 123&abc
  2. pause 1>con 2>con 5>con 6>con
  3. echo 123&abc
复制代码

作者: 601997526    时间: 2011-6-13 16:30

只是理论归理论,真正要给出一段简短的代码需要N多次测试。

现在求该代码(提示下,这并不是件容易的事,要得到最简短的代码需要你一番折腾的)

(提示,对于文件头FFEF数据,大家可以借助debug命令生成 ...
plp626 发表于 2011-3-12 15:24

刚在网上找了下,这里说的利用unicode 文件头加密是不是说在文件前加很多的%%a呢
作者: Demon    时间: 2011-6-13 16:51

刚在网上找了下,这里说的利用unicode 文件头加密是不是说在文件前加很多的%%a呢
601997526 发表于 2011-6-13 16:30

不是一个东西,在文件前加很多的%%a是利用记事本的BUG,让记事本认为代码文件是以Unicode保存的

而这里说的文件头加密是指利用Unicode文件格式的BOM(Byte Order Mark),让编辑器认为代码文件是以Unicode保存的

%%a是记事本的BUG,其他文本编辑器一般没有,而加上了BOM以后所有的编辑器都会认为是Unicode,因为这是标准。




欢迎光临 批处理之家 (http://www.bathome.net/) Powered by Discuz! 7.2