中国DOS联盟论坛

中国DOS联盟

-- 联合DOS 推动DOS 发展DOS --

联盟域名:www.cn-dos.net  论坛域名:www.cn-dos.net/forum
DOS,代表着自由开放与发展,我们努力起来,学习FreeDOS和Linux的自由开放与GNU精神,共同创造和发展美好的自由与GNU GPL世界吧!

游客:  注册 | 登录 | 命令行 | 会员 | 搜索 | 上传 | 帮助 »
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » [原创--分享]---------- Bat2Com 成功密技教程 --------
作者:
标题: [原创--分享]---------- Bat2Com 成功密技教程 -------- 上一主题 | 下一主题
goli2008
中级用户





积分 252
发帖 97
注册 2006-9-17
状态 离线
『楼 主』:  [原创--分享]---------- Bat2Com 成功密技教程 --------

Bat2Com 成功密技教程
先说题外话,不喜或不同观点者勿怪:

1、说的是DOS,CMD可以不用看
2、在CN-DOS论坛上找到一个有关BAT加密的高楼大厦,一口气从1楼爬到350楼,试验一下,结果是:
   大失所望,这些所谓的加密可说是自欺欺人,最简单的破解方法是先用RAR压缩,再用RAR查看,加密一目了然,所以奉劝各位,别再在BAT加密上浪费时间和精力了。
3、非要bat加密,只有bat2com。有人说了,bat2com将bat转换为COM或EXE的成功率很低,的确如此,我以前试过好几回,很少有成功的,那我还来这说什么?
   稍别勿噪,我可以负责任的告诉你,bat2com真的很好很实用。


言归正传

一、转换不成功的原因分析
   1、毫无疑问,bat2com肯定不是万能的,有一定的局限性,也有几个BUG,这是转换不成功的原因之一
   2、你可能不太了解bat2com的处理规范,或你的BAT程序没有按bat2com的规范来编写,或者超出了bat2com的处理能力范围,这是转换不成功的最主要原因。
     bat2com转换不成功的道理,与大多数CMD在dos下运行不成功的道理是一样的,只要你按dos规范来写CMD,那CMD就可以在dos下成功运行,废话:))

问题关键:是等bat2com的作者来修改、升级他的程序以适应你的BAT,还是修改你的BAT,让你的BAT适应bat2com的要求,成功还是失败,这是个问题。


二、bat2com的转换规范(以目前我手上的bat2com V1.5为例)
    bat2com是按照bat的规范来处理的,对bat有很好的支持:
    1、直接支持dos内部命令、外部命令,能带参数
    2、直接支持IF、goto命令,支持GOTO的标号
    3、忽略REM注解行
    4、for命令是唯一的,直接以BAT方式执行。
    5、每一行只执行唯一的一个命令,每个命令必须在一行中完成,即基本不支持|与>命令。
    1-4 条与一般的bat要求是一致的,唯有第五条,是与常规bat的重大区别!!


三、基本要求,首先注意两点:
   1、goto标号(:开头)不能重复,这比bat的要求严格。
   2、保证你的BAT能在dos中以bat方式正确执行,这是前提条件,别以为这是废话。
   

四、解读bat2com与BAT的重要区别
  
  (一)、最主要的一条:每一行只执行唯一的一个命令,每个命令必须在一行中完成,即基本不支持|与>命令    1、每行只能执行一个命令,就是说不允许有"|"( 管道),
    2、除了echo 或者 dir之外,其他情况不允许再有转向命令(>,>>)
       如:type a.txt | find "abc"                     -->非法(不能有|)
       再如:find "abc' a.txt >b.txt                  --->非法(不能有>)
       再再如:外部命令dspt.exe 0 /l >d.txt           --->非法(不能有>)
       再再再如: for %%i in (%a%) do echo %%i >>c.txt  ->非法(不能有>,>>)
       再再再再如:if %a%==1 if %b%==2 set c=3         -->非法(不能连续执行)
   
      我敢打赌,所谓BAT2com成功率低,绝大数的bat就因为这一条!
      如果你的BAT中已经没有了上述类似文本,我相信,你的bat2com已经成功了90%。
      怎么样,有点眉目了吧,别急,还没完呢
   
  (二)call 命令不会返回参数
      举例如下:
           set a=123
           call b.bat  ------>b.bat中的命令为:set a=abc
           echo %a%
       对于bat方式,执行上述命令后,echo 的结果是:abc
       这是我们最常用的bat命令调用,也就是说,bat传送变量。

       但是,对于bat2com,它执行的结果是:123  ------》 没错,还是123 !!
       真的没错,这不是Bat2com的Bug,也不是bat的bug,这是标准的com、exe执行方式,
       其实,这个应该很好理解,这与一个exe程序不能直接向另一个exe程序传递参数一样。
       例如,如果你的bat中用到wbat.com,其中有个w.bat,若bat2com后,w.bat所传递的参数将无效。

        如果你知道什么是全局变量、局部变量,那你该一点就通,如果还不了解,可以看看有关方面的书,也可做以下试验:
        执行以下命令,你就会明白:
            set a=123
            echo %a%         ------->结果是:123,没错
            command /k
            set a=abc
            echo %a%         ------->显示:abc,也没错
            exit
            echo %a%         -------》结果是什么,是123或是abc? 自己做吧
       就是全局变量与局部变量的简单显示,当然,如果你的bat根本就没有call命令,那你是不会在意的。
     
   (三)极个别第三方软件bat2com后,运行不正常,人无完人,别太苛求,试验后确定吧,实在不行就Call。



