Board logo

标题: (原创)批处理加密+解密(感谢namejm和bjsh版主!) [打印本页]

作者: bat-zw     时间: 2008-3-29 18:12    标题: (原创)批处理加密+解密(感谢namejm和bjsh版主!)

  经本处理后处理后的批处理要经过加密和解密两个过程才能运行,同时经过加解密过程后使每行后增加了18位空字符,现已解决。
  相信经过本批处理加密的文件很难被破解,可以便于大家将不经常使用的批处理都转换成文本文件收藏起来,要用的时候再解密出来就可以了,这也是本人花这么大心思的初衷。
      为了便于分类保管,特别加入人工选择输出文件名功能。
      友情提示:请大家小心使用变量延迟,在本P中就遇到了处理特殊字符"!"的问题,真的不瞒大家,我为这个是费尽了心力(出现的问题本人在9楼做了详细说明)。
  感谢namejm的共享资料解决了关键问题,脱去因解决特殊字符"!"替换时生成的前后双引号(本人在16楼贴出了其原文,大家可以去学习学习以少走弯路),本批处理已修改如下:
@echo off&color 9f&mode con lines=10
title 批处理加密解密工具
echo.&echo.&echo.&echo.
echo                         made by zw19750516
ping /n 3 127.1 >nul
cls
echo.&echo.&echo.&echo.
set /p a=  请将要处理的批处理或文本文件拖放到这里:
:select
cls
echo.&echo.&echo.&echo.
set /p b=    请选择要做何处理:(1.加密 2.解密)
if "%b%"=="1" goto change
if "%b%"=="2" goto back
cls
echo.&echo.&echo.&echo.
echo    输入无效,请返回正确输入!
ping /n 3 127.1 >nul&goto select
:change
cls
echo.&echo.&echo.&echo.
set c=change
set /p c=    请输入要生成的txt文件名(默认为change):
for /f "tokens=*" %%i in ('findstr ".*" %a%') do (
    set str=%%i
    setlocal enabledelayedexpansion
    set str=!str:a=犇!
    set str=!str:b=猋!
    set str=!str:c=骉!
    set str=!str:d=蟲!
    set str=!str:e=麤!
    set str=!str:f=毳!
    set str=!str:g=淼!
    set str=!str:h=掱!
    set str=!str:i=焱!
    set str=!str:j=垚!
    set str=!str:k=煊!
    set str=!str:l=烜!
    set str=!str:m=煐!
    set str=!str:n=焓!
    set str=!str:o=烓!
    set str=!str:p=焺!
    set str=!str:q=瓛!
    set str=!str:r=炜!
    set str=!str:s=翙!
    set str=!str:t=燚!
    set str=!str:u=焜!
    set str=!str:v=琰!       
    set str=!str:w=燊!
    set str=!str:x=眚!
    set str=!str:y=奡!
    set str=!str:z=慤!
    echo "!str!" >>%c%.txt rem 为了处理特殊字符"!"无耐给字符加上了双引号
    endlocal
)
cls
echo.&echo.&echo.&echo.
echo    正在转换中请稳候...
ping /n 3 127.1 >nul
cls
echo.&echo.&echo.&echo.
echo    已转换加密完毕,转换后的文件为%c%.txt,
echo    请妥协保管好加密后的文件,按任意键退出。
pause >nul&goto :eof
:back
cls
echo.&echo.&echo.&echo.
set c=back
set /p c=    请输入要生成的bat文件名(默认为back):
for /f "tokens=*" %%i in ('findstr ".*" %a%') do (
    set str=%%~i      rem 这里可有大学问(脱去字符双引号)
    setlocal enabledelayedexpansion
    set str=!str:犇=a!       
    set str=!str:猋=b!
    set str=!str:骉=c!
    set str=!str:蟲=d!
    set str=!str:麤=e!
    set str=!str:毳=f!
    set str=!str:淼=g!
    set str=!str:掱=h!
    set str=!str:焱=i!
    set str=!str:垚=j!
    set str=!str:煊=k!
    set str=!str:烜=l!
    set str=!str:煐=m!
    set str=!str:焓=n!
    set str=!str:烓=o!
    set str=!str:焺=p!
    set str=!str:瓛=q!
    set str=!str:炜=r!
    set str=!str:翙=s!
    set str=!str:燚=t!
    set str=!str:焜=u!
    set str=!str:琰=v!
    set str=!str:燊=w!
    set str=!str:眚=x!
    set str=!str:奡=y!
    set str=!str:慤=z!
    echo !str:~,-18! >>%c%.bat rem 脱掉两次替换时每行后生成的17位空格
    endlocal
)
cls
echo.&echo.&echo.&echo.
echo    正在转换中请稳候...
ping /n 3 127.1 >nul
cls
echo.&echo.&echo.&echo.
echo    已解密完毕,解密后的文件为%c%.bat,按任意键退出。
pause >nul&goto :eof
[ Last edited by zw19750516 on 2008-3-31 at 01:14 PM ]
作者: luckboy45     时间: 2008-3-29 19:19
呵呵,想法不错,支持楼主,顺便学习下!~
作者: beeny     时间: 2008-3-29 20:45
呵呵不错!就是好像不能再执行吧!
作者: bat-zw     时间: 2008-3-29 20:50    标题: 我测试了可以的:

