首页 > 其他分享 >C语言解析PE文件结构

C语言解析PE文件结构

时间:2022-11-20 12:22:21浏览次数:41  
标签:Option buffer PE C语言 --- header file printf 解析

 1 void Funcation4()
 2 {
 3     char* file_buffer;
 4     long file_size = 0;
 5     FILE* fp;
 6     fp = fopen("notepad-32bit.exe", "rb");
 7     fseek(fp, 0, SEEK_END);
 8     file_size = ftell(fp);
 9     printf("文件大小为:%d字节\n", file_size);
10     //这里重新指向开头
11     rewind(fp);
12     //申请内存空间
13     file_buffer = (char*)malloc(file_size);
14     printf("file_buffer:%x\n", file_buffer);
15     //初始化内存空间
16     memset(file_buffer, 0, file_size);
17     //将文件读入内存中
18     fread(file_buffer, file_size, 1, fp);
19     //这里是用windows.h头文件,使用了Windows.h之后才有下面的内容,定义一个结构体指向那块内存
20     //这个就是DOS头获取的方式?
21     PIMAGE_DOS_HEADER Dos = (PIMAGE_DOS_HEADER)file_buffer;
22     printf("DOS:%x\n", Dos);
23     printf("********************DOS头********************\n");
24     printf("MZ标识---E_magic:%x\n", Dos->e_magic);
25     printf("PE偏移---e_lfarlc:%x\n", Dos->e_lfarlc);
26     //打印NT头内容
27     //判断是否是有效的PE文件
28     if (*((PDWORD)((DWORD)file_buffer + Dos->e_lfanew)) != IMAGE_NT_SIGNATURE)
29     {
30         printf("不是有效的PE标志\n");
31         free(file_buffer);
32         return;
33     }
34     //获取NT头位置,这句话主要解释下这里:file_buffer(DOS初始位置) + Dos->e_lfanew,file_buffer + Dos->e_lfanew就是NT开始位置
35     printf("********************NT头********************\n");
36     PIMAGE_NT_HEADERS Nt = (PIMAGE_NT_HEADERS)(file_buffer + Dos->e_lfanew);
37     printf("nt:%x\n", file_buffer + Dos->e_lfanew);
38     printf("nt--Signature:%x\n", Nt->Signature);
39     //nt指向fileheader
40     printf("nt--FileHeader:%x\n", Nt->FileHeader);
41     //nt指向OptionalHeader
42     printf("nt--OptionalHeader:%x\n", Nt->OptionalHeader);
43     //这里加4个字节越过nt--Signature,得到machine的位置
44     printf("********************File_header********************\n");
45     PIMAGE_FILE_HEADER File_header = (PIMAGE_FILE_HEADER)(file_buffer + Dos->e_lfanew + 4);
46     printf("File_header---Machine:%x\n", File_header->Machine);
47     printf("File_header---NumberOfSections:%x\n", File_header->NumberOfSections);
48     printf("File_header---TimeDateStamp:%x\n", File_header->TimeDateStamp);
49     printf("File_header---SizeOfOptionalHeader:%x\n", File_header->SizeOfOptionalHeader);
50     printf("File_header---Characteristics:%x\n", File_header->Characteristics);
51     //这里在fileheader 的基础上越过20个字节得到Option_header
52     printf("********************Option_header********************\n");
53     PIMAGE_OPTIONAL_HEADER Option_header = (PIMAGE_OPTIONAL_HEADER)(file_buffer + Dos->e_lfanew + 4 + 20);
54     printf("Option_header---Magic:%x\n", Option_header->Magic);
55     printf("Option_header---SizeOfCode:%x\n", Option_header->SizeOfCode);
56     printf("Option_header---SizeOfInitializedData:%x\n", Option_header->SizeOfInitializedData);
57     printf("Option_header---AddressOfEntryPoint:%x\n", Option_header->AddressOfEntryPoint);
58     printf("Option_header---BaseOfCode:%x\n", Option_header->BaseOfCode);
59     printf("Option_header---BaseOfData:%x\n", Option_header->BaseOfData);
60     printf("Option_header---ImageBase:%x\n", Option_header->ImageBase);
61     printf("Option_header---SectionAlignment:%x\n", Option_header->SectionAlignment);
62     printf("Option_header---FileAlignment:%x\n", Option_header->FileAlignment);
63     printf("Option_header---SizeOfHeaders:%x\n", Option_header->SizeOfHeaders);
64     printf("Option_header---CheckSum:%x\n", Option_header->CheckSum);
65     printf("Option_header---SizeOfStackReserve:%x\n", Option_header->SizeOfStackReserve);
66     printf("Option_header---SizeOfStackCommit:%x\n", Option_header->SizeOfStackCommit);
67     printf("Option_header---SizeOfHeapReserve:%x\n", Option_header->SizeOfHeapReserve);
68     printf("Option_header---SizeOfHeapCommit:%x\n", Option_header->SizeOfHeapCommit);
69     printf("Option_header---NumberOfRvaAndSizes:%x\n", Option_header->NumberOfRvaAndSizes);
70     free(file_buffer);
71 }
72 ///20221120获取pe文件结构
73 
74 int main(void)
75 {
76     Funcation4();
77     return 0;
78 }

 

