1、PE 初识

1、PE 初识

概论

首先 PE头部分主要是学习PE结构的前半部分,每一个是做什么的,以及重点是什么,每一个是做什么用的。并使用Cpp代码来解析该PE头 注意这里用了一个Windows.h的头文件,后面再说。

PE是Windows系统

PE结构(Portable Executable),即可移植可执行文件格式,是Windows操作系统下的一种可执行文件格式。它定义了Windows操作系统中可执行文件(如EXE、DLL、SYS等)的结构和组织方式。PE结构的设计使得这些文件可以在不同的Windows平台上运行,因此得名“可移植”。

这个是比较官方的,其实说白了,就是Windows的可执行程序,

这里说一下可执行文件不仅仅只有exe,dll sys也是哈。这个没啥好说的,网上一堆给你说什么是可执行程序的,又是各种概念我觉得没啥必要学

这里直接开始吧,先说一下PE学了有啥用,说白了就是能更牛逼,能让你准确定位到全局变量到地址,因为全局变量一般都是编译到时候就确定了地址了,所以这里就非常有用了。

对于PE我学的是一个收费到课程,当然网上有很多免费到。可以学一下 比如滴水三期,海哥讲的,这个是都非常推荐到。

我们 先打开一个Pe文件看一下吧。

image

请仔细观察我所标记的。首先0x5A4d(小端存储),是MZ标记,MZ是一个牛逼大佬的名字,其他的没必要知道,这也是判断PE文件的一个标记,如果前两个字节没问题的话,我们就直接去0x3C的位置去找一个四字节数据, 这个是NT头的首地址,也就是PE标记,如果这个没问题的话,就说明这是一个PE文件了。

补充一些基础

首先就是如何打开文件并把文件写入到内存中去。这里直接贴代码吧 就不自己写了。

	FILE* pFile = fopen(FILE_PATH, "rb");if (!pFile){log_error("open file faild!");return NULL;}log_info("open file success!");// 获取文件大小fseek(pFile,0, SEEK_END);size_t nFileSize = ftell(pFile);fseek(pFile, 0, SEEK_SET);PCHAR buff = calloc(1, nFileSize);if (NULL == buff){log_error("calloc faild");fclose(pFile);return NULL;}size_t s = fread(buff, nFileSize, 1, pFile);if (s <= 0){log_error("read file error!");fclose(pFile);return NULL;}fclose(pFile);return buff;

这个代码是我写的不保证一定对,但是可以看看

日志文件推荐:https://github.com/rxi/log.c

其次就是结构体指针那一块了,我很久之前写过,这里我就不写了

IMAGE_NT_HEAD

首先IMAGE_NT_HEAD 是一个结构体,定义如下

typedef struct _IMAGE_NT_HEADERS {DWORD Signature; 							// PE标记 0x0000 4550IMAGE_FILE_HEADER FileHeader;IMAGE_OPTIONAL_HEADER32 OptionalHeader;		// 标准PE头 大小固定位0x14个字节
} IMAGE_NT_HEADERS32, *PIMAGE_NT_HEADERS32;		// 扩展PE头 32位大小默认位0xE0typedef struct _IMAGE_NT_HEADERS64 {DWORD Signature;IMAGE_FILE_HEADER FileHeader;				// 标准PE头 大小固定位0x14个字节IMAGE_OPTIONAL_HEADER64 OptionalHeader;		// 扩展PE头 32位大小默认位0xF0
} IMAGE_NT_HEADERS64, *PIMAGE_NT_HEADERS64;

这里要注意。32位与64位大小不一致。后面深入解析就可以知道了。下面我们继续说。介绍每一项的功能

Signature: PE文件标记,如果该值为0x4050,如果不是该值程序将无法启动

FileHeader :标准PE头 指向 IMAGE_FILE_HEADER 结构体

OptionalHeader: 扩展PE头 指向 IMAGE_OPTIONAL_HEADER32/IMAGE_OPTIONAL_HEADER64结构体

其中标准PE头与扩展PE头在看到这里的时候无需深究。说到这里。其实我们就有了一个大概的印象

当我们把一个二进制文件,使用16位进行读取时。我们首先要查看前两个字节,必须是4D5A如果不是则该文件不是PE。如果是的话 就看3C位置,3C位置指向一个地址,我们直接去到该地址,改地址的值是一个0x4550则说明是一个PE文件代码如下。

BOOL CheckPeFile(PCHAR fileBuff)
{PIMAGE_DOS_HEADER pImgDosBuf = (PIMAGE_DOS_HEADER)fileBuff;if ((WORD)pImgDosBuf->e_magic != IMAGE_DOS_SIGNATURE){return FALSE;}DWORD dwOffset = pImgDosBuf->e_lfanew;PIMAGE_NT_HEADERS pImgNtHead = (PIMAGE_NT_HEADERS)(fileBuff + dwOffset);if (pImgNtHead->Signature != IMAGE_NT_SIGNATURE){return FALSE;}return TRUE;
}

代码中用到了两个宏分别位 IMAGE_DOS_SIGNATURE 和 IMAGE_NT_SIGNATURE