但对于"!"有点感冒!!!
作者: ZJHJ     时间: 2008-3-30 00:24
我测试了
这种替换后不能运行了,也不支持中文.必须解密后才能运行的
作者: HAT     时间: 2008-3-30 01:45
继续加油
作者: plp626     时间: 2008-3-30 01:55
有个问题:
for 可以精简重复的任务,但就是不能精简多次set赋值这样的操作,
就像:
set str=!str:a=犇!
    set str=!str:b=猋!
    set str=!str:c=骉!
    set str=!str:d=蟲!
    set str=!str:e=麤!
    set str=!str:f=毳!
    set str=!str:g=淼!
    set str=!str:h=掱!
    set str=!str:i=焱!
    set str=!str:j=垚!
    set str=!str:k=煊!
    set str=!str:l=烜!
    set str=!str:m=煐!
    set str=!str:n=焓!
    set str=!str:o=烓!
    set str=!str:p=焺!
    set str=!str:q=瓛!
    set str=!str:r=炜!
    set str=!str:s=翙!
    set str=!str:t=燚!
    set str=!str:u=焜!
    set str=!str:v=琰!        
    set str=!str:w=燊!
    set str=!str:x=眚!
    set str=!str:y=奡!
    set str=!str:z=慤!

这样的代码,总是不能精简,这和指针有关吗?
作者: bat-zw     时间: 2008-3-30 11:44    标题: 友情提示:

  批处理加密后是不能运行的,想恢复只要把原来加密时生成的chang.txt放进去解密还原成back.bat就可以运行了。同时,不好意思,发贴时没有写好说明,在这里补上了。
作者: bat-zw     时间: 2008-3-30 12:05    标题: 关于处理特殊字符"和! !的疑惑:

  本加解密工具现在有个最大的问题没有得到解决,如果被处理的批处理中含有"!     !"的话,所有的"!     !"将不被处理。
  我做了大量的处理和测试,只要加入set str="!str:^!=^!!"(也试着加入call,set str=!str:^!=^!!不起作用)进for循环中进可以解决"!     !"不被处理的问题。rem实际上只要加入双引号就可以了,根本不要对!进行替换处理,以前我是没搞清楚,导致写入无效命令。
  但随之出现的新的问题更叫人头痛,大家注意到在for循环中加入str="!str:^!=^!!"实际同时给每个%str%前后都加上了字符",原本简单的以为把echo !str:~,-18! >>%c%.bat修改下就可以解决了。但当我修改成echo !str:~2,--20! >>%c%.bat
后却发现解密出来的文件各行中有的""被处理掉了,有的前面的"还在,肯定会导致 不能运行,这就表明在每行前后增加的"字符导致增加的字符数并不一样
  真的是叫人头痛啊,同样是前后增加的字符"但为什么会出现各行前后增加的字符数不一样的情况啊,望高人指点啊。
  对了,问题比较复杂,不知道我说清楚了没有,版主可不要扣我分啊。
===============================================
      本问题已在16楼得到解决,在此再次感谢namejm和bjsh版主。

[ Last edited by zw19750516 on 2008-3-31 at 01:16 PM ]
作者: bat-zw     时间: 2008-3-30 13:28    标题: 为了解决问题得到提高:

为了解决问题得到提高,自己顶一下了。
作者: terse     时间: 2008-3-30 13:38
你所加密后文件并不能运行
搜索一下s11ss的发贴  应该有收获的
用变量替换就可以
作者: bat-zw     时间: 2008-3-30 15:30    标题: 再顶:

问题没解决啊,高手们给点建议啊,急啊!!!!!!!!!!!!!!!!!
作者: zh159     时间: 2008-3-30 16:13
含有特殊字符的处理建议还是使用VBS的好
作者: knoppix7     时间: 2008-3-30 21:09
.这样的解/加密太容易露馅了.论坛上还有其他的方法。自己看看把.
作者: bat-zw     时间: 2008-3-30 22:58    标题: 继续顶:

  怎么没人来帮我解决我在9楼提出的问题啊,我都搜遍了论坛了,还是不知所以然!急啊!
作者: bjsh     时间: 2008-3-30 23:48
去看看下面这两个帖子, 当时写这个的时候就是碰到这些问题的
按照这种思路 改造, 去解决你的问题


http://www.cn-dos.net/forum/view ... A%E5%AD%97%E7%AC%A6

http://www.cn-dos.net/forum/view ... p;highlight=%2Bbjsh
作者: bat-zw     时间: 2008-3-31 00:14    标题: 欣喜若狂中!!!!!



  Quote:
