【逆向】(c++)分析pe结构,拉伸pe结构,缩小pe结构
建议大家认认真真写一遍,收获蛮大的,是可以加深对pe结构的理解,尤其是对指针的使用,和对win32的一些宏的定义的理解和使用。
#include <windows.h>
#include <iostream>
#include <string>using namespace std;PIMAGE_DOS_HEADER my_dos=nullptr;//dos头结构
PIMAGE_FILE_HEADER my_file=nullptr;//file结构
PIMAGE_OPTIONAL_HEADER32 my_optional=nullptr;//可选PE头结构
PIMAGE_SECTION_HEADER* my_section=nullptr;//节表结构
void* Before_Stretch_Data = nullptr; //指向拉伸前的内容
void* Stretch_Data = nullptr; //指向拉伸后的内容
void* Shrink_data = nullptr; //指向缩小PE结构的内容//获取
void* Readfile(char* filename)
{unsigned int size;FILE* datafile;void* data;//打开文件if (fopen_s(&datafile, filename, "rb") != 0){cout << "打开文件失败" << endl;return nullptr;}else{//获取文件的大小cout << "打开文件成功!" << endl;fseek(datafile, 0, SEEK_END);size = ftell(datafile);fseek(datafile, 0, SEEK_SET);if (size == -1L){cout << "文件大小判断失败!" << endl;return nullptr;}//申请内存空间把文件内容保存下来data = (void*)malloc(size * sizeof(char));if (fread_s(data, size, sizeof(char), size, datafile) == 0){cout << "写入数据失败!" << endl;return nullptr;}cout << "写入数据成功,成功获取Data!" << endl;return data;}}//分析PE结构
void Analyze_PE(char*& Data, PIMAGE_DOS_HEADER& my_dos, PIMAGE_FILE_HEADER& my_file, PIMAGE_OPTIONAL_HEADER32& my_optional, PIMAGE_SECTION_HEADER*& my_section)
{DWORD* Temp_ptr = (DWORD*)Data;my_dos = (PIMAGE_DOS_HEADER)Temp_ptr;Temp_ptr = (DWORD*)((char*)&Data[my_dos->e_lfanew]);Temp_ptr++;my_file = (PIMAGE_FILE_HEADER)Temp_ptr;Temp_ptr = (DWORD*)((char*)Temp_ptr + 0x14);my_optional = (PIMAGE_OPTIONAL_HEADER)Temp_ptr;Temp_ptr = (DWORD*)((char*)my_optional+my_file->SizeOfOptionalHeader);my_section = (PIMAGE_SECTION_HEADER*)malloc(sizeof(IMAGE_SECTION_HEADER) * my_file->NumberOfSections);for (int i = 0; i < my_file->NumberOfSections; i++){my_section[i] = (PIMAGE_SECTION_HEADER)Temp_ptr;Temp_ptr = (DWORD*)((char*)Temp_ptr + 0x28);}
}//复制节表的内容
//void Copy_Section_Content()
//{
// void* temp_ptr=nullptr;
// for (int i = 0; i < my_file->NumberOfSections; i++)
// {
// temp_ptr = (void*)((char*)Before_Stretch_Data + my_section[i]->PointerToRawData);
//
// }
//}//拉伸PE结构 注意看PIMAGE_XXX_HEADER的定义,它们本就是指向结构体的指针
void Stretch_PE()
{unsigned Memory_Size = 0;Memory_Size = my_optional->SizeOfImage;Stretch_Data = (void*)malloc(sizeof(char) * Memory_Size);memset(Stretch_Data, 0, Memory_Size);void* temp_before_stretch_data_ptr = Before_Stretch_Data;int size_of_dos = 0x40;int size_of_junk = 0x40;int size_of_file = 0x18;unsigned Size_Of_Optional = my_file->SizeOfOptionalHeader;unsigned Size_Of_Section = 0x28;unsigned Size_Of_Header = size_of_dos + size_of_file + size_of_junk + Size_Of_Optional + Size_Of_Section * my_file->NumberOfSections;//还未对齐memcpy_s(Stretch_Data, Memory_Size, Before_Stretch_Data, Size_Of_Header);void* temp_stretch_data = Stretch_Data;//现在计算head头对齐后的大小int Size = Size_Of_Header % my_optional->SectionAlignment;Size_Of_Header = my_optional->SectionAlignment * Size;for (int i = 0; i < my_file->NumberOfSections; i++){temp_stretch_data = (void*)((char*)Stretch_Data+my_section[i]->VirtualAddress);temp_before_stretch_data_ptr = (void*)((char*)Before_Stretch_Data+my_section[i]->PointerToRawData);memcpy_s(temp_stretch_data, my_section[i]->SizeOfRawData, temp_before_stretch_data_ptr, my_section[i]->SizeOfRawData);}cout << "拉伸成功" << endl;
}void Shrink_PE()
{unsigned int Size = 0;Size = my_section[my_file->NumberOfSections - 1]->PointerToRawData + my_section[my_file->NumberOfSections - 1]->SizeOfRawData;Shrink_data = (void*)malloc(Size);//从Stretch_Data缩小//复制Headsmemcpy_s(Shrink_data, my_optional->SizeOfHeaders, Stretch_Data, my_optional->SizeOfHeaders);//复制节void* temp_shrink_data_ptr = Shrink_data;void* temp_stretch_data_ptr = Stretch_Data;for (int i = 0; i < my_file->NumberOfSections; i++){temp_shrink_data_ptr = (void*)((char*)Shrink_data + my_section[i]->PointerToRawData);temp_stretch_data_ptr= (void*)((char*)Stretch_Data + my_section[i]->VirtualAddress);memcpy_s(temp_shrink_data_ptr, my_section[i]->SizeOfRawData, temp_stretch_data_ptr, my_section[i]->SizeOfRawData);}cout << "缩小成功" << endl;return;}int main()
{char filename[100]= "ceshi.exe";Before_Stretch_Data =Readfile(filename);Analyze_PE((char*&)Before_Stretch_Data, my_dos, my_file, my_optional, my_section);cout << my_dos->e_lfanew << endl;cout << my_file->Characteristics << endl;cout << my_optional->ImageBase << endl;cout << my_section[1]->Name<< endl;Stretch_PE();cout << my_section[3]->Name << endl;Shrink_PE();Analyze_PE((char*&)Shrink_data, my_dos, my_file, my_optional, my_section);cout << my_dos->e_lfanew << endl;cout << my_file->Characteristics << endl;cout << my_optional->ImageBase << endl;cout << my_section[1]->Name << endl;return 0;
}
相关文章:
【逆向】(c++)分析pe结构,拉伸pe结构,缩小pe结构
建议大家认认真真写一遍,收获蛮大的,是可以加深对pe结构的理解,尤其是对指针的使用,和对win32的一些宏的定义的理解和使用。 #include <windows.h> #include <iostream> #include <string>using namespace std…...
PyTorch实战:常用卷积神经网络搭建结构速览
目录 前言 常用卷积神经网络 1.AlexNet 2.VGGNet 3.GoogLeNet 4.ResNet 总览 前言 PyTorch可以说是三大主流框架中最适合初学者学习的了,相较于其他主流框架,PyTorch的简单易用性使其成为初学者们的首选。这样我想要强调的一点是,框架…...
排序算法之【快速排序】
📙作者简介: 清水加冰,目前大二在读,正在学习C/C、Python、操作系统、数据库等。 📘相关专栏:C语言初阶、C语言进阶、C语言刷题训练营、数据结构刷题训练营、有感兴趣的可以看一看。 欢迎点赞 👍…...
声明式调用 —— SpringCloud OpenFeign
Feign 简介 Spring Cloud Feign 是一个 HTTP 请求调用的轻量级框架,可以以 Java 接口注解的方式调用 HTTP 请求,而不用通过封装 HTTP 请求报文的方式直接调用 Feign 通过处理注解,将请求模板化,当实际调用的时候传入参数&#x…...
LuatOS-SOC接口文档(air780E)-- fota - 底层固件升级
fota.init(storge_location, len, param1)# 初始化fota流程 参数 传入值类型 解释 int/string fota数据存储的起始位置 如果是int,则是由芯片平台具体判断 如果是string,则存储在文件系统中 如果为nil,则由底层决定存储位置 int 数据存…...
第二章 Introduction
Armv8.4 架构引入了在安全状态下的虚拟化扩展。Arm SMMU v3.2 架构 [1] 增加了对安全流的第二阶段翻译的支持,以补充 Armv8.4 PE 中的安全 EL2 翻译体制。这些架构特性使得可以在安全状态下将彼此不信任的软件组件隔离开来。隔离是实现最小权限原则的机制࿱…...
WebGL 渲染三维图形作为纹理贴到另一个三维物体表面
目录 渲染到纹理 帧缓冲区对象和渲染缓冲区对象 帧缓冲区对象 帧缓冲区对象的结构 如何实现渲染到纹理 示例程序(FramebufferObject.js) 创建帧缓冲区对象(gl.createFramebuffer()) gl.createFra…...
国庆《乡村振兴战略下传统村落文化旅游设计》许少辉八一新书行将售罄
国庆《乡村振兴战略下传统村落文化旅游设计》许少辉八一新书行将售罄 国庆《乡村振兴战略下传统村落文化旅游设计》许少辉八一新书行将售罄...
Source Insight 工具栏图标功能介绍
这篇文章并不介绍 Source Insight 的具体使用方法,这类教程网上有很多,这里只分析 Souce Insight 工具栏图标的功能。 文章目录 Source Insight 简介Souce Insight 工具栏文件操作新建(CtrlN)打开(CtrlO)保…...
模板与泛型编程-函数模板
本专栏由于缺少函数模板专题,我本以为这个不用讲解,但由于某些同学基础比较薄弱,特地在此补充一下。 函数模板的定义一般都在头文件中。 一、如何定义一个模板函数 下面是一个求和函数 template<typename T,typename U> auto Add(T a, U b) {return a + b; }int...
了解ActiveMQ、RabbitMQ、RocketMQ和Kafka的特点
ActiveMQ ActiveMQ是一种基于JMS(Java消息服务)规范的消息中间件,由Apache基金会开发和维护 核心组件和特点: Broker(代理):ActiveMQ的核心组件是Broker,它负责接收、存储和路由消息…...
第七章 用户和组管理
7.1 Linux中的用户和组的分类 用户类别 超级用户(0) root 系统用户(1-999) 一般用户(1000-60000) 组类别 管理组 root 基本组(默认组/主组) 附加组(额外组) 7.2 用户管理 7.2.1 添加新用户 语法 useradd 【…...
给奶牛做直播之三
一、前言 上一篇给牛奶做直播之二 主要讲用RTMP搭建点播服务器,整了半天直播还没上场,今天不讲太多理论的玩意,奶牛今天放假了也不出场,就由本人亲自上场来个直播首秀,见下图,如果有兴趣的话࿰…...
【Java 进阶篇】MySQL 数据控制语言(DCL):管理用户权限
MySQL 是一个强大的关系型数据库管理系统,提供了丰富的功能和选项来管理数据库和用户。数据库管理员(DBA)通常使用数据控制语言(Data Control Language,简称 DCL)来管理用户的权限和访问。 本文将详细介绍…...
WPF 03
staticResource和dynamicResource的区别 首先看一个案例 MainWindow.xaml <Window x:Class"WpfDay03.MainWindow"xmlns"http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x"http://schemas.microsoft.com/winfx/2006/xaml&quo…...
Android 使用kotlin+注解+反射+泛型实现MVP架构
一,MVP模式的定义 ①Model:用于存储数据。它负责处理领域逻辑以及与数据库或网络层的通信。 ②View:UI层,提供数据可视化界面,并跟踪用户的操作,以便通知presenter。 ③Presenter:从Model层获…...
数据结构——堆(C语言)
本篇会解决一下几个问题: 1.堆是什么? 2.如何形成一个堆? 3.堆的应用场景 堆是什么? 堆总是一颗完全二叉树堆的某个节点总是不大于或不小于父亲节点 如图,在小堆中,父亲节点总是小于孩子节点的。 如图&a…...
B058-SpringBoot
目录 springboot概念与作用入门案例springboot运行方式热部署配置文件Profile多环境支持整合测试-springboot-testSpringboot-web1.返回json数据2.返回页面(模板技术)thymeleaf1.导入thymeleaf依赖2.模板文件3.controller4.启动类 SSM整合1.导包2.项目目…...
龙迅LT9611UXC 2PORT MIPICSI/DSI转HDMI(2.0)转换器+音频,内置MCU
龙迅LT9611UXC 1.描述: LT9611UXC是一个高性能的MIPI DSI/CSI到HDMI2.0转换器。MIPI DSI/CSI输入具有可配置的单 端口或双端口,1高速时钟通道和1~4高速数据通道,最大2Gbps/通道,可支持高达16Gbps的总带 宽。LT9611UXC支持突发…...
STM32存储左右互搏 I2C总线读写FRAM MB85RC1M
STM32存储左右互搏 I2C总线读写FRAM MB85RC1M 在较低容量存储领域,除了EEPROM的使用,还有铁电存储器FRAM的使用,相对于EEPROM, 同样是非易失性存储单元,FRAM支持更高的访问速度, 其主要优点为没有EEPROM持续写操作跨页…...
大话软工笔记—需求分析概述
需求分析,就是要对需求调研收集到的资料信息逐个地进行拆分、研究,从大量的不确定“需求”中确定出哪些需求最终要转换为确定的“功能需求”。 需求分析的作用非常重要,后续设计的依据主要来自于需求分析的成果,包括: 项目的目的…...
day52 ResNet18 CBAM
在深度学习的旅程中,我们不断探索如何提升模型的性能。今天,我将分享我在 ResNet18 模型中插入 CBAM(Convolutional Block Attention Module)模块,并采用分阶段微调策略的实践过程。通过这个过程,我不仅提升…...
Admin.Net中的消息通信SignalR解释
定义集线器接口 IOnlineUserHub public interface IOnlineUserHub {/// 在线用户列表Task OnlineUserList(OnlineUserList context);/// 强制下线Task ForceOffline(object context);/// 发布站内消息Task PublicNotice(SysNotice context);/// 接收消息Task ReceiveMessage(…...
中南大学无人机智能体的全面评估!BEDI:用于评估无人机上具身智能体的综合性基准测试
作者:Mingning Guo, Mengwei Wu, Jiarun He, Shaoxian Li, Haifeng Li, Chao Tao单位:中南大学地球科学与信息物理学院论文标题:BEDI: A Comprehensive Benchmark for Evaluating Embodied Agents on UAVs论文链接:https://arxiv.…...
Python实现prophet 理论及参数优化
文章目录 Prophet理论及模型参数介绍Python代码完整实现prophet 添加外部数据进行模型优化 之前初步学习prophet的时候,写过一篇简单实现,后期随着对该模型的深入研究,本次记录涉及到prophet 的公式以及参数调优,从公式可以更直观…...
Linux云原生安全:零信任架构与机密计算
Linux云原生安全:零信任架构与机密计算 构建坚不可摧的云原生防御体系 引言:云原生安全的范式革命 随着云原生技术的普及,安全边界正在从传统的网络边界向工作负载内部转移。Gartner预测,到2025年,零信任架构将成为超…...
高防服务器能够抵御哪些网络攻击呢?
高防服务器作为一种有着高度防御能力的服务器,可以帮助网站应对分布式拒绝服务攻击,有效识别和清理一些恶意的网络流量,为用户提供安全且稳定的网络环境,那么,高防服务器一般都可以抵御哪些网络攻击呢?下面…...
pikachu靶场通关笔记22-1 SQL注入05-1-insert注入(报错法)
目录 一、SQL注入 二、insert注入 三、报错型注入 四、updatexml函数 五、源码审计 六、insert渗透实战 1、渗透准备 2、获取数据库名database 3、获取表名table 4、获取列名column 5、获取字段 本系列为通过《pikachu靶场通关笔记》的SQL注入关卡(共10关࿰…...
图表类系列各种样式PPT模版分享
图标图表系列PPT模版,柱状图PPT模版,线状图PPT模版,折线图PPT模版,饼状图PPT模版,雷达图PPT模版,树状图PPT模版 图表类系列各种样式PPT模版分享:图表系列PPT模板https://pan.quark.cn/s/20d40aa…...
【碎碎念】宝可梦 Mesh GO : 基于MESH网络的口袋妖怪 宝可梦GO游戏自组网系统
目录 游戏说明《宝可梦 Mesh GO》 —— 局域宝可梦探索Pokmon GO 类游戏核心理念应用场景Mesh 特性 宝可梦玩法融合设计游戏构想要素1. 地图探索(基于物理空间 广播范围)2. 野生宝可梦生成与广播3. 对战系统4. 道具与通信5. 延伸玩法 安全性设计 技术选…...
