【笔记】PE文件格式

0x01 PE加载情况

0x02 DOS头

typedef struct _IMAE_DOS_HEADER {        //DOS .EXE header                                    位置
    WORD e_magic;                        //Magic number;                                      0x00
    WORD e_cblp;                        //Bytes on last page of file                         0x02
    WORD e_cp;                          //Pages in file                                         0x04
    WORD e_crlc;                        //Relocations                                        0x06
    WORD e_cparhdr;                        //Size of header in paragraphs                       0x08
    WORD e_minalloc;                    //Minimum extra paragraphs needed                    0x0A
    WORD e_maxalloc;                    //Maximum extra paragraphs needed                    0x0C
    WORD e_ss;                          //Initial (relative) SS value                         0x0E
    WORD e_sp;                            //Initial SP value                                     0x10
    WORD e_csum;                        //Checksum                                             0x12
    WORD e_ip;                            //Initial IP value                                     0x14
    WORD e_cs;                            //Initial (relative) CS value                        0x16
    WORD e_lfarlc;                        //File address of relocation table                   0x18
    WORD e_ovno;                        //Overlay number                                     0x1A
    WORD e_res[4];                        //Reserved words                                     0x1C
    WORD e_oemid;                        //OEM identifier (for e_oeminfo)                     0x24
    WORD e_oeminfo;                        //OEM information; e_oemid specific                  0x26 
    WORD e_res2[10];                    //Reserved words                                     0x28
    LONG e_lfanew;                        //File address of new exe header                     0x3C
} IMAGE_DOS-HEADER, *PIMAGE_DOS_HEADER;

0x03 DOS存根

DOS存根(stub)在DOS头下方,是个可选项,且大小不固定(即使没有DOS存根,文件也能正常运行).DOS存根由代码与数据混合而成.

0x04 NT头

typedef struct _IMAGE_DOS_HEADER
{
    DWORD  Signature;                    //PE Signature : 50450000("PE"00)
    IMAGE_FILE_HEADER  FileHeader;                //文件头结构体
    IMAGE_ OPTIONAL_HEADER32  OptionalHeader;                //可选头结构体
} IMAGE_DOS_HEADER, *PIMAGE_DOS_HEADER32;

0x05 NT头:文件头

typedef struct _IMAGE_DOS_HEADER
{
    WORD  Machine;                //每个CPU都拥有唯一的machine码
    WORD  NumberOfSections;                //节区数量,当定义节区数与实际不同时会发生错误
    DWORD  TimeDateStamp;
    DWORD  PointerToSymbolTable;
    DWORD  NumberOfSymbols;
    WORD  SizeOfOptionalHeader;                //IMAGE_OPTIONAL_HEADER32结构体的大小,固定的
    WORD  Characteristics;                //文件属性,0x0002h为可执行文件,0x2000h为DLL文件
} IMAGE_DOS_HEADER, *PIMAGE_DOS_HEADER32;

0x06 NT头:可选头

