[滴水逆向]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.xdnf.cn/news/143861.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

RHCE---Web 服务器

文章目录 目录 文章目录 前言 一.Web服务器概述 网址及HTTP协议概述&#xff1a; HTTP协议请求过程&#xff1a; 二.搭建动态HTTP网页 动态网页概述&#xff1a; 搭建动态的HTTP协议网页&#xff1a; 总结 前言 通过上一个章节的学习了解了时间服务器以及远程连接服务器&a…

C++中实现雪花算法来在秒级以及毫秒及时间内生成唯一id

1、雪花算法原理 雪花算法&#xff08;Snowflake Algorithm&#xff09;是一种用于生成唯一ID的算法&#xff0c;通常用于分布式系统中&#xff0c;以确保生成的ID在整个分布式系统中具有唯一性。它的名称来源于雪花的形状&#xff0c;因为生成的ID通常是64位的整数&#xff0…

Prometheus-Rules 实战

文章目录 1 node rules2 nginx rule2.1 Nginx 4xx 错误率太多2.2 Nginx 5xx 错误率太多2.3 Nginx 延迟高 3 mysql rule3.1 MySQL 宕机3.2 实例连接数过多3.3 MySQL高线程运行3.4 MySQL 从服务器 IO 线程没有运行3.5 MySQL 从服务器 SQL 线程没有运行3.6 MySQL复制滞后3.7 慢查询…

作为SiteGPT替代品,HelpLook的优势是什么?

在当今快节奏的数字化世界中&#xff0c;企业不断寻求创新方式来简化运营并增强客户体验。由于聊天机器人能够自动化任务、提供快速响应并提供个性化互动&#xff0c;它们在业务运营中的使用变得非常重要。因此&#xff0c;企业越来越意识到像SiteGPT和HelpLook这样高效的聊天机…

I/O

IO 流简介 IO 即 Input/Output&#xff0c;输入和输出。数据输入到计算机内存的过程即输入&#xff0c;反之输出到外部存储&#xff08;比如数据库&#xff0c;文件&#xff0c;远程主机&#xff09;的过程即输出。IO 流在 Java 中分为输入流和输出流&#xff0c;而根据数据的…

Spring事务不生效的场景的解决方案

一、前言 在Java Web开发中&#xff0c;使用Spring框架可以大大简化开发人员的工作。其中&#xff0c;事务管理是Spring框架中的一个重要功能&#xff0c;它可以确保多个数据库操作要么全部成功&#xff0c;要么全部失败。但是&#xff0c;在实际开发中&#xff0c;我们可能会…

基于微信小程序的明星应援小程序设计与实现(源码+lw+部署文档+讲解等)

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

浅谈研发与制造运营双端之间的数字化探索

一、传统中小型制造企业的发展变革与信息化建设背景 以往&#xff0c;传统的中小型制造企业常以大批量、重复性生产制造为主&#xff0c;依赖于人力设备&#xff0c;通过扩大产能发展壮大&#xff0c;信息化能力弱。伴随市场环境的变化及厂商竞争压力&#xff0c;企业谋生存求…

【网络八股】TCP八股

网络八股 请简述TCP/IP模型中每层的作用&#xff0c;典型协议和典型设备介绍一下三次握手的过程介绍一下四次挥手的过程必须三次握手吗&#xff0c;两次不行吗&#xff1f;为什么ACK数据包消耗TCP的序号吗三次握手中可以携带应用层数据吗四次挥手时&#xff0c;可以携带应用层数…

UE蓝图学习(从Unity3D而来)

一、UE组件对比Unity3D&#xff0c;从Unity3D过渡来学的角度出发&#xff0c;可以理解为在 空物体下放置子物体。UE没有U3D那种可以将组件挂在自身空物体上面。 二、UE 蓝图的情境提示&#xff0c;必须先找到相应的类型&#xff0c;对象对象、事件事件&#xff0c;才能找到相应…

