PE文件(三)节表作业

2024-04-29 13:04
文章标签 作业 pe 节表

本文主要是介绍PE文件(三)节表作业,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

本次作业以notepad进行演示,如下是其在硬盘上的内存

1.手动解析节表

由标准pe头可知,一共由7个节也就是7个节表,可选pe头的大小是0X00F0,即240字节大小

根据上述我们所获取的信息,找到节表的首地址为0x01F8

.text

#define IMAGE_SIZEOF_SHORT_NAME  8 //宏定义    
typedef struct _IMAGE_SECTION_HEADER{
    BYTE Name[IMAGE_SIZEOF_SHORT_NAME];  0X000000747865742E
    union{
        DWORD   PhysicalAddress;
        DWORD   VirtualSize;
    }Misc;  0X00027D02
    DWORD VirtualAddress;  0X00001000
    DWORD SizeOfRawData;  0X00028000
    DWORD PointerToRawData; 0X00001000
    DWORD PointerToRelocations; 0X00000000
    DWORD PointerToLinenumbers;0X00000000
    WORD NumberOfRelocations; 0X0000
    WORD NumberOfLinenumbers;0X0000
    DWORD Characteristics;  0X60000020
} IMAGE_SECTION_HEADER, *PIMAGE_SECTION_HEADER;
 

.rdata

#define IMAGE_SIZEOF_SHORT_NAME 8 
typedef struct _IMAGE_SECTION_HEADER{
    BYTE Name[IMAGE_SIZEOF_SHORT_NAME];  0X000061746164722E
    union{
        DWORD   PhysicalAddress;
        DWORD   VirtualSize;
    }Misc;  0X0000A608
    DWORD VirtualAddress;  0X00029000
    DWORD SizeOfRawData; 0X0000B000
    DWORD PointerToRawData; 0X00029000
    DWORD PointerToRelocations; 0X00000000
    DWORD PointerToLinenumbers; 0X00000000
    WORD NumberOfRelocations; 0X0000
    WORD NumberOfLinenumbers; 0X0000
    DWORD Characteristics;  0X40000040
} IMAGE_SECTION_HEADER, *PIMAGE_SECTION_HEADER;
 

.data

#define IMAGE_SIZEOF_SHORT_NAME 8
typedef struct _IMAGE_SECTION_HEADER{
    BYTE Name[IMAGE_SIZEOF_SHORT_NAME]; 0X000000617464642E
    union{
        DWORD   PhysicalAddress;
        DWORD   VirtualSize;
    }Misc;  000026C0
    DWORD VirtualAddress;  0X00034000
    DWORD SizeOfRawData; 0X00001000
    DWORD PointerToRawData; 0X00034000
    DWORD PointerToRelocations; 0X00000000
    DWORD PointerToLinenumbers; 0X00000000
    WORD NumberOfRelocations; 0X0000
    WORD NumberOfLinenumbers;0X0000
    DWORD Characteristics; 0XC0000040
} IMAGE_SECTION_HEADER, *PIMAGE_SECTION_HEADER;
 

由于该文件所有节过多,此处不再多演示,具体操作都是一样的。

2.控制台输出解析所有节表

#include<stdio.h>
#include<Windows.h>char* ReadPEFile(const char* lpszFile)
{FILE* pFile = NULL;pFile = fopen(lpszFile, "rb");DWORD fileSize = 0;char* pFileBuffer = NULL;if (!pFile){printf("无法打开EXE文件");return NULL;}fseek(pFile, 0, SEEK_END);fileSize = ftell(pFile);fseek(pFile, 0, SEEK_SET);pFileBuffer = (char*)malloc(sizeof(char)*fileSize);if (!pFileBuffer){printf("分配空间失败");fclose(pFile);return NULL;}size_t i = fread(pFileBuffer, fileSize, 1, pFile);if (!i){printf("读取数据失败!");free(pFileBuffer);fclose(pFile);return NULL;}fclose(pFile);return pFileBuffer;
}
BOOL PrintNTHeaders(const char* lpszFile)
{IMAGE_DOS_HEADER  *pDosHeader;IMAGE_NT_HEADERS *pNTHeader;IMAGE_FILE_HEADER *pPEHeader;IMAGE_SECTION_HEADER *pSecHeader;int i = 0;char* pFileBuffer = ReadPEFile(lpszFile);pDosHeader = (IMAGE_DOS_HEADER*)pFileBuffer;if (pDosHeader->e_magic != IMAGE_DOS_SIGNATURE){printf("不是有效MZ标志,打印结束\n");free(pFileBuffer);pFileBuffer = NULL;return FALSE;}pNTHeader = (IMAGE_NT_HEADERS*)((char*)pFileBuffer + pDosHeader->e_lfanew);if (pNTHeader->Signature != IMAGE_NT_SIGNATURE){printf("不是有效的PE标志,打印结束\n");free(pFileBuffer);pFileBuffer = NULL;return FALSE;}pPEHeader = (IMAGE_FILE_HEADER*)((char*)pNTHeader + 4);printf("NumberOfSections(节表的数量):%04X\n", pPEHeader->NumberOfSections);printf("SizeOfOptionalHeader(可选pe头的大小):%04X\n", pPEHeader->SizeOfOptionalHeader); printf("\n");printf("节表信息解析开始");pSecHeader = (IMAGE_SECTION_HEADER*)((char*)pPEHeader + sizeof(_IMAGE_FILE_HEADER) + pPEHeader->SizeOfOptionalHeader);for (int i = 0; i < pPEHeader->NumberOfSections; i++){	char SecName[9] = "\0";printf("这是第%d个节表\n", i+1);char* Name = (char*)pSecHeader->Name;strcpy(SecName, Name);printf("Name:%s\n", SecName);printf("VirtualSize:%08X\n", pSecHeader->Misc.VirtualSize);printf("VirtualAddress:%08X\n", pSecHeader->VirtualAddress);printf("SizeOfRawData:%08X\n", pSecHeader->SizeOfRawData);printf("PointerToRawData:%08X\n", pSecHeader->PointerToRawData);printf("Characteristics:%08X\n", pSecHeader->Characteristics);printf("\n");pSecHeader++;}free(pFileBuffer);pFileBuffer = NULL;return TRUE;
}
int main(int argc, char* argv[])
{const char* lpszFile = "C:\\Windows\\notepad.exe";PrintNTHeaders(lpszFile);return 0;
}

