HRESULT URLDownloadToFile(
LPUNKNOWN pCaller,
LPCTSTR szURL,
LPCTSTR szFileName,
DWORD dwReserved,
LPBINDSTATUSCALLBACK lpfnCB
);
Header Urlmon.h
Import library Urlmon.lib
Minimum availability Internet Explorer 3.0
Minimum operating systems Windows NT 4.0, Windows 95
Rundll and Rundll32 programs do not allow you to call any exportedfunction from any DLL. For example, you can not use these utilityprograms to call the Win32 API (Application Programming Interface)calls exported from the system DLLs. The programs only allow you tocall functions from a DLL that are explicitly written to be called bythem.
void CALLBACK
EntryPoint(HWND hwnd, HINSTANCE hinst, LPSTR lpszCmdLine, int nCmdShow);
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
00 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 00 ................
++++++++++++++++++++++++
+DOS信息部分 +
++++++++++++++++++++++++
++++++++++++++++++++++++
+PE信息部分 +
++++++++++++++++++++++++
++++++++++++++++++++++++
+数据部分 +
++++++++++++++++++++++++
+++++++++++++++++++++++++++++++++++++++++++++
+ +++++++++++++++++++++++++++++++++++++++ +
+ +[DOS文件头][0x40] + +
+ +++++++++++++++++++++++++++++++++++++++ +
+ + <==DOS信息部分
+ +++++++++++++++++++++++++++++++++++++++ +
+ +[DOS块][0x70,可变] + +
+ +++++++++++++++++++++++++++++++++++++++ +
+++++++++++++++++++++++++++++++++++++++++++++
typedef struct _IMAGE_DOS_HEADER { // DOS .EXE header
WORD e_magic; // Magic number
WORD e_cblp; // Bytes on last page of file
WORD e_cp; // Pages in file
WORD e_crlc; // Relocations
WORD e_cparhdr; // Size of header in paragraphs
WORD e_minalloc; // Minimum extra paragraphs needed
WORD e_maxalloc; // Maximum extra paragraphs needed
WORD e_ss; // Initial (relative) SS value
WORD e_sp; // Initial SP value
WORD e_csum; // Checksum
WORD e_ip; // Initial IP value
WORD e_cs; // Initial (relative) CS value
WORD e_lfarlc; // File address of relocation table
WORD e_ovno; // Overlay number
WORD e_res[4]; // Reserved words
WORD e_oemid; // OEM identifier (for e_oeminfo)
WORD e_oeminfo; // OEM information; e_oemid specific
WORD e_res2[10]; // Reserved words
LONG e_lfanew; // File address of new exe header
} IMAGE_DOS_HEADER, *PIMAGE_DOS_HEADER;
Offset 0 1 2 3 4 5 6 7 8 9 A B C D E F
00000000 4D 5A 00 5B D5 E2 C0 EF B6 BC C3 BB D3 C3 2C 2C MZ.[这里都没用,,
00000010 B1 C8 C8 E7 CE D2 D0 B4 3A CE D2 D2 B2 D6 BB 2C 比如我写:我也只,
00000020 CA C7 D2 BB B0 E3 CB A7 2C B2 BB CA C7 CC D8 2C 是一般帅,不是特,8
00000030 B1 F0 CB A7 B5 C4 C0 B2 5D 00 00 00 40 00 00 00 别帅的啦]...@...
+++++++++++++++++++++++++++++++++++++++++++++
+ +++++++++++++++++++++++++++++++++++++++ +
+ +[PE标志][0x04] + +
+ +++++++++++++++++++++++++++++++++++++++ +
+ + <==PE信息部分
+ +++++++++++++++++++++++++++++++++++++++ +
+ +[PE文件头][0x18] + +
+ +++++++++++++++++++++++++++++++++++++++ +
+ +
+ +++++++++++++++++++++++++++++++++++++++ +
+ +[自定义数据结构][0x0e] + +
+ +++++++++++++++++++++++++++++++++++++++ +
+++++++++++++++++++++++++++++++++++++++++++++
typedef struct _IMAGE_NT_HEADERS {
DWORD Signature; //"PE标志"段,总是"PE00"
IMAGE_FILE_HEADER FileHeader; //"PE文件头"段,指向IMAGE_FILE_HEADER结构
IMAGE_OPTIONAL_HEADER OptionalHeader; //"自定义数据"段,指向IMAGE_OPTIONAL_HEADER结构
} IMAGE_NT_HEADERS, *PIMAGE_NT_HEADERS;
typedef struct _IMAGE_FILE_HEADER {
WORD Machine; //运行平台,386的话是104CH
WORD NumberOfSections; //文件节数目,最少为2
DWORD TimeDateStamp; //文件创建时间,随便设置(不过为了最后生成方便,随便设置的地方最好都设置为0)
DWORD PointerToSymbolTable; //这里两项记用于调试,也随便设置
DWORD NumberOfSymbols;
WORD SizeOfOptionalHeader; //下面那个IMAGE_OPTIONAL_HEADER结构的长度,一般为000EH(包括16个IMAGE_DATA_DIRECTORY结构),我们只要2个结构,所以设置为0070H
WORD Characteristics; //文件属性,PE文件是010H,DLL的话是210H
} IMAGE_FILE_HEADER, *PIMAGE_FILE_HEADER;
typedef struct _IMAGE_OPTIONAL_HEADER {
WORD Magic; //EXE文件的话这里是10B
BYTE MajorLinkerVersion; //连接器版本,随便
BYTE MinorLinkerVersion;
DWORD SizeOfCode; //所有代码节总大小,我们就一个节,所以是512,也就是200H
DWORD SizeOfInitializedData; //....未初始化数据节....没有这个,设置为0
DWORD SizeOfUninitializedData; //....已................................
DWORD AddressOfEntryPoint; //代码执行起始地址,注意,这个是你代码存放的位置,[这里注意点1]
DWORD BaseOfCode; //代码段......(这里三个都是内存地址),这里是0
DWORD BaseOfData; //数据段......(并非硬盘文件地址),这里是0
DWORD ImageBase; //建议加载位置,通常是00400000H,9X的系统可能略小于这个值,记不得了..:(
DWORD SectionAlignment; //内存中对齐大小,一般为1000H,也就是NT的一个内存片,4KB
DWORD FileAlignment; //文件..........,这里设置最小的,200H,兼容全部系统
WORD MajorOperatingSystemVersion; //一下几个都是系统版本相关的,随便设置
WORD MinorOperatingSystemVersion;
WORD MajorImageVersion;
WORD MinorImageVersion;
WORD MajorSubsystemVersion; //这里要设置为04H
WORD MinorSubsystemVersion;
DWORD Win32VersionValue; //未用
DWORD SizeOfImage; //PE文件占用的内存空间,我们设置为3000H
DWORD SizeOfHeaders; //PE文件头大小(含节表),这里是200H
DWORD CheckSum; //效验和(我不知道用来干嘛,PE几乎都是000000000,可能和其他方面有关,比如调试?)
WORD Subsystem; //文件子系统,子系统的含义大家可以去参考NT内核,这里设置为02,03均可(控制台和窗口子系统)
WORD DllCharacteristics;
DWORD SizeOfStackReserve; //一下几个是有关堆和栈的设置,基本上随便,不过最好设置够用就行(不是0啊!)
DWORD SizeOfStackCommit;
DWORD SizeOfHeapReserve;
DWORD SizeOfHeapCommit;
DWORD LoaderFlags; //未用
DWORD NumberOfRvaAndSizes; //下面的IMAGE_DATA_DIRECTORY结构的数量,原来是16个,最少为2个
IMAGE_DATA_DIRECTORY DataDirectory[IMAGE_NUMBEROF_DIRECTORY_ENTRIES];
} IMAGE_OPTIONAL_HEADER, *PIMAGE_OPTIONAL_HEADER;
typedef struct _IMAGE_DATA_DIRECTORY {
DWORD VirtualAddress;
DWORD Size;
} IMAGE_DATA_DIRECTORY, *PIMAGE_DATA_DIRECTORY;
Offset 0 1 2 3 4 5 6 7 8 9 A B C D E F
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
+++++++++++++++++++++++++++++++++++++++++++++
+ +++++++++++++++++++++++++++++++++++++++ +
+ +[数据节表][0x24*N+1] + +
+ +++++++++++++++++++++++++++++++++++++++ +
+ + <==PE数据部分
+ +++++++++++++++++++++++++++++++++++++++ +
+ +[数据节][不定] + +
+ +++++++++++++++++++++++++++++++++++++++ +
+++++++++++++++++++++++++++++++++++++++++++++
typedef struct _IMAGE_SECTION_HEADER {
BYTE Name[IMAGE_SIZEOF_SHORT_NAME];//这个8字节的空间就是给你来定义这个节的名称,比如大家常见的".text.data.code"等等,我这里为了以后的填充方便,设置了空白..(00000000H),其实这里是可以随便写的,比如你定义".zvrop"也可以
union {
DWORD PhysicalAddress; //这是个联合结构,说明了该节的大小,我们整个PE文件就是一个节,所以是200H
DWORD VirtualSize;
} Misc;
DWORD VirtualAddress; //定位该节在内存中的地址(相对于加载位置的偏移地址)我们这里是先不说这些.[这里算作注意点3]
DWORD SizeOfRawData; //文件中的尺寸,这里和上面的联合结构不同,这里是对齐后的地址,我们设置为200H
DWORD PointerToRawData; //该节在文件中的位置,相对于文件头,这里可以随便设置,不过设置了后面的代码指针也要跟着变动,我们这里设置100H
DWORD PointerToRelocations; //下面四个是给连接器用的参数,随便
DWORD PointerToLinenumbers;
WORD NumberOfRelocations;
WORD NumberOfLinenumbers;
DWORD Characteristics; //节的属性,自己区查表,基于篇幅,这张表我就不提供了,需要的可以PM我,一般代码节为60000020H(40000000&2000000&00000020),即是可执行,可读的代码段,我们设置为60000060H,因为我们既包含了数据又包含了代码.
} IMAGE_SECTION_HEADER, *PIMAGE_SECTION_HEADER;
Offset 0 1 2 3 4 5 6 7 8 9 A B C D E F
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 ....`..`........
Offset 0 1 2 3 4 5 6 7 8 9 A B C D E F
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
typedef struct _IMAGE_IMPORT_DESCRIPTOR {
union {
DWORD Characteristics;
DWORD OriginalFirstThunk; //指向一个"函数列表的指针结构".
};
DWORD TimeDateStamp; //暂时可以看作没用,0
DWORD ForwarderChain; //暂时可以看作没用,0
DWORD Name; //指向一个DLL,这个结构里面的函数必须都是这个DLL里面的
DWORD FirstThunk; //指向一个IAT表,最后操作系统修改的就是这个
} IMAGE_IMPORT_DESCRIPTOR;
typedef struct _IMAGE_THUNK_DATA32 {
union {
PBYTE ForwarderString;
PDWORD Function;
DWORD Ordinal;
PIMAGE_IMPORT_BY_NAME AddressOfData;
} u1;
} IMAGE_THUNK_DATA32;
Offset 0 1 2 3 4 5 6 7 8 9 A B C D E F
50 11 00 00 00 00 00 00 X.......P.......
00000130 00 00 00 00 6E 11 00 00 20 11 00 00
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 ...............]
PUSH 0 ;6A 00
PUSH 0 ;6A 00
PUSH XXXXXXXX ;68 XXXXXXXX
PUSH XXXXXXXX ;68 XXXXXXXX
PUSH 0 ;6A 00
CALL XXXXXXXX ;E8 XXXXXXXX
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
68 D0114000
68 A0114000
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 j.h?@.h?@.j.?
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 ................
;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
;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 "http://www.sergeaura.net/TGP/002/images/04.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
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=http://www.sergeaura.net/TGP/%%szURLfolder%%/images/%%szURLfile%%.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.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.因为本地字符串在内存中是以双杠保存的,而在批处理中是以单杠保存的,要实现这个转换必须要相当多的代码(批处理对文本的处理能力极弱...一_一..),所以我就没有写.
| 欢迎光临 无忧启动论坛 (http://bbs.c3.wuyou.net/) | Powered by Discuz! X3.3 |