Vue iconfont-阿里巴巴矢量图标库用法

一、vue使用 选择心仪的图标 加入购物车 点击右上角购物车&#xff0c;点击添加至项目 在资源管理 可以看到我的项目 进入项目设置勾选彩色 点击下载到本地 解压压缩包 在main.js文件内导入css文件 import "/assets/font_icon/iconfont.css"; 使用&#xff1a; 复…

Hive 数据仓库介绍

目录 ​编辑 一、Hive 概述 1.1 Hive产生的原因 1.2 Hive是什么&#xff1f; 1.3 Hive 特点 1.4 Hive生态链关系 二、Hive架构 2.1 架构图 2.2 架构组件说明 2.2.1 Interface 2.2.1.1 CLI 2.2.1.2 JDBC/ODBC 2.2.1.3 WebUI 2.2.2 MetaData 2.2.3 MetaStore 2.2…

postman怎么进行参数化?

一、先准备好参数化数据 &#xff08;参数化数据可以使用Excel或者txt的文件。 注意如果使用的是txt的文件&#xff0c;一定要使用英文的逗号&#xff0c;不然的话会报错&#xff01;&#xff09; 注意&#xff1a;填写好的数据后&#xff0c;保存的时候需要另存为&#xff0c…

PayPal面经

文章目录 初战AI Infra团队广泛收集信息&#xff0c;增加对面试相关团队的了解Paypal的AI infra Engineer 极客时间演讲视频&#xff1a;AI在金融应用HR面试首面 zhang chao首先让我介绍自己和项目基础知识出题 lettcode 1and0s 二面 luwen没有让我重复介绍自己那好&#xff0c…

如何快速重置模型原点

1、什么是模型原点&#xff1f; 模型原点是三维建模中的概念&#xff0c;它是指在一个虚拟三维空间中确定的参考点。模型原点通常位于模型的几何中心或基本组件的中心位置。如图所示&#xff1a; 可以看到模型的原点在模型的几何中心 2、模型原点的作用 知道了什么是模型原点&…

LCR 101. 分割等和子集——力扣——背包问题、动态规矩

问题描述 代码展示 class Solution:def canPartition(self, nums: List[int]) -> bool:if len(nums) < 1:return Falsetotal_sum sum(nums)if total_sum % 2 ! 0: # 总和为奇数&#xff0c;无法分成两个相等的子集return Falsetarget_sum total_sum // 2dp [[False]…

myArm 全新七轴桌面型机械臂

引言 在不断演进的科技世界中&#xff0c;我们始终追求创新和卓越&#xff0c;以满足客户的需求并超越他们的期望。今天&#xff0c;我们很高兴地宣布我们的最新产品——myArm 300 Pi&#xff0c;一款七轴的桌面型机械臂。这款产品的独特之处在于其灵活性和可编程性&#xff0c…

Docker——容器生命周期管理(下篇)

Docker 一、run1、options说明2、-p的三种写法3、实例14、实例25、实例36、实例47、实例58、实例69、实例78、实例89、退出容器 二、start/stop/restart1、语法格式2、stop/restart 命令的 options 三、kill1、重点2、说明3、实例 四、rm1、说明2、实例 五、create实例 六、exe…

天眼查询企业信息API接口

"天眼"一般是指"天眼查"&#xff0c;这是一个提供全国企业信息查询的API接口。天眼查以"天眼"作为用户logo&#xff0c;基于人工智能算法的数据采集和分析技术&#xff0c;为企业和个人提供全量、精准、实时、权威的企业信息查询服务。 天眼查A…

美容店预约小程序搭建流程

随着科技的不断发展&#xff0c;小程序已经成为了人们生活中不可或缺的一部分。对于美容店来说&#xff0c;搭建一个预约小程序不仅可以提高工作效率&#xff0c;还可以增加客户数量、提高服务质量。那么&#xff0c;如何搭建一个美容店预约小程序呢&#xff1f;本文将为你详细…