五、bat2com有两个严重的bug,必须避开它
    1、变量名,如bat中有:
        set a=1
        set ab=2
        set abc=3
      这三条命令在bat中执行正确,但BAT2com中会认为是一样的,会出错,这是一个BUG,只要避开它就可了:即变量名不要有完全重合。
   
    2、echo set a=c:>a.txt
       echo dir %%a%%>>a.txt
     这两条命令在bat中执行正确,但在bat2com中会在"c:"及%a%后面多出几个空格,
     set a=c:变成了set a=c:      ,会出现错误,这也是一个BUG,普通的文本输出没有问题,如有必要,也要避开它。


六、解决的办法推荐
    如果你按照上述要求重新修改你的BAT程序,bat2com成功,将近在眼前!
    1、通过call 调用子程序BAT,执行|或>命令
    你肯定会说,我的程序一定要有如:type a.txt | find "abc" 或 dspt.exe 0 /l >d.txt 或echo set a=c:>a.txt
    很简单啊,将它做子程序bat,通过call调用,记住,子程序不能再bat2com!
    2、子程序的参数不能通过set命令传递给bat2com,可能过文件方式,如
        echo %你的参数% >a.txt
      然后再在主程序读取a.txt的内容作为参数即可,这也是exe文件之间传递参数的标准方式。

七、隆重推荐:strings.com
    有关trings.com的下载及介绍,论坛上很多,请自行搜索。

    我只想说,strings是dos-bat的最佳搭档,有了strings,几乎可以完成bat所想完成的任何操作,如果没有strings,我肯定不会写这编文章的。
    如echo echo 123>b.txt >a.bat,或echo type a.txt | find "abc" >a.bat
    想在bat成功执行上述,得到正确的a.bat,是很难的(通过prompt变通,可以,但比较复杂),在bat2com中是绝对不可能的,但是,strings却能轻易做到!

   strings的write命令,可以完善代替echo,而且对于>|等echo不认的符号,解决的非常好,如:
   strings write a.bat,strings vhao=char 62    --》 set vhao=>
   strings write a.bat, echo 123%%vhao%%b.txt  --》 echo echo 123>b.txt >a.bat
   其中Vhao为>,可以任意定义为|等,运行a.bat即可得b.txt
   
   处理call返回的参数,变量运算、分析处理等等,strings都能轻松做到。
   strings功能还很多,所以我推荐。


八、补充:
    1、建议在dos环境中进行bat2com
    2、任何bat2com之前,必须确保bat文件能正确运行
    3、com文件不得大于64KB!
    4、bat2com能正确执行后,再执行com2exe,将文件转换为exe。


九、附言:
    为了数据安全,我一直想找个bat加密或2com的方法,如前所述,几经失望,后来想自己弄个for dos程序,但有近1n年没玩c++了,头痛,后来找到bat2com的原程序,仔细一看,正中下怀,逐步明白以前转换不成功的原因所在,经过n次测试,终于成功bat2com。
    如果bat2com的作者能看到此文,最好能修正BUG、升级bat2com,或者等我哪天有空了,重操C++,邦他完善一下。

    衷心感谢bat2com的作者(不能确定是否董占山)、strings的作者、strings帮助中文翻译(cn-dos的insert)、以及中国DOS联盟的热心的DOS高手!


   
好了,这是本人经过N次测试得出的经验,难免错漏之处,欢迎补充、完善、指正。

           欢迎交流,歌理 QQ107660899      2008.12.02

附件是:bat2com\com2exe\stringsSample Text

[ Last edited by goli2008 on 2008-12-2 at 11:10 ]

   此帖被 +33 点积分      点击查看详情   
评分人:【 s11ss 分数: +7  时间:2008-12-2 11:30
评分人:【 HAT 分数: +8  时间:2008-12-2 13:23
评分人:【 tireless 分数: +7  时间:2008-12-2 14:03
评分人:【 wxcute 分数: +4  时间:2008-12-2 19:09
评分人:【 radem 分数: +4  时间:2008-12-2 22:41
评分人:【 yishanju 分数: +3  时间:2008-12-3 11:50


