本帖最后由 qzwqzw 于 2011-4-29 16:30 编辑
说下,和shell32.dll没关系,明显是cmd的事情。。。
slore 发表于 2011-3-25 17:32 
呵呵
这可真是公说公有理婆说婆有理了
cmd怪shell32不把&用引号包裹住再交过来
shell32怪cmd自己不把赤裸的&管教好
一嘴烂账没法说清
不过又回头多想了一下
这个问题仍有探索的余地
余地就在%cmdcmdline%
那里包裹了更多的信息
想办法处理了一下
因为以前很少关注转义字符的处理
费了许多功夫才大致完成
最终的结果是给定的12个特殊文件处理了11个
唯一剩下的一个(abc)&(xyz).cmd
没什么好办法
因为它直接导致批处理无法启动- :: 测试多个怪僻文件名直接拖拽到批处理文件上,批处理是否正确处理这些文件名
- @echo off
- rem pause
- if not [%1]==[] goto :start
- echo 正在生成测试文件
- echo.>abc.cmd
- echo.>"abc xyz.cmd"
- echo.>"abc^xyz.cmd"
- echo.>"abc&xyz.cmd"
- echo.>"abc & xyz.cmd"
- echo.>"(abc)(xyz).cmd"
- echo.>"(abc) (xyz).cmd"
- rem echo.>"(abc)&(xyz).cmd"
- echo.>"(abc) & (xyz).cmd"
- echo.>"abc;xyz.cmd"
- echo.>"abc,xyz.cmd"
- echo.>"abc=xyz.cmd"
- echo @echo 溢出漏洞存在!^&pause>xyz.cmd
- echo 测试文件生成.
- goto :eof
-
- :start
- echo starting...
- set _line="%cmdcmdline:"="%"
- set _line=%_line:^=^%
- set _line=%_line:&=&%
- set _line=%_line:(=(%
- set _line=%_line:)=)%
- set _line=%_line:,=,%
- set _line=%_line:;=;%
- set _line=%_line: =□%
- rem set _line
- rem pause
- setlocal EnableDelayedExpansion
- for %%f in (%_line:~1,-1%) do set _line2=!_line2!=%%f
- endlocal & set _line=%_line2:□= %
- set _line=%_line:"="%
- set _line=%_line:~9,-1%
- rem set _line
- rem pause
- setlocal EnableDelayedExpansion
- for %%f in (%_line%) do (
- set _file="%%~f"
- set _file=!_file:^=^^!
- set _file=!_file:&=^&!
- set _file=!_file:(=^(!
- set _file=!_file:)=^)!
- set _file=!_file:,=,!
- set _file=!_file:;=;!
- set _file=!_file:===!
- if exist !_file! (echo ---!_file!---) else (echo ___"%%~f"____)
- )
- endlocal
- echo 结束
- pause
复制代码 另外
转义字符的处理过程中
又遇到了等号的替换问题
顺便提供了一种新思路- @echo off & setlocal EnableDelayedExpansion
- set _exp=var=value
- set _exp
- set _exp=%_exp:===%
- set _exp
- echo 全角等号可以直接替换
- pause
- set _exp=var=value
- set _exp
- for %%f in ("=") do (
- call set _exp=!_exp:%%~f=-!
- )
- set _exp
- echo 半角等号不能直接替换
- pause
- set _exp=var=value
- set _exp
- set _exp=%_exp: =□%
- set _exp=%_exp:;=;%
- for %%e in (%_exp%) do set _exp2=!_exp2!=%%e
- set _exp=%_exp2:□= %
- set _exp=%_exp:;=;%
- set _exp=%_exp:~1%
- set _exp
- echo 转折的办法:把非等号的for分隔符替换掉,再用for遍历被等号分隔的所有串,并且用等号的替换字符连接这些串,最后将其它分隔符恢复,不支持处理连续的等号
- pause
复制代码
|