标签:Option,buffer,PE,C语言,---,header,file,printf,解析
From: https://www.cnblogs.com/0x200/p/16908203.html

相关文章

  • 深入解析CSS读书笔记·第1、2章
    层叠、优先级和继承层叠及优先级CSS本质是在声明规则,而层叠是为了解决规则之间冲突,优先级解决冲突的工具。层叠优先级的判断顺序是:来源->选择器->顺序。来源指样式的来......
  • CentOS EPEL
    EPEL是ExtraPackagesforEnterpriseLinux(EPEL)repository的简称,是企业级Linux版本额外的软件库。对于Base版本的Linux,其自带的repository包含有限的软件,部分软件并不......
  • c++报错:[Error] 'cout' was not declared in this scope
    一、报错代码#include<iostream>intmain(){intx=10;cout<<x<<"\n";return0;} 二、解决方法在代码中加入:usingnamespacestd;正确代......
  • Python OpenCV给证件照换底色
    ✅作者简介:热爱科研的算法开发者,Python、Matlab项目可交流、沟通、学习。......
  • OpenWrt关闭IPv6
    IPv6可能会带来一些莫名其妙的问题,如果无IPv6的使用刚需(比如IPv6的DDNS),可将其关闭。网络→接口,在LAN口的右侧点击编辑。高级设置→IPv6分配长度,选择已禁用。DHCP服务器→IPv......
  • PipeCAD-布置管件
    PipeCAD-布置管件[email protected],三维管道设计软件,三维工厂设计软件,三维配管软件 目前PipeCAD管道建模功能已经可以使用,欢迎大家使用并反馈。感......
  • ASP.NET Core教程-Pipeline(请求管道)
    更新记录转载请注明出处:2022年11月20日发布。2022年11月16日从笔记迁移到博客。请求管道是什么类似于水的管道,有流进流出。在ASP.NETCore中Server进行监听用户的......
  • vba解析html页面
    vba解析html页面Subtest() 'vba解析html页面(字符串)Dimohtml,ohttp,table,byid,byname,byclassname,selectorall,selectorAsObject,sAsString......
  • 《Consequentialist Conditional Cooperation in Social Dilemmas with Imperfect Inf
    环境:Fishery:湖两岸有两个钓鱼人互相观察不到对方的动作,湖里有幼鱼和成熟鱼奖励分别为1和2,鱼游到对岸变成成熟鱼。合作方案即将幼鱼放给对岸,背叛即被诱惑吊幼鱼。PongPl......
  • Vue3 npm 命令解析
    我们使用npmrunxxx命令,在nodeMoudles里面,vite目录做了一个软链接,然后去软链接下面的目录去找,有3个vite的配置,适应不同的平台做的(unix、windows、mac等)流程:1、本地n......