PE头结构解析(代码实现)
PE头结构解析(代码实现)
图表实现在:https://www.cnblogs.com/juicyhumberger/articles/17064764.html
#include "stdafx.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
//#define F_PATH "C:\\cntflx\\ipmsg.exe"
int* OpenFile()
{
FILE* PointToFile = NULL;
int FileSize = 0;
int* StrBuffer = NULL;
int Num = 0;
//打开文件
if ((PointToFile = fopen("C:\\WINDOWS\\system32\\notepad.exe","rb")) == NULL) {
printf("打开文件失败!\n");
exit(1);
}
//获取文件大小
fseek(PointToFile,0,2);
FileSize = ftell(PointToFile);
//重定位指针
fseek(PointToFile,0,0);
//buffer指向申请的堆
StrBuffer = (int*)(malloc(FileSize));
if (!StrBuffer)
{
printf("堆空间分配失败!\n");
free(StrBuffer);
return 0;
}
//读取文件内容
Num = fread(StrBuffer,FileSize,1,PointToFile);
if (!Num)
{
printf("读取文件内容失败!\n");
free(StrBuffer);
return 0;
}
//关闭文件
fclose(PointToFile);
//将缓冲区内的文件内容的地址返回到调用函数的地方
return StrBuffer;
}
int* FileSizes = OpenFile();
int PrintfNtHeaders()
{
//文件指针
unsigned int* PointBuffer = (unsigned int*)FileSizes;
unsigned short* pBuffer = (unsigned short*)PointBuffer;
unsigned char* pcBuffer = (unsigned char*)PointBuffer;
//判断MZ和PE的标志
unsigned short Cmp1 = 0x5A4D;
unsigned int Cmp2 = 0x00004550;
//判断文件是否读取成功
if(!PointBuffer)
{
printf("文件读取失败!\n");
free(PointBuffer);
return 0;
}
//判断是否为MZ标志
if (*pBuffer != Cmp1)
{
printf("不是有效MZ标志!\n");
printf("%X\n",*pBuffer);
free(PointBuffer);
return 0;
}
printf("*********打印DOS头*********\n");
printf("e_magic:\t\t\t%X\n",*(pBuffer));
printf("e_ifanew:\t\t\t%08X\n\n\n",*(PointBuffer+15));
//判断是否为PE标志
if (*(PointBuffer+56) != Cmp2)
{
printf("不是有效的PE标志!\n");
printf("%X\n",*(PointBuffer+56));
free(PointBuffer);
return 0;
}
printf("*********打印标准PE文件头*********\n");
printf("PE标志:\t\t\t\t%X\n",*(PointBuffer+56));
printf("Machine:\t\t\t%04X\n",*(pBuffer+114));
printf("NumberOfSection:\t\t%04X\n",*(pBuffer+115));
printf("TimeDateStamp:\t\t\t%08X\n",*(PointBuffer+58));
printf("PointerToSymbolTable:\t\t%08X\n",*(PointBuffer+59));
printf("NumberOfSymbols:\t\t%08X\n",*(PointBuffer+60));
printf("SizeOfOptionalHeader:\t\t%04X\n",*(pBuffer+122));
printf("Chrarcteristics:\t\t%04X\n\n\n",*(pBuffer+123));
printf("*********打印标准可选PE头*********\n");
printf("Magic:\t\t\t\t%04X\n", *(pBuffer+124));
printf("MajorLinkerVersion:\t\t%02X\n", *(pcBuffer+250));
printf("MinorLinkerVersion:\t\t%02X\n", *(pcBuffer+251));
printf("SizeOfCode:\t\t\t%08X\n", *(PointBuffer+63));
printf("SizeOfInitializedData:\t\t%08X\n", *(PointBuffer+64));
printf("SizeOfUninitializedData:\t%08X\n", *(PointBuffer+65));
printf("AddressOfEntryPoint:\t\t%08X\n", *(PointBuffer+66));
printf("BaseOfCode:\t\t\t%08X\n", *(PointBuffer+67));
printf("BaseOfData:\t\t\t%08X\n", *(PointBuffer+68));
printf("ImageBase:\t\t\t%08X\n", *(PointBuffer+69));
printf("SectionAlignment:\t\t%08X\n", *(PointBuffer+70));
printf("FileAlignment:\t\t\t%08X\n", *(PointBuffer+71));
printf("MajorOperatingSystemVersion:\t%04X\n", *(pBuffer+144));
printf("MinorOperatingSystemVersion:\t%04X\n", *(pBuffer+145));
printf("MajorImageVersion:\t\t%04X\n", *(pBuffer+146));
printf("MinorImageVersion:\t\t%04X\n", *(pBuffer+147));
printf("MajorSubsystemVersion:\t\t%04X\n", *(pBuffer+148));
printf("MinorSubsystemVersion:\t\t%04X\n", *(pBuffer+149));
printf("Win32VersionValue:\t\t%08X\n", *(PointBuffer+75));
printf("SizeOfImage:\t\t\t%08X\n", *(PointBuffer+76));
printf("SizeOfHeaders:\t\t\t%08X\n", *(PointBuffer+77));
printf("CheckSum:\t\t\t%08X\n", *(PointBuffer+78));
printf("Subsystem:\t\t\t%04X\n", *(pBuffer+158));
printf("DllCharacteristics:\t\t%04X\n", *(pBuffer+159));
printf("SizeOfStackReserve:\t\t%08X\n", *(PointBuffer+80));
printf("SizeOfStackCommit:\t\t%08X\n", *(PointBuffer+81));
printf("SizeOfHeapReserve:\t\t%08X\n", *(PointBuffer+82));
printf("SizeOfHeapCommit:\t\t%08X\n", *(PointBuffer+83));
printf("LoaderFlags:\t\t\t%08X\n", *(PointBuffer+84));
printf("NumberOfRvaAndSizes:\t\t%08X\n\n\n", *(PointBuffer+85));
printf("*********打印PE节表成员信息*********\n");
/*
Name: 0x000001d8 [.text] [名称,长度:8位(16字节)的ASCII码.]
Misc: 0x000001e0 00007748 [V(VS),内存中大小(对齐前的长度).]
VirtualAddress: 0x000001e4 00001000 [V(VO),内存中偏移(该块的RVA).]
SizeOfRawData: 0x000001e8 00007800 [R(RS),文件中大小(对齐后的长度).]
PointerToRawData: 0x000001ec 00000400 [R(RO),文件中偏移.]
PointerToRelocation: 0x000001f0 00000000 [在OBJ文件中使用,重定位的偏移.]
PointerToLinenumbers: 0x000001f4 00000000 [行号表的偏移,提供调试.]
NumberOfRelocations: 0x000001f6 0000 [在OBJ文件中使用,重定位项数目.]
NumberOfLinenumbers: 0x000001f8 0000 [行号表中行号的数目.]
Characteristics: 0x000001fc 60000020 [标志(块属性):20000000h 40000000h 00000020h ]
*/
printf("*********打印PE节表[.text]成员信息*********\n");
printf("Name:\t\t\t\t0x%08X%08X\n", (*(PointBuffer+119)),(*(PointBuffer+118)));
printf("Misc:\t\t\t\t0x%08X\n", *(PointBuffer+120));
printf("VirtualAddress:\t\t\t0x%08X\n", *(PointBuffer+121));
printf("SizeOfRawData:\t\t\t0x%08X\n", *(PointBuffer+122));
printf("PointerToRawData:\t\t0x%08X\n", *(PointBuffer+123));
printf("PointerToRelocation:\t\t0x%08X\n", *(PointBuffer+124));
printf("PointerToLinenumbers:\t\t0x%08X\n", *(PointBuffer+125));
printf("NumberOfRelocations:\t\t0x%04X\n", *(pBuffer+251));
printf("NumberOfLinenumbers:\t\t0x%04X\n", *(pBuffer+252));
printf("Characteristics:\t\t0x%08X\n\n\n", *(PointBuffer+127));
printf("*********打印PE节表[.data]成员信息*********\n");
printf("Name:\t\t\t\t0x%08X%08X\n", (*(PointBuffer+129)),(*(PointBuffer+128)));
printf("Misc:\t\t\t\t0x%08X\n", *(PointBuffer+130));
printf("VirtualAddress:\t\t\t0x%08X\n", *(PointBuffer+131));
printf("SizeOfRawData:\t\t\t0x%08X\n", *(PointBuffer+132));
printf("PointerToRawData:\t\t0x%08X\n", *(PointBuffer+133));
printf("PointerToRelocation:\t\t0x%08X\n", *(PointBuffer+134));
printf("PointerToLinenumbers:\t\t0x%08X\n", *(PointBuffer+135));
printf("NumberOfRelocations:\t\t0x%04X\n", *(pBuffer+271));
printf("NumberOfLinenumbers:\t\t0x%04X\n", *(pBuffer+272));
printf("Characteristics:\t\t0x%08X\n\n\n", *(PointBuffer+137));
printf("*********打印PE节表[.rsrc]成员信息*********\n");
printf("Name:\t\t\t\t0x%08X%08X\n", (*(PointBuffer+139)),(*(PointBuffer+138)));
printf("Misc:\t\t\t\t0x%08X\n", *(PointBuffer+140));
printf("VirtualAddress:\t\t\t0x%08X\n", *(PointBuffer+141));
printf("SizeOfRawData:\t\t\t0x%08X\n", *(PointBuffer+142));
printf("PointerToRawData:\t\t0x%08X\n", *(PointBuffer+143));
printf("PointerToRelocation:\t\t0x%08X\n", *(PointBuffer+144));
printf("PointerToLinenumbers:\t\t0x%08X\n", *(PointBuffer+145));
printf("NumberOfRelocations:\t\t0x%04X\n", *(pBuffer+291));
printf("NumberOfLinenumbers:\t\t0x%04X\n", *(pBuffer+292));
printf("Characteristics:\t\t0x%08X\n\n\n", *(PointBuffer+147));
free(PointBuffer);
return 0;
}
int main()
{
PrintfNtHeaders();
OpenFile();
return 0;
}
PE头结构解析(代码实现)的更多相关文章
- RTP头结构解析
RTP包头前12个固定字节机构图: 0 1 2 3 0 1 2 3 4 5 6 7 8 9 ...
- PE头详细分析
目录 PE头详细分析 0x00 前言 0x01 PE文件介绍 0x02 PE头详细分析 DOS头解析 NT头解析 标准PE头解析 可选PE头解析 可选PE头结构 基址 代码段地址 数据段地址 OEP程 ...
- 手写PE结构解析工具
PE格式是 Windows下最常用的可执行文件格式,理解PE文件格式不仅可以了解操作系统的加载流程,还可以更好的理解操作系统对进程和内存相关的管理知识,而有些技术必须建立在了解PE文件格式的基础上,如 ...
- Win32汇编-编写PE结构解析工具
汇编语言(assembly language)是一种用于电子计算机.微处理器.微控制器或其他可编程器件的低级语言,亦称为符号语言.在汇编语言中,用助记符(Mnemonics)代替机器指令的操作码,用地 ...
- pe头
1.dos头 结构: struct _IMAGE_DOS_HEADER { WORD e_magic; WORD e_cblp; WORD e_cp; WORD e_c ...
- Windows Pe 第三章 PE头文件(中)
这一章的上半部分大体介绍了下PE文件头,下半部分是详细介绍里面的内容,这一章一定要多读几遍,好好记记基础概念和知识,方便之后的学习. 简单回忆一下: 3.4 PE文件头部解析 3.4.1 DOS M ...
- PE知识复习之PE的各种头属性解析
PE知识复习之PE的各种头属性解析 一丶DOS头结构体 typedef struct _IMAGE_DOS_HEADER { // DOS .EXE header WORD e_magic; // M ...
- 逆向-PE头解析
目录 PE头解析 数据结构 IMAGE_DOS_HEADER IMAGE_NT_HEADERS 区块 PE头解析 PE 格式是Windows系统下组织可执行文件的格式.PE文件由文件头和对应的数据组成 ...
- PE头的应用---插入代码到EXE或DLL文件中
三.代码实现(DELPHI版本),采用第三种方式实现代码插入. 1. 定义两个类,一个用来实现在内存中建立输入表:一个用来实现对PE头的代码插入. DelphiCode: const MAX_SECT ...
- PE格式文件的解析代码
#include "Global.h" ; //标志,用于表示是否为pe32+文件 ; //标志,用于表示读入的模式,若为0代表是内存读入,不为0,代表是文件打开,此时mode是文 ...
随机推荐
- BOM与DOM之BOM操作
目录 一:BOM与DOM操作 1.BOM与DOM操作 二:BOM操作 1.常用的Window方法: 2.案例实操 3.打开新窗口 4.关闭当前页面 三:window的子对象 1.navigator对象 ...
- windows简单使用Jenkins遇到的一些坑
简言: 闲来没事干,最近身边的小伙伴都在谈论CI/CD.自动化等等,耳朵都磨出茧了.这不闲着研究下jenkins.下面将自己遇到的一些坑分享出来. 首先介绍下Jenkins.Jenkins 是一个基于 ...
- 链接脚本中 AT> 的作用
缘由 这两天在梳理芯片的启动流程, 研究到了链接脚本(样本为stm32cube ide 中的 stm32f407 的 flash 链接脚本). 产生了一个疑问AT>是什么? 答案 AT>就 ...
- 使用浏览器inspect调试app
使用浏览器inspect调试app 在开发混合项目的过程中,常常需要在app环境排查问题,接口可以使用fiddler等工具来抓包,但是js错误就不好抓包了,这里介绍一种调试工具-浏览器. 1.调试过程 ...
- YonBuilder移动开发平台功能大盘点
YonBuilder是面向企业组织和个人开发者的低代码开发平台,实现无代码.低代码.专业代码开发三种模式.提供元数据驱动和画布构建两种开发方式,通过点击拖拽+自动化代码生成和移动多端编译的技术,与开放 ...
- BC4-牛牛学说话之-浮点数
题目描述 会说整数之后,牛牛开始尝试浮点数(小数),输入一个浮点数,输出这个浮点数. 输入描述 输入一个浮点数 输出描述 输出一个浮点数,保留三位小数 示例 1 输入:1.359578 输出:1.36 ...
- C#/VB.NET 在Excel中添加水印
在工作中,为了防止文件被随意复制和传播,通常我们会选择在文档中添加水印来对文件进行有效保护.文字水印是比较常见的一种保护手段,它可以有效防止文件被任意复制和随意打印传播.不过,Excel默认并没有水印 ...
- Docker 基础 - 3
Web 服务器与应用 Nginx 我的Nginx Docker镜像 ## 设置继承自己创建的 sshd 镜像 FROM caseycui/ubuntu-sshd ## 维护者 LABEL mainta ...
- Lock锁-线程状态概述
Lock锁 java.util.concurrent.locks.Lock机制提供了比synchronized代码块和synchronized方法更广泛的锁定操作,同步代码块/同步方法具有的功能Loc ...
- 【学习笔记】C++ 常量折叠原理和验证
以下的代码很有意思,在相同时刻,相同的内存地址,数据居然会不一样. #include <iostream> int main(void) { const int const_val = 3 ...