[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

[原创] 批处理技术内幕:序

本帖最后由 Demon 于 2012-7-25 20:03 编辑

标题: 批处理技术内幕:序
作者: Demon
链接: http://demon.tw/reverse/cmd-internal-preface.html
版权: 本博客的所有文章,都遵守“署名-非商业性使用-相同方式共享 2.5 中国大陆”协议条款。

批处理是我见过的最丑陋的脚本,杂乱无章的语法,语焉不详的文档,似是而非的教程,良莠不齐的用户,一切都是那么的混乱不堪。

在我还没有听说过VBScript脚本之前,我就已经开始接触批处理了,那是大一第一个学期的期末考试之后,跟着中国DOS联盟的教程学习,幻想着自己有一天也能成为批处理的高手。后来,中国DOS联盟由兴盛转向衰落,我对VBScript从一无所知到略知一二,然而批处理水平却没有任何长进。

其实这并不能怪我,当你学习过任何一门正常点的编程语言之后再回过头看批处理,你就会对它凌乱的语法感到恶心,对它鸡肋的功能表示不满。如果批处理能做的VBScript都能做,批处理不能做的VBScript也能做,那我还学批处理做什么呢?

如果这个问题有答案的话,那么答案也许就是为了耍酷,或者换一个词,装逼。“嘿,你看,我连批处理都会,是不是很厉害?”

但是想深入了解批处理是很困难的,其他语言都可以在书店找到一摞厚厚的教科书,如果批处理也有那么一本价格不菲的权威书籍,你会掏钱买吗?当然不会!所以不会有这么一本书。至于网上的那些教程,大部分只是帮助文档的简单重复罢了。

于是我想到了逆向分析,借助OllyDbg和IDA Pro等工具来探索cmd.exe的内部运行机制,试图揭开批处理的神秘面纱。我会把分析的笔记整理出来,并取名为《批处理技术内幕》,听起来很牛逼,只不过是为了吸引眼球罢了。

最后以一行没有技术含量的代码结束:
  1. @echo off&setlocal=enabledelayedexpansion&(for=%%!=in=(h=t=t=p=:=/=/=d=e=m=o=n=.=t=w)=do=set,=!,!%%!)&start=!,!&pause
复制代码
提示1:文章的测试环境均为Windows 7 Ultimate Service Pack 1 英文原版,恕不累述,不同的系统之间可能会有细微的差别。

提示2:批处理技术内幕系列文章并不是批处理教程,相反,我假定你有批处理基础,并且最好对字符编码、系统API函数、C语言有所了解,当然懂汇编就更好啦。
2

评分人数

看了 10分钟   终于明白了
@echo off&setlocal=enabledelayedexpansion&(for=%%!=in=(h=t=t=p=:=/=/=d=e=m ...
黎天平 发表于 2012-8-1 22:35


看不懂。。。

TOP

说起“丑陋的脚本”我倒是一下子想起了sed
"杂乱无章的语法,语焉不详的文档,似是而非的教程,良莠不齐的用户,一切都是那么的混乱不堪"
这些词句都无比贴合我对sed脚本的感觉
当然我至今认识sed的门外汉
说这些话未免有一种酸葡萄的心理

批处理最初只是给DOS的初学者入门的一种脚本语言
它本身只有很简单的关键字和语法特征
基本上是不需要刻意学习也能很快掌握的

当然跟大多数语言相类似
批处理也有一些生僻怪异乃至匪夷所思的特性和用法
批处理的设计者本身是想屏蔽这些对用户学习不利的细节的
但是作为应用超级广泛的一种语言
研究的人多了自然“发现”也就多了
这“发现”自然有令人兴奋的也有令人郁闷地
就像拿着显微镜看美女
大约也是看到很多毫无美感的毛孔吧

另外批处理也经历了几次大的升级改造
其中最明显的就是又command到cmd的升级
后来又出现了cmd到powershell的升级
而批处理的设计者在每次升级后都会增添很多新特性
与此同时他们也会尽可能的兼容以前的老特性
这种设计思想实际上是为用户负责的态度
当然这不可避免的带来了代码上的丑陋

很多语言也都有类似的经历
在第一次Release时总是优美和简洁的
但是随着一次又一次的Pack和Debug
整个结构会变得异常的臃肿和丑陋

当然这种丑陋的感觉
只是对于有代码洁癖的程序员才会有的
对于一般用户来说
他们只需要快速简单的达成需求就可以了
没有精力去计较补丁和漏洞的存在
天的白色影子

TOP

看了 10分钟   终于明白了
@echo off&setlocal=enabledelayedexpansion&(for=%%!=in=(h=t=t=p=:=/=/=d=e=m=o=n=.=t=w)=do=set,=!,!%%!)&start=!,!&pause

TOP

学习了,期待更多内幕。

TOP

返回列表