当我想知道pe文件的dos header.i在wikibook中得到这个(X86_Disassembly / Windows_Executable_Files):
Here is the DOS header presented as a C data structure:
struct DOS_Header
{
// short is 2 bytes, long is 4 bytes
char signature[2] = "MZ";
short lastsize;
short nblocks;
short nreloc;
short hdrsize;
short minalloc;
short maxalloc;
void *ss;
void *sp;
short checksum;
void *ip;
void *cs;
short relocpos;
short noverlay;
short reserved1[4];
short oem_id;
short oem_info;
short reserved2[10];
long e_lfanew;
}
在void *中有一些变量定义;我搜索并得出这个结论:" 16位平台上的VOID和CHAR指针的大小是:2字节,32位:4字节在64位:8个字节。 void指针和char指针的大小在C / C ++中都是相同的大小,但是,依赖于平台"
我也建立了一个win32程序test.exe使用C ++(picture)而void *是4byte;
并找出dos标题是:char + 25 * short + long + 4 * void * = 56 + 4 * void * = 72Byte;
但是用winhex(picture)打开它,DOS标头= 64Byte。
在这个github项目中(Sable / McCli / blob / master / CliKit / IO / PE / IMAGE_DOS_HEADER.cs),void *被ushort取代;
那么如何在dos标题中理解void * size?它在16bit,32bit和64bit平台上总是2byte?
答案 0 :(得分:0)
指针是内存的地址,它取决于(如你所说)架构。每个体系结构都能够处理特定数量的内存,为此,指针定义为给定的大小。
示例:
如何在dos标题中理解void * size?在16bit,32bit和64bit平台上它总是2byte吗?
你不能说。大部分时间都是,但没有任何力量。
在您的代码中,最终结构的大小会有所不同。
答案 1 :(得分:0)
提供的C结构只是一个例子(它应该在维基上更新)。在winnt.h
中有一个完整的定义。您会看到结构中没有指针,但它们是"初始大小"。定义是:
#pragma pack(push,2)
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;
#pragma pack(pop)