Term : freexploit
Author : allyesno
Date : 2005-????
1.set 每环境变量最大可容纳8179个字节
2.合法的if代码块
if 1==1 (
echo 1
echo 2
)
3.mission impossible 1
自定义字符实现隐式环境变量,呵呵这个是bat编程里面的mission impossible,看起来是不可以实现的实际上要实现这个功能得构架一个虚拟的环境,把自定义字符在bat内部实现运行,并直接输出结果,这样就实现了这个功能
4.构建一个虚拟环境的意义,可以将许多语句以C++的形式体现出来,广义上来讲,可以将许多语句以任意形式体现出来:perl、C++、js、vbs(这个倒是没什么意义)、shell甚至你自己的语言,bat的函数库,嘎嘎感觉良好
5.mission impossible 2
返回自定义的调用位置,这也是一个mission impossible,要实现这个功能,只可以使用变量代替table并在确定前一个变量的时候将下一个变量确定为返回位置,巧妙的利用了table之间的位置,bat编程里面还有多少mission impossible?值得关注一下:)
6.位运算
bat里面可以进行位运算(暂时还不知道这个用途有什么意义,要是能支持直接对内存操作那就。。。)
例子:
按位与set /a 1^&1
按位异set/a 1^^1
按位或set/a 1^|0
举个实用的例子判断被除数是否为0
set/a bool=1^&0
if %bool%==0 echo 被除数为0
7.else的陷阱 【注这个分析是错误的,改正时间2006-06-07】【参看20】
这个不止是bat会遇到。else代码块其实是无条件执行的,所以当你要使用else对前一个条件做判断的时候
不要想当然的以为它会自动判断,还是要把if或者相等的语句再次嵌入else代码块里面,下面举例
if 1==1 echo 1 (
echo 1
) else (
echo 1!=1
)
区别
if 1==1 echo 1 (
echo 1
) else (
if not 1==1 echo 1!=1
)
8.bat的执行顺序
按照文本方式,从左到右,从上到下
例子
@echo off
goto goto
echo no echo
:goto
goto goto
:goto
:end
9.table标签陷阱,如果用标量去定义一个标签,只能将其在命令行显示,而无法改变它在文本内的形式
简单来说,bat文本内的代码都是常量,无法改变
10.变量扩展法则:
%PATH:~10,5%
会扩展 PATH 环境变量,然后只使用在扩展结果中从第 11 个(偏
移量 10)字符开始的五个字符。如果没有指定长度,则采用默认
值,即变量数值的余数。如果两个数字(偏移量和长度)都是负数,
使用的数字则是环境变量数值长度加上指定的偏移量或长度。
%PATH:~-10%
会提取 PATH 变量的最后十个字符。
%PATH:~0,-2%
会提取 PATH 变量的所有字符,除了最后两个。
11.set 必须转义的四个字符
set string=^^
set string=^|
set string=^<
set string=^>
12.慎用>nul
>nul会把 errorlevel 变量设置为1 造成变量可能被修改的后果
例如:echo 1234|findstr "1234">nul
如果按照 echo 1234|findstr 的方式 errorlevel 应为0
而加上>nul 以后 errorlevel 则为1
13.四个bat注释符号
rem
::
^ (没有公布)
00(hex) (系统漏洞)
14.for 语句的关于:字符的使用
for循环内不能使用::作为注释符,所以必须使用rem和^代替
当for为无限循环的时候在for语句内不能使用: 标签进行goto跳转
当其为有限循环的时候,执行任意的跳转都会跳出for循环体,相当于exit for
15.cmd /v: on 延迟变量以及变量扩展法则精彩演示
@echo off
::// 功能:检测字符串长度 cmd /v:on 超强功能演示
::// Checkstring 1.1 build by allyesno
cls
::// check cmd /v:on or :off
::// 先考虑cmd_v_on 没有开启的情况
if not "!cmd_v_on_exist!"=="%cmd_v_on_exist%" (
set cmd_v_on_exist=1
cmd /v:on /c %0
)
::/* 再考虑cmd_v_on 开启的情况 */
if "!cmd_v_on_exist!"=="%cmd_v_on_exist%" (
goto program_start
)
::/* 然后再考虑第一次指令执行完,接着再次执行的情况 */
if "%cmd_v_on_exist%"=="1" (
set cmd_v_on_exist=0
goto eof
)
:program_start
echo 请输入字符串
set string=
set/p string=
if "%string%"=="" goto end
for /l %%i in (1,1,26) do (
echo 循环第一圈: !string:~,%%i!
echo 读取 %%i 个字母
set /a add=%%i+1
for /l %%j in (!add!,1,!add!) do (
echo 循环第二圈: !string:~,%%j!
echo 读取 %%j 个字母
echo.
)
)
:end
if "%string%"=="" (
echo 功能:检测字符串长度
echo usage : checklen anyword
echo e.g : checklen abcdefghijk01234567!@#$%^&*
)
:eof
16.慎用数字作为批处理变量
set 1=1
if "%1%"=="1" echo 1
运行的结果 并不会显示1 因为变量中的 %1% 被解读为 %1
17.cmd /v:on 扩展中 变量值为!时的使用错误
当 cmd /v:on 扩展中 变量值为!时 无法正常使用 下面给出一个检验密码的例子
@echo off
cls
echo 请把你获取的加密字串输入复制进来(提取加密字串的方法请看文章)
echo 不按照我文章所说的步骤做,一切后果你们自己负责!!!!
echo.
::/* 字符串状态初始化 */
set string=
set stringend=0
set stringlen=
set/p string=
if "!string!"=="" (
echo "%string%"
goto end
)
::/* 破解数据初始化 */
set password=破解出来的密码是:
rem 需要在cmd /v:on 扩展开始前把输出初始化
rem set encryptdata=abcdef!h
rem set decryptdata=12345678
echo encyy:!encryptdata!
::/* 枚举密码 */
echo 枚举密码开始
:enumeratestringpass
for /l %%k in (0,1,7) do (
for /l %%l in (0,1,7) do (
if "!string:~%%k,1!"=="!encryptdata:~%%l,1!" (
set password=!password!!decryptdata:~%%l,1!
echo !password!
)
)
)
:end
18.列出所有文件夹的大小
http://www.patching.net/zhaohuan/blogview.asp?logID=45
cmd下
for /f "delims=/" %i in ('dir /b/s *.*') do dir /b/s *.txt | find "%i" || del "%i"
需保留下数种类型?
例:保留txt rar
for /f "delims=/" %i in ('dir /b/s *.*') do dir /b/s *.txt *.rar| find "%i" || del "%i"
20.合法的if else语句
@set/p n=姓名:
@if "%n%"=="nop" (echo 人品太好,所有漂亮MM都喜欢他)else (echo 人品太差,试试输入nop)
21.数字对称服务
cls
set n=-1
for %%i in (a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z) do (
set/a n+=1
for /f %%j in ('set /a n+=1') do echo 正在禁止 %%j %%i 服务
)
22.百个目录容易建
title http: // blog.csdn.net / freexploit / 百个目录容易建 BY ALLyeSNO
rem ==========================================================
rem 输入框架
cls
echo 百个目录容易建
set n = 0
:site
echo.
set / p n = 请输入你要建立目录的数量:
if %n% leq 0 (
cls
echo.
echo 你输入的目录数量必须为大于或者等于1的整数!
goto site
)
echo.
echo 你要建立目录的数量为:%n%
echo.
rem ==========================================================
rem 选择框架
if %n% gtr 999 (
echo 你要建立的目录数量大于999个,请自己修改源程序
goto end
)
if %n% geq 100 goto geq999
if %n% geq 10 goto geq99
rem ==========================================================
rem 9目录框架
for / l %%i in (%n%, - 1 , 1 ) do (
md 00 %%i
echo 建立目录 00 %%i
)
echo.
echo 建立%n%个目录完毕!
goto end
rem ==========================================================
rem 999目录框架
:geq999
for / l %%i in (%n%, - 1 , 100 ) do (
md %%i
echo 建立目录 %%i
)
for / l %%i in ( 99 , - 1 , 10 ) do (
md 0 %%i
echo 建立目录 0 %%i
)
for / l %%i in ( 9 , - 1 , 1 ) do (
md 00 %%i
echo 建立目录 00 %%i
)
echo.
echo 建立%n%个目录完毕!
goto end
rem ==========================================================
rem 99目录框架
:geq99
for / l %%i in (%n%, - 1 , 10 ) do (
md 0 %%i
echo 建立目录 0 %%i
)
for / l %%i in ( 9 , - 1 , 1 ) do (
md 00 %%i
echo 建立目录 00 %%i
)
echo 建立%n%个目录完毕!
: end
echo.
echo 请按任意键返回windows
pause > nul
exit > nul
23. 删除一个目录下所有指定子目录的某种类型文件
比如我要删除QQ下面的 所有图片文件
24.让批处理被wsh解析
作者 : est
原文 : http://dormforce.net/Blog/electronixtar/archive/2006/12/01/11901.aspx
原文 : http://www.ph4nt0m.org/bbs/showthread.php?s=&postid=84852#post84852
想了很久,发现了一种不用临时文件,在批处理中直接执行 vbs 的方法
示例批处理:test.bat
Code:
|
上面的代码巧妙利用 bat 和 vbs 的语法特征,让同一个文件,被 cmd.exe 识别成批处理,让 wscrpt.exe 识别成 vbs,并且同时符合两者的语法,并且保证都没有错误,保证两者的高度兼容。就叫它 bat/vbs 复合编程吧 (Hybird Programming)
粗略解释下代码
引用:
:On Error Resume Next |
cmd.exe 识别成一段注释
wscript.exe 这样识别, : 在vbs语法里代表分行,然后 On Error Resume Next,也就是让WSH忽略一些错误
引用:
start wscript -e:vbs "%~f0" |
cmd.exe 识别成:启动 wscript.exe ,其参数是:
① -e:vbs 设定以vbs解析文件自身
② "%~f0" 指这个批处理本身。
wscript.exe 把这句识别成:调用一个叫 start 的函数,函数参数是 wscript 这个变量,然后用这个函数的结果来 减去 e。接下来是又是一个 : ,分行,然后又是调用一个名叫 vbs 的函数,参数是字符: "%~f0"
这句是最为精巧的,因为它成功的让 vbs 引擎解释了一段批处理,而且没有错误!当然这些 start()、vbs()函数是不存在的,但是会被 cmd.exe 当成命令执行。为什么不用 wscript //e:vbs "%~f0" 来执行呢?vbs解析会出错的,呵呵
这段代码的核心思想已经介绍完毕了。下面,为了让 批处理 以vbs调用其自身后,马上退出,我们需要 exit 或者 goto :eof,但是 goto call exit 在vbs又是一个关键词,所以我们只能用符合 vbs 语法的 exit sub,所以我们在第二句加一个
sub bat,其实 cmd.exe 寻找了一个叫 sub.exe 的命令,但是这个命令是不存在的,cmd.exe 跳过。然后在 6、7 句加一个 exit sub 以及 end sub,让 批处理结束,同时又符合 vbs 的语法
那个 echo off & cls ,批处理的意思就是相当于 @echo off ,但是 vbs 不认 @ 符号,所以改成 echo off & cls , vbs 可以解析为,调用一个叫 echo() 的函数,参数为 off & cls ,也就是两个字符串 off 和 cls 相加
Well,接下来,你可以自由地在批处理中书写vbs脚本了,效率和真正的vbs一样高!
这段代码的好处是:不用生成临时文件。其实用 echo 或者 more 或者 find 来生成临时vbs很浪费系统资源的,用我写的这段代码,就完全免去了这些麻烦。直接混合编程,以 start wscript -e:vbs "%~f0" 为界限,上面写 批处理,下面写 vbs,并行不悖!
大家有更好的想法可以跟贴讨论呀
=============================================================
allyesno :%~fI - 将 %I 扩充到一个完全合格的路径名
另外如果用到shell中的话 写vbs也要用到echo的 在这种情况没有省系统资源的说法 除非 copy con 就可以写 那就直接写任意脚本文件就行了
其他的情况是有的
这个方法不错 可以方便调用两种脚本语言
25.XP SP2 CMD 命令地址
00032b70h