gpt4 book ai didi

c - DOS 头表示为 C 数据结构

转载 作者:行者123 更新时间:2023-11-30 19:09:36 24 4
gpt4 key购买 nike

当我想知道pe文件的dos header 时。我在wikibook(X86_Disassemble/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* 中定义了一些变量;我搜索并得到这个结论:“VOID 和 CHAR 指针的大小在 16 位平台上为: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 header=64Byte。

在这个github项目(Sable/McCli/blob/master/CliKit/IO/PE/IMAGE_DOS_HEADER.cs)中,void*被ushort替换;

那么如何理解dos头中的void*大小?在16位、32位和64位平台上它总是2字节吗?

最佳答案

提供的 C 结构只是一个示例(应该在 wiki 上更新)。在 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)

关于c - DOS 头表示为 C 数据结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42944853/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com