闲来无事之--记用BAT(批处理脚本)实现文件下载功能(再续)

五.解决-打造

[THIS IS JMP S2]

现在我们再回头整理一下整个过程...结合这张表:

代码

Offset      0  1  2  3  4  5  6  7   8  9  A  B  C  D  E  F

00000000   4D 5A 5B 00 00 00 00 00  00 00 00 00 00 00 00 00   MZ[.............
00000010   00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00   ................
00000020   00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00   ................
00000030   00 00 00 00 00 00 00 00  00 00 00 5D 40 00 00 00   ...........]@...
00000040   50 45 00 00 4C 01 02 00  00 00 00 00 00 00 00 00   PE..L...........
00000050   00 00 00 00 70 00 0F 01  0B 01 00 00 00 02 00 00   ....p...........
00000060   00 00 00 00 00 00 00 00  79 01 00 00 00 00 00 00   ........y.......
00000070   00 00 00 00 00 00 40 00  00 10 00 00 00 02 00 00   ......@.........
00000080   00 00 00 00 00 00 00 00  04 00 00 00 00 00 00 00   ................
00000090   00 30 00 00 00 02 00 00  00 00 00 00 02 00 00 00   .0..............
000000A0   00 01 00 00 00 00 00 00  00 01 00 00 00 10 00 00   ................
000000B0   00 00 00 00 02 00 00 00  00 00 00 00 00 00 00 00   ................
000000C0   28 11 00 00 28 00 00 00  00 00 00 00 00 00 00 00   (...(...........
000000D0   00 02 00 00 00 10 00 00  00 02 00 00 00 01 00 00   ................
000000E0   00 00 00 00 00 00 00 00  00 00 00 00 60 00 00 60   ............`..`
000000F0   00 00 00 00 00 00 00 00  02 00 00 00 00 20 00 00   ............. ..
00000100   00 02 00 00 00 00 00 00  00 00 00 00 00 00 00 00   ................
00000110   00 00 00 00 60 00 00 60  00 00 00 00 00 00 00 00   ....`..`........
00000120   58 11 00 00 00 00 00 00  50 11 00 00 00 00 00 00   X.......P.......
00000130   00 00 00 00 6E 11 00 00  20 11 00 00 00 00 00 00   ....n... .......
00000140   00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00   ................
00000150   58 11 00 00 00 00 00 00  5B 00 00 00 00 00 00 00   ........[.......
00000160   00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00   ................
00000170   00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00   ................
00000180   00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00   ................
00000190   00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00   ................
000001A0   00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00   ................
000001B0   00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00   ................
000001C0   00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00   ................
000001D0   00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00   ................
000001E0   00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00   ................
000001E0   00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 5D   ...............]


这张PE文件数据图就是一个很大的"填空",除去重要的数据部分,我们可以随便写入数据的地方有2个(也就是两个大挂号挂起来的中间).

第一个是从地址00000002开始的,到地址0000003B结束的56字节.

第二个是从地址00000160开始的,到PE文件结尾的160字节.(也可以从000000158开始,这样就有168字节)

因为我们的程序很短,所以第二个168字节基本上可以满足要求全部,就不需要第一个56字节的数据了.把数据和在一起也方便呢,不是么?^_^.

那这些地方具体填写些什么东西呢?大致来说分为三个部分:

1.导入表,包括"URLDownloadToFile"这个函数的字符串和"URLMON.DLL"这个DLL的字符串.

2.文件的可执行机器码.

3.函数需要的数据.



首先是导入表,根据上一节说的那些,我们可以很容易的判断出这个"URLDownloadToFile"该填在"58 11 00 00"的位置.当然你可以改这个值,这个值只是我写的.总之你想吧这个导入表放在什么位置,这个"58 11 00 00"就要指向这个位置.于是我们在PE文件的00000158位置写入"31 00 URLDownloadToFile"字符串,前面两个16进制是序号是给转载器提供信息作为在DLL中导出地址的依据.

(对了,这里说明一个问题,这篇文档也注释了很多"注意点",为什么呢,仔细看看这些注意点,发现都是和位置有关的,那是因为:PE文件中的绝大多数的地址,都是采用文件加载后内存中的地址的,这样一方面加快了加载速度,另外一方面也省了不少加载器的工作,比如这个"58 11 00 00"的地址,因为我们加载的位置是1000H,所以根据这个位置,我们在文件中的位置就是158H,这里要申明的一点,并不是所有的地址都可以这么计算的,因为我们在PointerToRawData那里设置了100H,为的就是这样方便的计算相对地址,对于其他的PE文件,如果要根据这种内存地址计算出PE文件地址,还不是这么简单是事情,^_^..当然,网络上也有很多这种转换函数,RVA到OFFSET的)

然后把URLMON.DLL这个字符串填入"6E 11 00 00"指向的地址,当然这个值也是可以变的.

最后,我们要用笔记录一下最后这个函数被导出的地址的存放处,也就是"20 11 00 00".

[注意,以上的这些操作都和IMAGE_IMPORT_DESCRIPTOR结构和IMAGE_THUNK_DATA32结构相关,看不明白的多看看这两个结构]


接下来是可执行码.我们的目的很简单,只要这个PE文件能下载文件就行,所以我们只要调用URLDownloadToFile函数即可,写一小段汇编码(还记得前面说过的URLDownloadToFile的调用方法吗,花了点笔墨的那个):

代码

PUSH 0                 ;6A 00
PUSH 0                 ;6A 00
PUSH XXXXXXXX          ;68 XXXXXXXX
PUSH XXXXXXXX          ;68 XXXXXXXX
PUSH 0                 ;6A 00
CALL XXXXXXXX          ;E8 XXXXXXXX


由于函数的调用是符合PASCAL调用,也就是STDCALL,自右向左压栈,所以我们的参数也是最后一个先入栈.最后CALL出这个URLDownloadToFile函数.

前两个XXXXXXXX地址是两个字符串的地址,也就是URLDownloadToFile函数的两个重要参数,最后一个XXXXXXXX是这个函数在内存中的地址(操作系统已经帮我们填充了,还记得上面说的那个用笔记录的"20 11 00 00"么?)

主要的代码就是这么多,可是不幸的事情发生了,当我用WINHEX把这些代码填入PE框架并且保存的时候,居然被杀毒软件删除了!!!!他们把这个看作病毒????想来写病毒原来是这么容易的事情(.....一_一.)....

幸好有备份(如果没有,我可是要哭死了.....),我修改了这些代码,加入了一些垃圾(比如MOV EAX,1之列的)...最终的成品代码是:

代码

B8 01000000    ;mov eax,1
6A 00          ;push 0
6A 00          ;push 0
68 D0114000    ;push D0114000 ;指向你保存的本地路径字符串的位置,本文中是"c://gl123//00204.jpg",注意是双杠.
68 A0114000    ;push A0114000 ;指向要下载的URL字符串保存的位置
6A 00          ;push 0
E8 02000000    ;call 02000000 ;也就是呼叫下两个字节的地址,这是机器中调用函数的通常做法
C9             ;leave
C3             ;ret
FF25 20114000  ;jmp 20114000  ;这个跳转地址就是"20 11 00 00",至于那个"40",
                              ;就是程序的建议起始加载地址"00400000".另外,这里是仿机器格式.
00
00
00
00


将他们写入哪里呢?这个就随便你了,不过请翻翻上面说的,有个地址是(也就是注意1所在的位置)AddressOfEntryPoint:这个就是用来定位你代码的执行入口的,我们就放在导入表的后面,也就是"00000179H"的位置.


最后就是那两个字符串的地址了,我们在程序中已经给出

代码

68 D0114000
68 A0114000


那这两个字符串的位置就确定了,一个是"000001D0H",我们要下载的文件地址"/Article/UploadFiles/200408/20040818230017329.JPG"就是保存到这里..这里我每个分配了48字节存储区域,大家也可以根据具体需要设置.别忘了还有dos头部可以保存56字节的空白可以写数据,如果需要的话,修改指向就是.

对于上面的这一堆废话,我的目的是想让大家明白,而故意介绍的格式,即是说,如果让你换做其他的API函数也能轻易的调用,而不是局限于URLDownloadToFile.^_^...比如那些...那些...功能啊....(我可没说啊...嘿嘿)..


OK,这个PE文件最后的成形PE框架是这样的:

代码

Offset      0  1  2  3  4  5  6  7   8  9  A  B  C  D  E  F

00000000   4D 5A 00 00 00 00 00 00  00 00 00 00 00 00 00 00   MZ..............
00000010   00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00   ................
00000020   00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00   ................
00000030   00 00 00 00 00 00 00 00  00 00 00 00 40 00 00 00   ............@...
00000040   50 45 00 00 4C 01 02 00  00 00 00 00 00 00 00 00   PE..L...........
00000050   00 00 00 00 70 00 0F 01  0B 01 00 00 00 02 00 00   ....p...........
00000060   00 00 00 00 00 00 00 00  79 01 00 00 00 00 00 00   ........y.......
00000070   00 00 00 00 00 00 40 00  00 10 00 00 00 02 00 00   ......@.........
00000080   00 00 00 00 00 00 00 00  04 00 00 00 00 00 00 00   ................
00000090   00 30 00 00 00 02 00 00  00 00 00 00 02 00 00 00   .0..............
000000A0   00 01 00 00 00 00 00 00  00 01 00 00 00 10 00 00   ................
000000B0   00 00 00 00 02 00 00 00  00 00 00 00 00 00 00 00   ................
000000C0   28 11 00 00 28 00 00 00  00 00 00 00 00 00 00 00   (...(...........
000000D0   00 02 00 00 00 10 00 00  00 02 00 00 00 01 00 00   ................
000000E0   00 00 00 00 00 00 00 00  00 00 00 00 60 00 00 60   ............`..`
000000F0   00 00 00 00 00 00 00 00  02 00 00 00 00 20 00 00   ............. ..
00000100   00 02 00 00 00 00 00 00  00 00 00 00 00 00 00 00   ................
00000110   00 00 00 00 60 00 00 60  00 00 00 00 00 00 00 00   ....`..`........
00000120   58 11 00 00 00 00 00 00  50 11 00 00 00 00 00 00   X.......P.......
00000130   00 00 00 00 6E 11 00 00  20 11 00 00 00 00 00 00   ....n... .......
00000140   00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00   ................
00000150   58 11 00 00 00 00 00 00  31 00 55 52 4C 44 6F 77   X.......1.URLDow
00000160   6E 6C 6F 61 64 54 6F 46  69 6C 65 41 00 00 75 72   nloadToFileA..ur
00000170   6C 6D 6F 6E 2E 64 6C 6C  00 B8 01 00 00 00 6A 00   lmon.dll.?...j.
00000180   6A 00 68 D0 11 40 00 68  A0 11 40 00 6A 00 E8 02   [email protected][email protected].?
00000190   00 00 00 C9 C3 FF 25 20  11 40 00 00 00 00 00 00   ...擅% .@......
000001A0   68 74 74 70 3A 2F 2F 77  77 77 2E 73 65 72 67 65   http://www.serge
000001B0   61 75 72 61 2E 6E 65 74  2F 54 47 50 2F 30 30 32   aura.net/TGP/002
000001C0   2F 69 6D 61 67 65 73 2F  30 34 2E 6A 70 67 00 00   /images/04.jpg..
000001D0   43 3A 5C 5C 47 4C 31 32  33 5C 5C 30 30 32 30 34   C://GL123//00204
000001E0   2E 4A 50 47 00 00 00 00  00 00 00 00 00 00 00 00   .JPG............
000001F0   00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00   ................




简单的运行一下这个PE文件,图片已经被下载到C盘的GL123文件夹,说明我们的工作还是成功的哈.(哇,好sex的MM啊,口水流啊流.....)

六.包装

到这里开始,我们的EXE是有了,现在开始DEBUG出场,我们的计划是用E命令写入整个PE文件数据,然后用W命令保存到临时文件中,于是就成就了这个原始BAT文件:

代码

;echo off
;DEBUG<%~s0>nul2>nul
;GOTO BEGIN
E 100 4D 5A 00 00 00 00 00 00 00 00 00 00 00 00 00 00
E 110 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
......
......这里省略若干
......
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



不过这样很不美观...于是我又想了一个办法优化,用F命令向填充512个00,然后再在相对位置写入需要的数据,于是乎就生成了下载bat脚本的bate1版本,这个是完整的批处砦募?

代码

;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.jpg,http://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万字里,的的确确包含了作者的一些心血,感谢大家花了这么多时间看到这里,如果觉得有哪怕有那么一点点的收获,回个帖子算是对我的鼓励吧,不然写个"辛苦了",也是对我的一点点安慰..^_^..


九.参考文献

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



全文完.

你可能感兴趣的:(闲来无事之--记用BAT(批处理脚本)实现文件下载功能(再续))