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头结构解析(代码实现)的更多相关文章

  1. RTP头结构解析

    RTP包头前12个固定字节机构图: 0                   1                   2                   3 0 1 2 3 4 5 6 7 8 9 ...

  2. PE头详细分析

    目录 PE头详细分析 0x00 前言 0x01 PE文件介绍 0x02 PE头详细分析 DOS头解析 NT头解析 标准PE头解析 可选PE头解析 可选PE头结构 基址 代码段地址 数据段地址 OEP程 ...

  3. 手写PE结构解析工具

    PE格式是 Windows下最常用的可执行文件格式,理解PE文件格式不仅可以了解操作系统的加载流程,还可以更好的理解操作系统对进程和内存相关的管理知识,而有些技术必须建立在了解PE文件格式的基础上,如 ...

  4. Win32汇编-编写PE结构解析工具

    汇编语言(assembly language)是一种用于电子计算机.微处理器.微控制器或其他可编程器件的低级语言,亦称为符号语言.在汇编语言中,用助记符(Mnemonics)代替机器指令的操作码,用地 ...

  5. pe头

    1.dos头 结构: struct _IMAGE_DOS_HEADER {     WORD e_magic;     WORD e_cblp;     WORD e_cp;     WORD e_c ...

  6. Windows Pe 第三章 PE头文件(中)

    这一章的上半部分大体介绍了下PE文件头,下半部分是详细介绍里面的内容,这一章一定要多读几遍,好好记记基础概念和知识,方便之后的学习. 简单回忆一下: 3.4  PE文件头部解析 3.4.1 DOS M ...

  7. PE知识复习之PE的各种头属性解析

    PE知识复习之PE的各种头属性解析 一丶DOS头结构体 typedef struct _IMAGE_DOS_HEADER { // DOS .EXE header WORD e_magic; // M ...

  8. 逆向-PE头解析

    目录 PE头解析 数据结构 IMAGE_DOS_HEADER IMAGE_NT_HEADERS 区块 PE头解析 PE 格式是Windows系统下组织可执行文件的格式.PE文件由文件头和对应的数据组成 ...

  9. PE头的应用---插入代码到EXE或DLL文件中

    三.代码实现(DELPHI版本),采用第三种方式实现代码插入. 1. 定义两个类,一个用来实现在内存中建立输入表:一个用来实现对PE头的代码插入. DelphiCode: const MAX_SECT ...

  10. PE格式文件的解析代码

    #include "Global.h" ; //标志,用于表示是否为pe32+文件 ; //标志,用于表示读入的模式,若为0代表是内存读入,不为0,代表是文件打开,此时mode是文 ...

随机推荐

  1. BOM与DOM之BOM操作

    目录 一:BOM与DOM操作 1.BOM与DOM操作 二:BOM操作 1.常用的Window方法: 2.案例实操 3.打开新窗口 4.关闭当前页面 三:window的子对象 1.navigator对象 ...

  2. windows简单使用Jenkins遇到的一些坑

    简言: 闲来没事干,最近身边的小伙伴都在谈论CI/CD.自动化等等,耳朵都磨出茧了.这不闲着研究下jenkins.下面将自己遇到的一些坑分享出来. 首先介绍下Jenkins.Jenkins 是一个基于 ...

  3. 链接脚本中 AT> 的作用

    缘由 这两天在梳理芯片的启动流程, 研究到了链接脚本(样本为stm32cube ide 中的 stm32f407 的 flash 链接脚本). 产生了一个疑问AT>是什么? 答案 AT>就 ...

  4. 使用浏览器inspect调试app

    使用浏览器inspect调试app 在开发混合项目的过程中,常常需要在app环境排查问题,接口可以使用fiddler等工具来抓包,但是js错误就不好抓包了,这里介绍一种调试工具-浏览器. 1.调试过程 ...

  5. YonBuilder移动开发平台功能大盘点

    YonBuilder是面向企业组织和个人开发者的低代码开发平台,实现无代码.低代码.专业代码开发三种模式.提供元数据驱动和画布构建两种开发方式,通过点击拖拽+自动化代码生成和移动多端编译的技术,与开放 ...

  6. BC4-牛牛学说话之-浮点数

    题目描述 会说整数之后,牛牛开始尝试浮点数(小数),输入一个浮点数,输出这个浮点数. 输入描述 输入一个浮点数 输出描述 输出一个浮点数,保留三位小数 示例 1 输入:1.359578 输出:1.36 ...

  7. C#/VB.NET 在Excel中添加水印

    在工作中,为了防止文件被随意复制和传播,通常我们会选择在文档中添加水印来对文件进行有效保护.文字水印是比较常见的一种保护手段,它可以有效防止文件被任意复制和随意打印传播.不过,Excel默认并没有水印 ...

  8. Docker 基础 - 3

    Web 服务器与应用 Nginx 我的Nginx Docker镜像 ## 设置继承自己创建的 sshd 镜像 FROM caseycui/ubuntu-sshd ## 维护者 LABEL mainta ...

  9. Lock锁-线程状态概述

    Lock锁 java.util.concurrent.locks.Lock机制提供了比synchronized代码块和synchronized方法更广泛的锁定操作,同步代码块/同步方法具有的功能Loc ...

  10. 【学习笔记】C++ 常量折叠原理和验证

    以下的代码很有意思,在相同时刻,相同的内存地址,数据居然会不一样. #include <iostream> int main(void) { const int const_val = 3 ...