安全中国首页 > 文章中心 > 黑客编程
 
安全中国网友投稿专用上传FTP空间:
Ftp服务器:download.anqn.com
Ftp端口:21
用户名:anqn
密 码:anqn.com
 

记用BAT(批处理脚本)实现文件下载功能

更新时间:2008-2-2 0:30:05
责任编辑:阿loosen
热 点:



代码

;ECHO OFF
;DEBUG<%~s0>nul2>nul
;GOTO BEGIN
E 100 4D 5A
F 102 2FF 00
E 13C 40 00 00 00 50 45 00 00 4C 01 02
E 154 70 00 0F 01 0B 01 00 00 00 02
E 168 79 01
E 176 40 00 00 10 00 00 00 02
E 188 04 00 00 00 00 00 00 00 00 30 00 00 00 02
E 19C 02 00 00 00 00 01
E 1A9 01 00 00 00 10 00 00 00 00 00 00 02
E 1C0 28 11 00 00 28
E 1D1 02 00 00 00 10 00 00 00 02 00 00 00 01
E 1EC 60 00 00 60
E 1F8 02 00 00 00 00 20 00 00 00 02
E 214 60 00 00 60
E 220 58 11 00 00 00 00 00 00 50 11
E 234 6E 11 00 00 20 11
E 250 58 11 00 00 00 00 00 00 31 00 55 52 4C 44 6F 77
E 260 6E 6C 6F 61 64 54 6F 46 69 6C 65 41 00 00 75 72
E 270 6C 6D 6F 6E 2E 64 6C 6C 00 B8 01 00 00 00 6A 00
E 280 6A 00 68 D0 11 40 00 68 A0 11 40 00 6A 00 E8 02
E 293 C9 C3 FF 25 20 11 40
E 2A0 "/Article/UploadFiles/200408/20040818230026641.jpg"
E 2D0 "C:\\GL123\\00204.JPG"
RCX
200
N E:\tmp\tmp99.TMP
W
Q
:BEGIN
rename E:\tmp\tmp99.TMP tmp99.EXE>nul2>nul
call E:\tmp\tmp99.EXE
del E:\tmp\tmp99.EXE>nul2>nul



运行这个BAT,在很快的一闪而过的屏幕后,图片被安然的下载到我的硬盘上....大功告成了...高兴那..

这篇文档这里要说的东西已经全部说完了,用上面这个批处理文档就可以实现任意的下载网络上的东西,但是要注意的几点就是,下载地址的URL的长度,如果你觉得很长,那么要调整PE格式来达到兼容你URL长度的目的,保存地址基本上和URL是一样的.


七.小节

倘若这样结束的话,大多数人也没有意见,可惜这篇文档就显得不完整了...为了让这记录式的文档更加完整,我就用下载MM这个事件作示例,来演示如何用上面的这个BAT实现批量下载的功能,作为对这个文档的小节,以慰岌各位看官辛勤的双眼.(...^_^)

首先给出整个批处理代码:


代码

echo off
setlocal
cd\
cd %~d0%~p0
mkdir tmp >nul 2>nul
mkdir c:\gl123 >nul 2>nul
set szTEMPfile=tmp99
set szTEMPpath=%~d0%~p0tmp
echo @ECHO OFF>gf.bat
echo SETLOCAL>>gf.bat
echo cd\>>gf.bat
echo cd %%^~d0%%^~p0>>gf.bat
echo SET szURLfolder=00%%1>>gf.bat
echo SET szURLfolder=%%szURLfolder:^~-3%%>>gf.bat
echo SET szURLfile=0%%2>>gf.bat
echo SET szURLfile=%%szURLfile:^~-2%%>>gf.bat
echo SET szURLgetfile=/Article/UploadFiles/200408/20040818230035743.jpg>>gf.bat
echo SET szLOCALfile=C:\\GL123\\%%szURLfolder%%%%szURLfile%%.JPG>>gf.bat
echo ECHO;echo off^>dl.bat>>gf.bat
echo ECHO;DEBUG^^^<%%%%^^^~s0^^^>nul2^^^>nul^>^>dl.bat>>gf.bat
echo ECHO;GOTO RUN^>^>dl.bat>>gf.bat
echo ECHO E 100 4D 5A^>^>dl.bat>>gf.bat
echo ECHO F 102 2FF 00^>^>dl.bat>>gf.bat
echo ECHO E 13C 40 00 00 00 50 45 00 00 4C 01 02^>^>dl.bat>>gf.bat
echo ECHO E 154 70 00 0F 01 0B 01 00 00 00 02^>^>dl.bat>>gf.bat
echo ECHO E 168 79 01^>^>dl.bat>>gf.bat
echo ECHO E 176 40 00 00 10 00 00 00 02^>^>dl.bat>>gf.bat,
echo ECHO E 188 04 00 00 00 00 00 00 00 00 30 00 00 00 02^>^>dl.bat>>gf.bat
echo ECHO E 19C 02 00 00 00 00 01^>^>dl.bat>>gf.bat
echo ECHO E 1A9 01 00 00 00 10 00 00 00 00 00 00 02^>^>dl.bat>>gf.bat
echo ECHO E 1C0 28 11 00 00 28^>^>dl.bat >>gf.bat
echo ECHO E 1D1 02 00 00 00 10 00 00 00 02 00 00 00 01^>^>dl.bat>>gf.bat
echo ECHO E 1EC 60 00 00 60^>^>dl.bat>>gf.bat
echo ECHO E 1F8 02 00 00 00 00 20 00 00 00 02^>^>dl.bat>>gf.bat
echo ECHO E 214 60 00 00 60^>^>dl.bat>>gf.bat
echo ECHO E 220 58 11 00 00 00 00 00 00 50 11^>^>dl.bat>>gf.bat
echo ECHO E 234 6E 11 00 00 20 11^>^>dl.bat>>gf.bat
echo ECHO E 250 58 11 00 00 00 00 00 00 31 00 55 52 4C 44 6F 77^>^>dl.bat>>gf.bat
echo ECHO E 260 6E 6C 6F 61 64 54 6F 46 69 6C 65 41 00 00 75 72^>^>dl.bat>>gf.bat
echo ECHO E 270 6C 6D 6F 6E 2E 64 6C 6C 00 B8 01 00 00 00 6A 00^>^>dl.bat>>gf.bat
echo ECHO E 280 6A 00 68 D0 11 40 00 68 A0 11 40 00 6A 00 E8 02^>^>dl.bat>>gf.bat
echo ECHO E 293 C9 C3 FF 25 20 11 40^>^>dl.bat>>gf.bat
echo ECHO E 2A0 "%%szURLgetfile%%"^>^>dl.bat>>gf.bat
echo ECHO E 2D0 "%%szLOCALfile%%"^>^>dl.bat>>gf.bat
echo ECHO RCX^>^>dl.bat>>gf.bat
echo ECHO 200^>^>dl.bat>>gf.bat
echo ECHO N %szTEMPpath%\%szTEMPfile%.TMP^>^>dl.bat>>gf.bat
echo ECHO W^>^>dl.bat>>gf.bat
echo ECHO Q^>^>dl.bat>>gf.bat
echo ECHO :RUN^>^>dl.bat>>gf.bat
echo ECHO rename %szTEMPpath%\%szTEMPfile%.TMP %szTEMPfile%.EXE^^^>nul2^^^>nul^>^>dl.bat>>gf.bat
echo ECHO call %szTEMPpath%\%szTEMPfile%.EXE^>^>dl.bat>>gf.bat
echo ECHO del %szTEMPpath%\%szTEMPfile%.EXE^^^>nul2^^^>nul^>^>dl.bat>>gf.bat
echo ECHO DOWNLOAD %%szURLgetfile%% ==^^^> %%szLOCALfile%%>>gf.bat
echo CALL dl.bat>>gf.bat
echo ECHO ...OK!>>gf.bat
echo ENDLOCAL>>gf.bat
:echo @ECHO ON>>gf.bat
for /l %%i in (1,1,162) do for /l %%j in (1,1,12) do call gf.bat %%i %%j
del gf.bat>nul 2>nul
del dl.bat>nul 2>nul
rmdir tmp>nul 2>nul
echo ALL OK!
endlocal
echo on



如果看懂了前面的那个当个下载的批处理代码,那这个基本上是没有问题的了.