附件 1: b2c.rar (2008-12-2 11:07, 21.68 K,下载次数: 210)
2008-12-2 11:07
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
s11ss
银牌会员





积分 2098
发帖 566
注册 2007-9-11
状态 离线
『第 2 楼』:  

辛苦。

限制太多

2008-12-2 11:30
查看资料  发短消息 网志   编辑帖子  回复  引用回复
HAT
版主





积分 9023
发帖 5017
注册 2007-5-31
状态 离线
『第 3 楼』:  

感谢分享,楼主的钻研精神值得我们学习。



2008-12-2 13:23
查看资料  发短消息 网志   编辑帖子  回复  引用回复
wxcute
中级用户





积分 458
发帖 211
注册 2006-7-26
状态 离线
『第 4 楼』:  

多谢分享,向你学习。



┌───────┐
├→学习→实践→┤
└───────┘
2008-12-2 19:11
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
lianjiang2004
金牌会员





积分 3946
发帖 1884
注册 2006-1-20
状态 离线
『第 5 楼』:  

支持lz。
不支持errorlevel,一些场合会受限。



Windows 一键还原
http://www.yjhy.com
2008-12-2 19:36
查看资料  发短消息 网志   编辑帖子  回复  引用回复
radem
高级用户

CMD感染者


积分 691
发帖 383
注册 2008-5-23
状态 离线
『第 6 楼』:  

楼主辛苦了
精神可嘉
真乃我学习之榜样



2008-12-2 22:40
查看资料  发短消息 网志   编辑帖子  回复  引用回复
goli2008
中级用户





积分 252
发帖 97
注册 2006-9-17
状态 离线
『第 7 楼』:  



  Quote:
Originally posted by lianjiang2004 at 2008-12-2 19:36:
支持lz。
不支持errorlevel,一些场合会受限。

不对,errorlevel 支持的很好,我的程序中就有很多这样的,因我用wbat

2008-12-3 08:58
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
lianjiang2004
金牌会员





积分 3946
发帖 1884
注册 2006-1-20
状态 离线
『第 8 楼』:  



  Quote:
Originally posted by goli2008 at 2008-12-3 08:58:


不对,errorlevel 支持的很好,我的程序中就有很多这样的,因我用wbat

只在很久前试过,估计是把bat2exe与bat2com搞混了,呵呵。



Windows 一键还原
http://www.yjhy.com
2008-12-4 11:42
查看资料  发短消息 网志   编辑帖子  回复  引用回复
qzwqzw
银牌会员

天的白色影子


积分 2342
发帖 635
注册 2004-3-6
状态 离线
『第 9 楼』:  

这年头
还有玩bat2com的
也算一件稀罕事

如楼上几位所说
bat2com/bat2exe/bat2exec类编译软件限制太多
恐怕只能适用一些简单的代码
稍微复杂一些的代码想要绕过限制很难
而简单的代码通常没有编译的必要

当然想楼主提到的
结合wbat、strings等工具实现复杂界面和功能也算一种途径
这就是萝卜白菜的问题了

顺带说一句
要说第三方工具
strings 算不上最好的
只能说是比较流行的

[ Last edited by qzwqzw on 2008-12-5 at 10:14 ]

2008-12-5 10:13
查看资料  发短消息 网志   编辑帖子  回复  引用回复
bigtop
新手上路





积分 3
发帖 2
注册 2008-12-15
状态 离线
『第 10 楼』:  

2、在CN-DOS论坛上找到一个有关BAT加密的高楼大厦,一口气从1楼爬到350楼,试验一下,结果是:
   大失所望,这些所谓的加密可说是自欺欺人,最简单的破解方法是先用RAR压缩,再用RAR查看,加密一目了然,所以奉劝各位,别再在BAT加密上浪费时间和精力了。

不用压缩,直接用RAR切换到目录下,点查看就可以了.

2009-2-23 01:38
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
HAT
版主





积分 9023
发帖 5017
注册 2007-5-31
状态 离线
『第 11 楼』:  Re 10楼

楼主说的并非加密,而是BAT转EXE或者BAT转COM



2009-2-23 11:03
查看资料  发短消息 网志   编辑帖子  回复  引用回复
yinxinlmk
新手上路





积分 1
发帖 1
注册 2009-1-22
状态 离线
『第 12 楼』:  

谢谢楼主分享,学习学习了

2009-2-23 21:16
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
wcr100
初级用户





积分 27
发帖 13
注册 2008-9-14
状态 离线
『第 13 楼』:  

支持下

2010-6-29 19:01
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复

请注意:您目前尚未注册或登录,请您注册登录以使用论坛的各项功能,例如发表和回复帖子等。


可打印版本 | 推荐给朋友 | 订阅主题 | 收藏主题



论坛跳转: