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

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

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


这里简单介绍一下PE文件格式的组成:

大致来分呢,PE格式文件可以分为这三个部分(就是上述框架中用"=="分割的三个部分):


引用

++++++++++++++++++++++++
+DOS信息部分 +
++++++++++++++++++++++++

++++++++++++++++++++++++
+PE信息部分 +
++++++++++++++++++++++++

++++++++++++++++++++++++
+数据部分 +
++++++++++++++++++++++++




下面来简单介绍每一部分的结构,首先的"DOS信息部分":


引用

+++++++++++++++++++++++++++++++++++++++++++++
+ +++++++++++++++++++++++++++++++++++++++ +
+ +[DOS文件头][0x40] + +
+ +++++++++++++++++++++++++++++++++++++++ +
+ + <==DOS信息部分
+ +++++++++++++++++++++++++++++++++++++++ +
+ +[DOS块][0x70,可变] + +
+ +++++++++++++++++++++++++++++++++++++++ +
+++++++++++++++++++++++++++++++++++++++++++++



这部分我觉得是最冗余的地方,首先DOS文件头的结构:


代码

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;



其中最重要的就是e_lfanew,它指向了下面的"PE信息部分"的起始地址(也就是俗称的PE头部).其他的是一些DOS下运行这个PE文件必须的结构,比如看注解就明白,什么代码初始化堆栈段,初始化堆栈指针,入口IP,CS等等,都是在WIN32上没有用的东西,我就不翻译拉,这些都是说DOS下的,如果这个PE文件一开始就打定在WINDOWS下运行,这些乱写都无所谓,你甚至可以把你的名字都写进去(.....一_一..).当然,你这么作后这个文件就不能在DOS下运行了..不然当机是几乎可以肯定的....(寒....).

需要记的除了e_lfanew是指向PE头的指针外还要记得这个DOS文件头结构长0x40,也就是64个字节.还有第一个参数e_magic,这个地方永远是"0x40 0x5a",也就是字符的"MZ".

DOS块部分保存的就是一段DOS下可以执行的代码,比如现在大多编译器就简单的输出一个"This program cannot be run in DOS mode"的字符串,和"DOS信息部分"一样,如果你不打算在DOS执行这个EXE文件,那么这里完全可以删除,为什么?因为WIN32的PE装载器只关心"DOS信息部分"的e_lfanew指向的而已.

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

代码

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 别帅的啦]...@...



可以看到最后的4个字节"40000000"也就是00000040H(下面如果直接在数值后加"H"的即表示为16进制)是指向他末尾的指针,也就是说明,我们把"DOS块"的部分给去掉了.

接下来是"PE信息部分",他的结构可以用下面的图来表示:


引用

+++++++++++++++++++++++++++++++++++++++++++++
+ +++++++++++++++++++++++++++++++++++++++ +
+ +[PE标志][0x04] + +
+ +++++++++++++++++++++++++++++++++++++++ +
+ + <==PE信息部分
+ +++++++++++++++++++++++++++++++++++++++ +
+ +[PE文件头][0x18] + +
+ +++++++++++++++++++++++++++++++++++++++ +
+ +
+ +++++++++++++++++++++++++++++++++++++++ +
+ +[自定义数据结构][0x0e] + +
+ +++++++++++++++++++++++++++++++++++++++ +
+++++++++++++++++++++++++++++++++++++++++++++



整个"PE信息部分"结构是这样的:


代码

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;



IMAGE_FILE_HEADER结构(PE文件头)和IMAGE_OPTIONAL_HEADER结构如下:


代码

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;



IMAGE_FILE_HEADER说明了PE文件的基本运行信息,可是光靠这短短的结构并不能满足我们的需要,毕竟微软设计的东西还是考虑的很周全的,于是在它下面跟上了一个长长的结构(OptionHeader结构)来作为附加信息供给系统.

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

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