[滴水逆向]03-12 pe头字段说明课后作业,输出pe结构

#include <iostream>
#include <windows.h>
using namespace std;
#pragma warning(disable:4996)
//DOC结构
typedef struct _DOC_HEADER
{WORD  e_magic;WORD  e_cblp;WORD  e_cp;WORD  e_crlc;WORD  e_cparhar;WORD  e_minalloc;WORD  e_maxalloc;WORD  e_ss;WORD  e_sp;WORD  e_csum;WORD  e_ip;WORD  e_cs;WORD  e_lfarlc;WORD  e_ovno;WORD  e_res[4];WORD  e_oemid;WORD  e_oeminfo;WORD  e_res2[10];DWORD e_lfanew;
}PeDoc;
//FILE结构
typedef struct _STANDARD_PE_HEADER
{WORD Machine;WORD NumberOfSections;DWORD TimeDateStamp;DWORD PointerToSymbolTable;DWORD NumberOfSymbols;WORD SizeOfOptionalHeader;WORD Characteristics;
}StandardPeHeader;
//OPTIONAL结构
typedef struct _OPTIONAL_PE_HEADER
{WORD Magic;BYTE MajorLinkerVersion;BYTE MinorLinkerVersion;DWORD SizeOfCode;DWORD SizeOfInitializedData;DWORD SizeOfUninitializedData;DWORD AddressOfEntryPoint;DWORD BaseOfCode;DWORD BaseOfData;DWORD ImageBase;DWORD SectionAlignment;DWORD FileAlignment;WORD MajorOperatingSystemVersion;WORD MinorOperatingSystemVersion;WORD MajorImageVersion;WORD MinorImageVersion;WORD MajorSubsystemVersion;WORD MinorSubsystemVersion;DWORD Win32VersionValue;DWORD SizeOfImage;DWORD SizeOfHeaders;DWORD CheckSum;WORD Subsystem;WORD DllCharacteristics;DWORD SizeOfStackReserve;DWORD SizeOfStackCommit;DWORD SizeOfHeapReserve;DWORD SizeOfHeapCommit;DWORD LoaderFlags;DWORD NumberOfRvaAndSizes;
}OptionalPeHeader;//输出doc数据
void printDoc(PeDoc* doc)
{printf(">>>> DOC <<<<\n");printf("e_magic    = %x\n", doc->e_magic);printf("e_cblp     = %x\n", doc->e_cblp);printf("e_cp       = %x\n", doc->e_cp);printf("e_crlc     = %x\n", doc->e_crlc);printf("e_cparhar  = %x\n", doc->e_cparhar);printf("e_minalloc = %x\n", doc->e_minalloc);printf("e_maxalloc = %x\n", doc->e_maxalloc);printf("e_ss       = %x\n", doc->e_ss);printf("e_sp       = %x\n", doc->e_ss);printf("e_csum     = %x\n", doc->e_csum);printf("e_ip       = %x\n", doc->e_ip);printf("e_cs       = %x\n", doc->e_cs);printf("e_lfarlc   = %x\n", doc->e_lfarlc);printf("e_ovno     = %x\n", doc->e_ovno);printf("e_res      = %x%x%x%x\n", doc->e_res[0], doc->e_res[1], doc->e_res[2], doc->e_res[3]);printf("e_oemid    = %x\n", doc->e_oemid);printf("e_oeminfo  = %x\n", doc->e_oeminfo);printf("e_res2[10] = %x%x%x%x%x%x%x%x%x%x\n", doc->e_res2[0], doc->e_res2[1], doc->e_res2[2], doc->e_res2[3], doc->e_res2[4], doc->e_res2[5], doc->e_res2[6], doc->e_res2[7], doc->e_res2[8], doc->e_res2[9]);printf("e_lfanew   = %x\n", doc->e_lfanew);printf(">>>> DOC <<<<\n\n\n");
}
//输出file数据
void printStandar(StandardPeHeader* standard)
{printf(">>>> STANDARD <<<<\n");printf("Machine               = %x\n", standard->Machine);printf("NumberOfSections      = %x\n", standard->NumberOfSections);printf("TimeDateStamp         = %x\n", standard->TimeDateStamp);printf("PointerToSymbolTable  = %x\n", standard->PointerToSymbolTable);printf("NumberOfSymbols	      = %x\n", standard->NumberOfSymbols);printf("SizeOfOptionalHeader  = %x\n", standard->SizeOfOptionalHeader);printf("Characteristics       = %x\n", standard->Characteristics);printf(">>>> STANDARD <<<<\n\n\n");
}
//输出optional数据
void printOptional(OptionalPeHeader* optional)
{printf(">>>> OPTIONAL <<<<\n");printf("Magic                       = %x\n", optional->Magic);printf("MajorLinkerVersion          = %x\n", optional->MajorLinkerVersion);printf("MinorLinkerVersion          = %x\n", optional->MinorLinkerVersion);printf("SizeOfCode                  = %x\n", optional->SizeOfCode);printf("SizeOfInitializedData       = %x\n", optional->SizeOfInitializedData);printf("SizeOfUninitializedData     = %x\n", optional->SizeOfUninitializedData);printf("AddressOfEntryPoint         = %x\n", optional->AddressOfEntryPoint);printf("BaseOfCode                  = %x\n", optional->BaseOfCode);printf("BaseOfData                  = %x\n", optional->BaseOfData);printf("ImageBase                   = %x\n", optional->ImageBase);printf("SectionAlignment            = %x\n", optional->SectionAlignment);printf("FileAlignment               = %x\n", optional->FileAlignment);printf("MajorOperatingSystemVersion = %x\n", optional->MajorOperatingSystemVersion);printf("MinorOperatingSystemVersion = %x\n", optional->MinorOperatingSystemVersion);printf("MajorImageVersion           = %x\n", optional->MajorImageVersion);printf("MinorImageVersion           = %x\n", optional->MinorImageVersion);printf("MajorSubsystemVersion	    = %x\n", optional->MajorSubsystemVersion);printf("MinorSubsystemVersion	    = %x\n", optional->MinorSubsystemVersion);printf("Win32VersionValue           = %x\n", optional->Win32VersionValue);printf("SizeOfImage                 = %x\n", optional->SizeOfImage);printf("SizeOfHeaders               = %x\n", optional->SizeOfHeaders);printf("CheckSum                    = %x\n", optional->CheckSum);printf("Subsystem                   = %x\n", optional->Subsystem);printf("DllCharacteristics          = %x\n", optional->DllCharacteristics);printf("SizeOfStackReserve          = %x\n", optional->SizeOfStackReserve);printf("SizeOfStackCommit           = %x\n", optional->SizeOfStackCommit);printf("SizeOfHeapReserve           = %x\n", optional->SizeOfHeapReserve);printf("SizeOfHeapCommit            = %x\n", optional->SizeOfHeapCommit);printf("LoaderFlags                 = %x\n", optional->LoaderFlags);printf("NumberOfRvaAndSizes         = %x\n", optional->NumberOfRvaAndSizes);printf(">>>> OPTIONAL <<<<\n\n\n");
}char* ReadPeFile(const char* peFIle)
{FILE* peFile = fopen(peFIle, "rb");  //pe文件对象unsigned int peSize = 0;  //pe文件大小char* peData = nullptr;   //指向pe的二进制数据if (peFile == NULL){cout << "文件打开失败" << endl;goto END;}if (fseek(peFile, 0, SEEK_END) != 0){cout << "指针移动失败" << endl;goto END;}peSize = ftell(peFile);if (peSize == 0){cout << "程序没有任何数据" << endl;goto END;}if (fseek(peFile, 0, SEEK_SET) != 0){printf("指针移动失败!(%d)\n", __LINE__);goto END;}//根据PE文件的大小开辟内存存放PE数据peData = (char*)malloc(peSize);if (peData != NULL){memset(peData, '0', peSize);//读取pe数据fread(peData, sizeof(char), peSize, peFile);}END:if (peFile){fclose(peFile);}return peData;}void ReadPeData(char* peData, PeDoc*& doc, StandardPeHeader*& standard, OptionalPeHeader*& optional)
{doc = (PeDoc*)peData;peData = &peData[doc->e_lfanew + 4];standard = (StandardPeHeader*)peData;peData = &peData[20];optional = (OptionalPeHeader*)peData;
}void printPeHeaderInfo(const char* peFile)
{char* peData = ReadPeFile(peFile);PeDoc* doc = { NULL };StandardPeHeader* peStandard = { NULL };OptionalPeHeader* peOptional = { NULL };ReadPeData(peData, doc, peStandard, peOptional);printDoc(doc);printStandar(peStandard);printOptional(peOptional);free(peData);
}int main()
{printPeHeaderInfo("Afkayas.1.Exe");getchar();return 0;
}

有个问题,因为我认为前面一个已经判断指针移动失败了,于是我把第二个注释了,发现少了第二个fseek就会输出错误的答案

正在解决。。。。

喵的,解决了

fseek : 重新设置文件内部指针的位置 ;

#include <stdio.h>
int fseek(FILE *stream, long offset, int fromwhere);

设置的指针的位置是 起始位置 + 偏移量 ;

其中的 int fromwhere 参数就是 起始位置 , 有以下三种选择 :

  • 文件头 SEEK_SET 0

  • 当前位置 SEEK_CUR 1

  • 文件尾 SEEK_END 2

long offset 偏移量参数 , 可以为正数 , 也可以为负数 ;

如果执行成功 , 则返回 0 , 失败返回非 0 , 并设置 error 错误代码 ;

所以重点来了:用完ftell()这个函数,就会将文件内部指针的位置移动到最末尾(如果设置的是SEEK_END),所以需要重新使用一下fseek重新设置文件内部指针的一个位置

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

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

相关文章

CentOS 7下载安装MySQL 5.7以及连接虚拟机CentOS 7数据库教程

## CentOS 7下载安装MySQL 5.7以及连接虚拟机CentOS 7数据库教程 文章目录 ## [CentOS 7下载安装MySQL 5.7以及连接虚拟机CentOS 7数据库教程](https://my.oschina.net/u/3986411/blog/4714780) 通过如下命令查看mariadb的安装包 rpm -qa | grep mariadb通过如下命令卸载mariad…

Java基础简单整理

文章目录 Java语言具有以下特点&#xff1a;Java SE vs Java EEJVM vs JDK vs JRE为什么说 Java 语言编译与解释并存&#xff1f;Java 和 C 的区别?Java注释用法&#xff1a;Java标识符Java基本数据类型链接Java字符串类型链接基本类型和包装类型的区别&#xff1f;静态方法为…

可以动态改变刻度背景色的车速仪表盘

最近做的项目的主页面需要用到一个仪表盘来动态显示车速&#xff0c;同时改变对应的背景色 仪表盘 开始是想着使用echarts&#xff0c;修修改改拿来用&#xff0c;但是人家客户有规定&#xff0c;必须搞个差不多的&#xff0c;那没办法&#xff0c;自 己动手搞个吧 截图如下&am…

SDI-12协议与STM32 进行uart通信

场景是用stm32与一款温湿度传感器通信&#xff0c;不过是基于SDI-12协议&#xff0c;SDI-12时序和UART类似&#xff0c;故采用UART传输&#xff0c;原理图如下 其中DIR_OUT_SDI是一个IO引脚&#xff0c;控制UART_TX_SDI是否使能&#xff0c;U10是三态门IC&#xff0c;即拉低DIR…

AI文章,AI文章生成工具

在互联网时代&#xff0c;随着信息爆炸式增长&#xff0c;文章的需求愈发旺盛。从博客、新闻、社交媒体到企业宣传&#xff0c;文字作为传达信息、吸引受众的工具变得愈发重要。但问题是&#xff0c;对于很多人来说&#xff0c;创作一篇高质量的文章并不容易。时间、创意、写作…

【c语言的函数指针介绍】

C语言中的函数指针是一种特殊的指针&#xff0c;它指向函数而不是数据。函数指针允许你在运行时动态地选择要调用的函数&#xff0c;这使得你可以根据需要在不同的函数之间切换&#xff0c;或者将函数作为参数传递给其他函数。函数指针的声明和使用如下&#xff1a; 声明函数指…

Tomcat多实例、负载均衡、动静分离

Tomcat多实例部署 安装jdk [rootlocalhost ~]#systemctl stop firewalld.service [rootlocalhost ~]#setenforce 0 [rootlocalhost ~]#cd /opt [rootlocalhost opt]#ls apache-tomcat-8.5.16.tar.gz jdk-8u91-linux-x64.tar.gz rh [rootlocalhost opt]#tar xf jdk-8u91-linu…

荣耀时刻!2023抖音电商作者峰会为优质直播间和卓越生态伙伴颁奖

9月27日&#xff0c;抖音电商在上海举行了以“向新成长”为主题的2023抖音电商作者峰会&#xff0c;并现场颁发了荣誉奖项。抖音电商优质直播间以及践行抖音电商作者精神四个维度的年度荣誉一一揭晓。 过去一年&#xff0c;数百万作者与众多品牌商家、MCN机构和精选联盟服务商…

打造卓越摄影作品,尽享专业级编辑体验——DxO PhotoLab 7 for Mac

DxO PhotoLab 7 for Mac 是一款功能强大的专业照片编辑软件&#xff0c;为摄影爱好者和专业摄影师提供了优秀的工具和功能&#xff0c;让您能够轻松打造卓越的摄影作品并实现专业级的编辑效果。 DxO PhotoLab 7 提供了一套先进的图像处理算法&#xff0c;能够准确地还原照片的…

ORACLE 在内存管理机制上的演变和进化

截止目前&#xff0c;计算机内存仍然被认为是我们可以获得的最快速度的物理存储设备。 将频繁访问的数据尽可能地置于内存中&#xff0c;已成为当前各种软件和应用程序提高数据访问性能&#xff0c;减少访问延迟的最为有效的途径。 然而&#xff0c;内存作为关键的计算资源&am…

K8S-存储卷,pv,pvc

pv&#xff0c;pvc 一、emptyDir存储卷1.概述2.示例 二、hostPath存储卷1.概述 三、nfs共享存储卷1.在stor01节点上安装nfs&#xff0c;并配置nfs服务2.master节点操作3.在nfs服务器上创建index.html4.master节点操作 四、PVC 和 PV1.概述2.PV和PVC之间的相互作用遵循的生命周期…

基于Java的传统文化宣传平台设计与实现(源码+lw+部署文档+讲解等)

文章目录 前言具体实现截图论文参考详细视频演示为什么选择我自己的网站自己的小程序&#xff08;小蔡coding&#xff09;有保障的售后福利 代码参考源码获取 前言 &#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计划导师、全栈领域优质创作…

python接口自动化(一)--什么是接口、接口优势、类型(详解)

简介 经常听别人说接口测试&#xff0c;接口测试自动化&#xff0c;但是你对接口&#xff0c;有多少了解和认识&#xff0c;知道什么是接口吗&#xff1f;它是用来做什么的&#xff0c;测试时候要注意什么&#xff1f;坦白的说&#xff0c;笔者之前也不是很清楚。接下来先看一…

Ci2451-2.4g无线MCU收发芯片

Ci2451 是一款集成无线收发器和8位RISC(精简指令集)MCU的SOC芯片。 无线MCU解决方案,集成丰富的MCU资源、更小尺寸,来满足设计中的各种内存、功率、尺寸要求,充分缩短2.4GHz无线产品设计周期并优化产品成本。 添加图片注释&#xff0c;不超过 140 字&#xff08;可选&#xff…

005:根据股票代码和起始日期获取K线数据

我们改进《001》中的部分&#xff0c;因为他他没法在可视化界面输入信息&#xff0c;这样太麻烦。我们设法在可视化界面输入股票代码和起始日期&#xff0c;这样可以灵活得多。这部分&#xff0c;我们仍旧只获取日K线的数据。 import tkinter as tk from tkinter import messa…

Spring Cloud Gateway实战WebFlux解析请求体及抛出指定错误代码和信息

概述 基于Spring Cloud开发微服务时&#xff0c;使用Spring Cloud原生自带的Gateway作为网关&#xff0c;所有请求都需要经过网关服务转发。 为了防止恶意请求刷取数据&#xff0c;对于业务请求需要进行拦截&#xff0c;故而可在网关服务增加拦截过滤器。基于此&#xff0c;有…

【C语言】快速排序

文章目录 一、hoare版本二、挖坑法三、前后指针法四、非递归快排五、快速排序优化1、三数取中选key值2、小区间优化 六、代码测试 一、hoare版本 快速排序是Hoare于1962年提出的一种二叉树结构的交换排序方法&#xff0c;其基本思想为&#xff1a;任取待排序元素序列中的某元素…

蓝桥杯每日一题2023.9.27

4408. 李白打酒加强版 - AcWing题库 题目描述 题目分析 对于这题我们发现有三个变量&#xff0c;店&#xff0c;花&#xff0c;酒的数量&#xff0c;对于这种范围我们使用DP来进行分析。 dp[i][j][k]我们表示有i个店&#xff0c;j朵花&#xff0c;k单位酒的集合&#xff0c…

Databend 源码阅读:配置管理

作者&#xff1a;尚卓燃&#xff08;PsiACE&#xff09;澳门科技大学在读硕士&#xff0c;Databend 研发工程师实习生 Apache OpenDAL(Incubating) Committer https://github.com/PsiACE 对于 Databend 这样复杂的数据库服务端程序&#xff0c;往往需要支持大量的可配置选项&am…

PTA程序辅助实验平台——2023年软件设计综合实践_3(分支与循环)

第一题&#xff1a;7-1 印第安男孩 - C/C 分支与循环 朵拉编程的时候也想顺便练习英语。她编程从键盘读入一个整数n&#xff0c;如果n值为0或者1&#xff0c;向屏幕输出“0 indian boy.”或“1 indian boy.”&#xff1b;如果n大于1&#xff0c;比如9&#xff0c;则输出“9 in…