他们的意思我们可以看一下

#define IMAGE_DOS_SIGNATURE                 0x5A4D      // MZ
#define IMAGE_OS2_SIGNATURE                 0x454E      // NE
#define IMAGE_OS2_SIGNATURE_LE              0x454C      // LE
#define IMAGE_VXD_SIGNATURE                 0x454C      // LE
#define IMAGE_NT_SIGNATURE                  0x00004550  // PE00

其实就是几个十六进制的数。这里就不说了。

这里要注意一点,先解引用再转换和先转换再解引用的结果不一致,原因这里就不提了,如果不知道的话记得回去复习一下。这里再提一嘴,我再从Cpplinux服务器开发的代码习惯转变为Win32的开发上来,所以代码可能不规范别介意。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/855559.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

交换空间swap

交换空间: 交换空间是硬盘上的一部分,被用作虚拟内存,当系统的物理内存(RAM)不足时,系统会使用交换空间来存储暂时不用的数据。1.关闭交换空间 1)关闭所有交换空间 swapoff -a2)关闭特定的交换空间 swapoff /dev/sdb12.开启交换空间 1)开启所有交换空间 swapon -a2…

2024 IDEA 2024.3 安装使用教程(附激活至2099年,以及常见问题处理)

IntelliJ IDEA简介 IntelliJ IDEA是一款非常强大的Java集成开发环境(IDE),由JetBrains公司开发。它提供了丰富的功能和工具,帮助开发者更高效地编写、调试和部署代码。 下面这种方式仅供交流学习,如果有能力还请支持正版 下载安装 下载 IDEA 2024.3 版本的安装包 为了方便,也…

第十六次作业

1、通过华为云沃土云创计划免费薅云服务器 打开链接:https://developer.huaweicloud.com/programs/dev-program.html 使能⽅向选择个⼈在这个 计划权益中申请优惠券免费购买成功2、复现windows、linux权限维持技巧 windows权限维持: 隐藏⽂件:利⽤⽂件属性 ⽂件右键属性,勾…

OpenCL 编程步骤 2. 获取设备

clGetDeviceIDs 查询支持OpenCL设备列表: cl_int clGetDeviceIDs(cl_platform_id platform ,cl_device_type device_type ,cl_uint num_entries ,cl_device_id *devices ,cl_uint *num_devices )与clGetPlatformIDs函数类似,第一次调用时,devic…

记录一下:小华半导体HC32F448建立MDK工程

1.先到官网上下载文件 a>下载驱动库:HC32F448_DDL_Rev1.1.0.zip 驱动库中是包括了例程的。 b>下载样例:HC32F448_Template_Rev1.0.1.zip 可以直接复制官方的样例,就不用自己创建工程了。 c>下载芯片支持包:HC32F448_IDE_Rev1.0.1.zip 下载后双击安装即可。否则KEI…

4大应用场景揭秘:AI视频监控在养老院中的智能化管理与安全保障

随着人口老龄化的加剧,养老院的管理面临着越来越多的挑战。传统的人工巡查方式不仅难以做到全天候监控,而且存在响应迟缓、效率低下等问题。为了解决这些问题,思通数科推出的AI视频监控系统,利用人工智能技术提供了一种高效、智能化的解决方案。尤其在养老院的老人体征监控…

考勤管理系统

实现对用户信息的添加,查看,删除 实现对部门信息的添加,查看 实现用户登录功能,修改密码功能。 页面与之前的大相径庭。 还是一样的框架总体感觉换汤不换药,目前就是熟练度问题

浏览器怎么渲染数据的

突然发现自己对于css的样式规则一直都没有完全明白,今天写文好好整明白 浏览器渲染原理 1. 浏览器向服务器请求html文件 2. html文件返回浏览器 3. 浏览器解读html文件<!DOCTYPE html>//告诉浏览器,这是html5文件// html树<html lang="en">//语言<h…

在宝塔里添加反向代理

安装OnlyOffice时,需要配置反向代理; 完成以上操作之后,访问时有可能出现504报错,也可能就可以正常访问了。如果报错可以修改上图反向代理中的目标URL的内容将域名改成127.0.0.1。我当时改成http://127.0.0.1:9633就可以了本文来自博客园,作者:飞龙在生,转载请注明原文链…

2024 Clion安装使用教程(附激活以及常见问题处理)

第一步:下载Clion安装包 访问Clion官网,下载Clion第二步: 安装 Clion下载完成后,进行安装,next,安装完成点击xx 关掉程序! 第三步: 下载补丁 Clion补丁文件 点击获取补丁下载成功后,打开标注的文件文件夹 , 进入到文件夹 /jetbra 注意: 这个文件夹单独copy一份,所属文…

语言沟通中的设计实现

系统设计的目的是更好的支持需求 我们常说,只要业务能将你的需求描述清楚,能自圆其说,我们就有办法实现。 这其实是系统设计的最理想的状态, 如果业务没想清楚,那么在系统实现中,一定会把问题暴露出来。很多时候,问题的暴露源于没有考虑周全亦或都没有考虑这种场景! 比…