typedef struct _IMAGE_OPTIONAL_HEADER {
WORD    Magic;            //标志字(32位时0x10Bh)
BYTE    MajorLinkerVersion;        //连接器版本号
BYTE    MinorLinkerVersion;        //
DWORD   SizeOfCode;            //代码段大小
DWORD   SizeOfInitializedData;    //已初始化数据块大小
DWORD   SizeOfUninitializedData;    //未初始化数据块大小
DWORD   AddressOfEntryPoint;     //EP的RVA值,程序最先执行代码的地址
DWORD   BaseOfCode;            //代码段起始RVA
DWORD   BaseOfData;            //数据段起始RVA
DWORD   ImageBase;            //PE文件的装载地址
DWORD   SectionAlignment;        //块对齐,节区在内存中最小单位
DWORD   FileAlignment;        //文件块对齐,节区在文件中的最小单位
WORD    MajorOperatingSystemVersion;//所需操作系统版本号
WORD    MinorOperatingSystemVersion;//
WORD    MajorImageVersion;        //用户自定义版本号
WORD    MinorImageVersion;        //
WORD    MajorSubsystemVersion;    //win32子系统版本。若PE文件是专门为Win32设计的
WORD    MinorSubsystemVersion;    //该子系统版本必定是4.0否则对话框不会有3维立体感
DWORD   Win32VersionValue;        //保留
DWORD   SizeOfImage;            //内存中整个PE映像体的尺寸
DWORD   SizeOfHeaders;        //所有头+节表的大小,即整个PE头的大小
DWORD   CheckSum;            //校验和
WORD    Subsystem;            //NT用来识别PE文件属于哪个子系统(系统驱动、GUI、CUI)
WORD    DllCharacteristics;        //
DWORD   SizeOfStackReserve;        //
DWORD   SizeOfStackCommit;        //
DWORD   SizeOfHeapReserve;        //
DWORD   SizeOfHeapCommit;        //
DWORD   LoaderFlags;            //
DWORD   NumberOfRvaAndSizes;    //指定DataDirectory数组的个数
IMAGE_DATA_DIRECTORY DataDirectory[IMAGE_NUMBEROF_DIRECTORY_ENTRIES];
//IMAGE_DATA_DIRECTORY 结构数组。每个结构给出一个重要数据结构的RVA,比如引入地址表等
} IMAGE_OPTIONAL_HEADER32, *PIMAGE_OPTIONAL_HEADER32;

0x07 节区头

#define IMAGE_SIZEOF_SHORT_NAME 8
typedef struct _IMAGE_SECTION_HEADER{ 
    BYTE Name[IMAGE_SIZEOF_SHORT_NAME]; // 8个字节的节区名称  
    union {  
        DWORD PhysicalAddress;         
        DWORD VirtualSize;            //内存中节区的尺寸  
    } Misc; 
    DWORD VirtualAddress;         // 内存中节区的起始地址(RVA)  
    DWORD SizeOfRawData;            // 磁盘中文件中节区所占大小
    DWORD PointerToRawData;        // 磁盘中文件的起始位置  
    DWORD PointerToRelocations;     // 在OBJ文件中使用,重定位的偏移  
    DWORD PointerToLinenumbers;   // 行号表的偏移(供调试使用地)  
    WORD NumberOfRelocations;      // 在OBJ文件中使用,重定位项数目  
    WORD NumberOfLinenumbers;    // 行号表中行号的数目  
    DWORD Characteristics;       // 节属性如可读,可写,可执行等  
} IMAGE_SECTION_HEADER, *PIMAGE_SECTION_HEADER;
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 200,527评论 5 470
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,314评论 2 377
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 147,535评论 0 332
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,006评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,961评论 5 360
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,220评论 1 277
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,664评论 3 392
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,351评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,481评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,397评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,443评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,123评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,713评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,801评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,010评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,494评论 2 346
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,075评论 2 341

推荐阅读更多精彩内容

  • 12.网络传输层过滤 #define IRP_MN_BUS_RESET 0x87 1394.h fltKernel...
    f675b1a02698阅读 1,606评论 0 0
  • title: vegadate: 2016-07-31 11:16tags: Kali渗透测试 Web渗透测试 0...
    曼路x_x阅读 3,846评论 0 2
  • 前言: 本文主要描述Android BLE的一些基础知识及相关操作流程,不牵扯具体的业务实现,其中提供了针对广播包...
    幻影宇寰阅读 5,299评论 6 19
  • 隐写篇 0x01. 通过进制转换隐藏信息 0x02. 在图片中隐藏压缩包(图种) 加密篇 0x03. 伪加密 0x...
    查无此人asdasd阅读 5,751评论 0 4
  • 我在小姑子的建龙保健品分公司,认识从天津来重庆垫江授课的刘教授。他是天津人民第二附属医院的退休老人,被天津建龙保健...
    吉英子阅读 779评论 0 2