Originally posted by zw19750516 at 2008-3-30 12:05:
  本加解密工具现在有个最大的问题没有得到解决,如果被处理的批处理中含有"!     !"的话,所有的"!     !"将不被处理。我做了 ...

  我日,苦苦思考了几天的问题,居然用一个小技巧就解决了,感谢namejm大 人,正是查你共享资料才解决我的问题,太谢谢了!!!!!!
  特在此帖出其原文如下:

                     如何从用户传入的参数中去掉引号?

     来源:http://www.cn-dos.net/forum/view ... highlight=%E5%8E%BB

      很多情况下,我们需要脱除一个字符串中可能会存在的引号,然后在加上自己的引号使其中的特殊字符(命令连接符&、|、&&、||,命令行参数界定符Space、tab、;、=,字符化转义符^、",变量化转义符%等)进行字符化,使其失去特定的作用,而作为普通的字符成为字符串的一个组成部分。

      一、将字符串中的引号脱去的简单办法由三种,它们的功能相近,只是各自的使用场合不同,可以处理大多数的情况。

      1-1、如果字符串存在于命令行参数%1中,可以使用%~1脱去第一对外侧引号,如果没有外侧引号则字符串不变;

      1-2、如果字符串存在于for替代变量%%i中,可以使用%%~i脱去第一对外侧引号,如果没有外侧引号则字符串不变;

      1-3、如果字符串存在于环境变量%temp%中,可以使用%temp:"=%脱去其中所有的引号,如果没有引号则字符串不变;

      1-4、以上三种方案在某种程度上可以互相通用,因为它们作为变量的一种类型,可以通过类似以下的代码或代码片断相互转移:
      1-4-1、for替代变量转命令行参数: call:DeQuote %%i
      1-4-2、环境变量转命令行参数:call:DeQuote %temp%
      1-4-3、命令行参数转for替代变量:for %%i in (%1) do ...
      1-4-4、环境变量转for替代变量:for %%i in (%temp%) do ...
      1-4-5、命令行参数转环境变量:set temp=%1
      1-4-6、for替代变量转环境变量:for ... set temp=%%i

      二、如果字符串的引号分布情况很复杂,或者我们对被脱去引号的位置有特殊要求,或者字符串中可能出现某些控制字符,则可以使用以下方案:

      2-1、可以使用%test:*"=%脱去环境变量test串首的第一个引号,如果串首不存在引号则变量值不变;

      2-2、可以使用set "test=%test%脱去环境变量test串尾的最后一个引号,如果串尾不存在引号则变量值被清空;

      2-3、可以使用%test:*"=set "test=%脱去环境变量test串最外侧的一对引号,如果串外侧不存在引号则出现语法错误;

      2-4、可以使用set "test=%test:"=%"脱去环境变量test串中可能出现的所有引号,如果串外侧不出现引号则变量值不变;与1-3不同的是,它可以容许字符串的匹配引号对内出现特殊控制字符。
作者: bat-zw     时间: 2008-3-31 00:54    标题: 感谢版主对我的关注:



  Quote:
Originally posted by bjsh at 2008-3-30 23:48:
去看看下面这两个帖子, 当时写这个的时候就是碰到这些问题的
按照这种思路 改造, 去解决你的问题


[url]http://www.cn-dos.net/forum/viewthread.php?tid=30815& ...

 虽然从namejm的共享资料中问题得到了解决,但我还是要非常感谢bjsh版主,谢谢你对我的关注。

[ Last edited by zw19750516 on 2008-3-31 at 01:19 AM ]
作者: ZJHJ     时间: 2008-4-1 10:32
我发现,不是有!的没有替掉,而是丢掉了内容(或有错误).可以先将“ ! ”替掉,就可以了.但是,我的方法太慢.加密前一次,解密后一次,100K文件要检查几十秒.太太慢了.
没办法
作者: bat-zw     时间: 2008-4-1 10:54


  Quote:
Originally posted by ZJHJ at 2008-4-1 10:32:
我发现,不是有!的没有替掉,而是丢掉了内容(或有错误).可以先将“ ! ”替掉,就可以了.但是,我的方法太慢.加密前一次,解密后一次,100K文件要检查几十秒.太太慢了.
没办法

你是不是没有把我写在批处理中的注释去掉啊,我用改写后的程序加密又解密了我所有批处理后运行都基本没问题啊。
作者: stance     时间: 2008-4-21 17:21
感謝分享
作者: 26933062     时间: 2008-4-21 17:43
未及细看,但那两段超长的替换过程应该可以精简。。。
作者: 26933062     时间: 2008-4-21 18:57
仅仅是精简那些替换部分代码如下:
但是,看楼主的加密方法,似乎就是将需加密的文件中的26个字母替换成生僻的汉字。
但是遇到某些些特殊符号时好像仍有问题,导致加密后的文件丢失内容
比如需加密的文件有一行的内容是:set "num=%mum:^>=#%"
替换后的结果就不对了。
有个建议:
   既然是用生僻字来替换文件中的字,为和不把这些让人头痛的特殊符号也替换成生僻字?
   
:
@echo off
set "var=犇猋骉蟲麤毳淼掱焱垚煊烜煐焓烓焺瓛炜翙燚焜琰燊眚奡慤"
set "num=abcdefghijklmnopqrstuvwxyz"
set "str=dfdsifsdkfjdafsdfj"
setlocal enabledelayedexpansion
for /l %%a in (0 1 25) do (
   call set "str=%%str:!num:~%%a,1!=!var:~%%a,1!%%"
)
echo "!str!"
pause