这篇关于PE文件(三)节表作业的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/946161

相关文章

作业提交过程之HDFSMapReduce

作业提交全过程详解 (1)作业提交 第1步:Client调用job.waitForCompletion方法,向整个集群提交MapReduce作业。 第2步:Client向RM申请一个作业id。 第3步:RM给Client返回该job资源的提交路径和作业id。 第4步:Client提交jar包、切片信息和配置文件到指定的资源提交路径。 第5步:Client提交完资源后,向RM申请运行MrAp

Java高级Day38-网络编程作业

112.网络编程作业 //1.使用字符流的方式,编写一个客户端程序和服务器端程序//2.客户端发送"name",服务器端接收到后,返回"我是nova"//3.客户端发送"hobby",服务器端接收到后,返回"编写java程序"//4.不是这两个问题,回复"你说啥呢"​​===============//客户端//===============public class SocketT

0906作业+思维导图梳理

一、作业: 1、创捷一个类似于qq登录的界面 1)源代码 #include "widget.h"#include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget){ui->setupUi(this);//QPushbutton:登录、退出this->join = new QP

2024.9.6 作业

1> 手写unique_ptr指针指针 #include <iostream>using namespace std;template <typename T>class my_unique_ptr{public:explicit my_unique_ptr(T *p = nullptr) noexcept // 构造函数{ptr = p;}~my_unique_ptr() noexcep

9月6号作业

1:.h文件 #ifndef MAINWINDOW_H #define MAINWINDOW_H #include <QMainWindow> #include <QWidget> #include<QIcon> //图标类 #include<QLabel> //标签类 #include<QMovie> //动图类 #include<QLineEdit> //行编辑器类

Flink实例(六十九): flink 作业提交(四)总结

独立集群提交 # 启动集群bin/start-cluster.sh# 提交job./bin/flink run ./examples/batch/WordCount.jar --input hdfs:/user/yuan/input/wc.count --output hdfs:/user/yuan/swwwttt yarn session # 启动集群./bin/

【#第三期实战营闯关作业 ## 茴香豆:企业级知识库问答工具】

今天学习了《 茴香豆:企业级知识库问答工具》这一课,对大模型的应用有了更深得认识。以下是记录本课实操过程及截图: 搭建茴香豆虚拟环境: 输入以下命令 ``studio-conda -o internlm-base -t huixiangdou 成功安装虚拟环境截图 安装茴香豆 cd /root 克隆代码仓库 git clone https://github.com/internlm/h

Codewarrior中利用PE multilink下载程序debug时不能连接问题

现象:PC连接PE multilink然后连接单片机,mutilink上的与单片机的连接接口是正确的,但点击codewarrior中debug按钮,则会出现连接失败,如下图: 电脑端口也能识别 但就是不能连接。 解决方案:如下图点击[FAQ#29]然后进入, 按照这个界面给的解决方案去解决即可,重装一下驱动(此页面下面会给出相应的BDM驱动)

Quartz 作业调度器

1、Quartz  java实现  注:这里使用的是Quartz1.6.5版本(包:quartz-1.6.5.jar)   [java]  view plain copy //测试main函数   //QuartzTest.java   package quartzPackage;         import java.text.SimpleDateFormat

清华MEM作业-利用管理运筹学的分析工具slover求解最优解的实现 及 通过使用文件或者套节字来识别进程的fuser命令

一、清华MEM作业-利用管理运筹学的分析工具slover求解最优解的实现         最近又接触了一些线性求解的问题,以前主要都是在高中数学里接触到,都是使用笔算,最后通过一些函数式得出最小或者最大值,最近的研究生学业上接触到了一个Excel solver分析工具,对这种线性求最优解的问题感觉使用起来真是得心应手。在使用这个工具前,EXCEL里需要先装上solver工具,装起来很也简单,网上