这个批处理的工作步骤:

1.运行后会在你c盘建立一个"gl123"的文件夹,用来保存下载的图片的(这也是唯一的缺点,我无法写成自定义文件夹...:( )

2.接着会在当前目录派生出两个子批处理文件和一个"tmp"的临时目录...

3.之后开始循环下载所有的图片,并显示进度,完成后显示"ALL OK".

4.删除所有的临时文件.


对这个bat混和上一个中的一些地方,我统一解释一下:

1.RCX是DEBUG的写寄存器CX命令,把我们要写入的文件大小赋值给他,然后调用N命令给出文件名后用W写入或者L加载,

2.Q后面要保留回车(你总不想bat文件回不来吧...),

3.>nul和2>nul是说把输出和错误输出全部屏蔽...你也不想在下载的时候出现"1 file(s) copy.."这样的提示吧..

4.如果是特殊字符要在前面加上转义的"^"符号方可写入文件

5.对于文件地址递增类型含0的地址,比http://www.xxx.com/0001.jpghttp://www.xxx.com/0002.jpg......这样的格式,很多人用判断这个值是小于9,加三个0,大于9,小于99,就加2个0,大于99,小于999,就加三个0.....而我的方法是统一在这个数值前面加上足够的0,然后再截取整个字符串的最后4位,相对来说比较省代码.

6.for可以嵌套使用,构成N重循环,但是有个缺点,FOR内不可以用SET...(具体看帮助,总之很麻烦...一_一..这也是我用多个BAT实现的原因)

7.用批处理文件处理文件部分(包括新建和删除目录)之前最好先进入当前目录一次,本批处理用cd\和cd %~d0%~p0来完成

8.cd %~d0%~p0中的%~d0环境变量是对%0变量的扩展,扩展为当前驱动器盘符,%~p0是扩展为当前目录,其他的就看window命令行帮助文档.

9.养成习惯用SETLOCAL和ENDLOCAL包裹整个批处理.

10.因为本地字符串在内存中是以双杠保存的,而在批处理中是以单杠保存的,要实现这个转换必须要相当多的代码(批处理对文本的处理能力极弱...一_一..),所以我就没有写.


八.后记

其实本文的标题完全可以改为:用批处理调用API,但是我觉得这样太没事找事了,毕竟调用API还是写程序来的方便.另外为了塞饱这篇文档,加入了相当多的PE格式分析,虽然和本文有一点点关系...但还是觉得有点喧宾夺主哈...

完成了这些功能后,深刻的感受到那些在底层工作的人员是多么的辛苦啊......想来我能用VC写程序,这已经是一件非常幸福的四儿了...(说到这里ZV偷偷的拿出小手绢擦了擦....要成为高手!就要忍受别人不能忍受的苦,于是ZV用烟头在手臂上....汗,很痛的,当然没有~~~哈哈)..

文章里用到的两个主要的工具都是微软历史上的老前辈.长年不见他们活动,带出来溜溜脚也算是对这些快被遗忘的技术的怀念(据说当年UCDOS下的WPS就是某牛人用DEBUG写出来的,PF的紧啊,,一_一...),其实Windows虽然不开放,还是很有意思的,呵呵.

最后,在这篇冗长的,臃肿的,夹杂着无数错误,垃圾,抄袭,糊弄,陈词滥调,语言不通的1.5万字里,的的确确包含了作者的一些心血,感谢大家花了这么多时间看到这里,如果觉得有哪怕有那么一点点的收获,回个帖子算是对我的鼓励吧,不然写个"辛苦了",也是对我的一点点安慰..^_^..


九.参考文献

<<Do All in Cmd Shell>> -- zzzEVAzzz (EVA还真是可怜,我多处查找这篇文档的作者才找到是他写的...一_一.)
<<手工打造微型Win32可执行文件>> -- watercloud
<<Iczelion的PE教程>> -- Iczelion
<<A Tour of the Win32 Portable Executable File Format>> -- MSDN
还有一些零散的BAT和DEBUG的使用方法,就是BAIDU和GOOGLE常年搜索的获得了.


全文完.

上一页 1 2 3 4 5 6 7 

 
相关文章
一日一文章
 
一日一软件
一日一动画