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

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

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

代码

OptionHeader结构(自定义数据结构)定义如下:
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;



有了这个IMAGE_OPTIONAL_HEADER结构,PE文件的作用和包含了什么资源都一目了然了.

IMAGE_DATA_DIRECTORY结构如下,PE文件中包含了很多数据类型,比如导出,导入函数,资源,重定位,调试和版权信息等等,这个结构最多可以有16个,就是用来定位这些数据的:


代码

typedef struct _IMAGE_DATA_DIRECTORY {
DWORD VirtualAddress;
DWORD Size;
} IMAGE_DATA_DIRECTORY, *PIMAGE_DATA_DIRECTORY;



IMAGE_DATA_DIRECTORY结构就是指出了你每个数据类型的在内存中的装载位置和长度.注意,这个结构和下面要说道的节表不同,虽然他们可能指向的是同一个地址,但是,IMAGE_DATA_DIRECTORY区分的是严格的数据类型,而节表只是根据人为的定义来划分数据的种类,如果是正常的EXE,通常把各个数据种类分开存放,而这些数据通常又和数据类型用一样的方法分类,所以IMAGE_DATA_DIRECTORY结构和节表指向的地址可能是一样的,但是本文这篇例子不同,因为我们手写的PE必须尽可能的小,所以我吧几个节表的数据全部放在了一个节,这样,节表就只有一个,而IMAGE_DATA_DIRECTORY结构要从混和的数据中指向正确的数据类型地址,就和节表指向的不一样了.

综上所述,"PE信息部分"对应框架的代码为:


代码

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



这上面的数据大多都解释过了,这里要看地址"000000C0"处的"28 11 00 00 28 00 00 00",这个是IMAGE_DATA_DIRECTORY结构的第二个,也就是导入表的地址,"00 00 00 28"这个是长度,不比多说,"00 00 11 28"这个又为何?带着这个问题看下去...[这里算作注意点2]


最后要介绍的是"数据部分":


引用

+++++++++++++++++++++++++++++++++++++++++++++
+ +++++++++++++++++++++++++++++++++++++++ +
+ +[数据节表][0x24*N+1] + +
+ +++++++++++++++++++++++++++++++++++++++ +
+ + <==PE数据部分
+ +++++++++++++++++++++++++++++++++++++++ +
+ +[数据节][不定] + +
+ +++++++++++++++++++++++++++++++++++++++ +
+++++++++++++++++++++++++++++++++++++++++++++



其中IMAGE_SECTION_HEADER结构(数据节表)如下:


代码

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;



可以看到这个结构的数量是不定的,也就是你下面有多少个节,就有多少个IMAGE_SECTION_HEADER+1的结构,因为系统需要一个全0的IMAGE_SECTION_HEADER结构来标识已经结束.另外,XP最少要两个IMAGE_SECTION_HEADER结构,,不然会报非法32位程序的(这个熟悉的提示我在完成这个东西的时候不知道出现了NN次,从此深恶痛绝!),2K则没有这个限制(引自watercloud的研究,我没多少时间去深挖这个哈...).

下面就是具体的"数据节"的内容了(我们这篇文档整个PE文件就是一个节),整个PE文件结构内容大概就是这么多.


综上所述,"数据部分"对应框架的代码为:


代码

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 ....`..`........




[THIS IS JMP S1]

上一页 1 2 3 4 5 6 7 下一页

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