标题: [原创]********Any2Bat********
[打印本页]
作者: s11ss
时间: 2007-12-2 14:24
标题: [原创]********Any2Bat********
@echo off
::::::::Any2Bat {s11ss 2007-12-2}::::::::
::思路:利用debug获得原文件16进制代码,然后再次利用debug构造生成原文件的bat代码。
setlocal
set f="%~f1"
if not exist %f% (echo File doesn't exist!&&goto :eof)
::写临时文件
set len=%~z1
set/a end=0x100+%len%-1
call :10to16 %end%
pushd %tmp%
>t1 call echo d100 %%r%end%%%
>>t1 echo q
>nul copy %f% t2
type t1|debug t2|more|find ":">t3
::读取临时文件t3,获得16进制代码
set "i= %%a %%b %%c %%d %%e %%f %%g %%h %%i %%j %%k %%l %%m %%n %%o %%p %%q"
for /f "delims=" %%a in (t3) do set/a lines+=1
set/a m=1
setlocal enabledelayedexpansion
for /f "tokens=1-17 delims=- " %%a in (t3) do (
if !m! equ %lines% goto :lastline
set "hex!m!=%i%"
set/a m+=1
)
:lastline
set/a m-=1
set/a remain=(%len%-16*%m%+1)*3
call set remain=%%i:~0,%remain%%%
for /f "tokens=1-17 delims=- " %%a in ('^<t3 more +%m%') do set "hex%lines%=%remain%"
::写bat
call :10to16 %len%
set t=^>^>%f%.bat echo
%t% @echo off
%t% ^<^"%%^~f0^" more +4 ^|debug ^>nul
%t% move t "%~nx1"
%t% goto :eof
for /l %%a in (1,1,%lines%) do (
call set hex%%a=%%hex%%a:*:=e%%
%t% !hex%%a!
)
%t% rcx
%t% !r%len%!
%t% n t
%t% w
%t% q
for /l %%a in (1,1,3) do (del t%%a)
goto :eof
:10to16
set "h=0123456789ABCDEF"
set/a q=%1
:1c
set/a r=%q%%%16
set/a q=%q%/16
call set r=%%h:~%r%,1%%
call set r%1=%r%%%r%1%%
if not %q% equ 0 goto :1c
作者: vkill
时间: 2007-12-2 21:54
像这样的问题,我始终觉得 debug 不好,要是文件大了就慢的,
http://www.cn-dos.net/forum/viewthread.php?tid=35808 还是用vbs快多了,不是打击s11ss兄,用最短的脚本最快的效率最合适的工具解决问题才是关键,至少我们现在学习这些脚本都是为了解决问题吧
作者: s11ss
时间: 2007-12-2 23:30
我还要多谢vkill兄啊,vkill兄总是鞭策鼓励我不断的学习以得到进步——我发的帖子"Base64加密"里兄说不是纯P的,这回Any2Bat是纯P的兄又说debug不好。当然这两件事并不矛盾,我也丝毫没有埋怨兄的意思。各路大侠尽管批评指正!
作者: zh159
时间: 2007-12-3 00:22
我的意见是:比较简单的P应用(少量字符加密之类)尽量使用纯P;大量处理文字、文件转换,使用效率高的脚本(VBS等)
作者: fastslz
时间: 2007-12-3 10:48
s11ss兄的确很有创意,打击也好埋怨也好都不成立,就当自己练练自己的Batch功底吧,因为日常应用中Batch类型并不多,久而久之出现对某些命令陌生起来,同理机器不动会生锈,反之在在练Batch时积累更多的经验。
16进制转换我还是用C++启程者GOTOmsdos兄的迷你互转器效率超高
http://www.cn-dos.net/forum/view ... hlight=%2Bgotomsdos