滴水逆向 FileBuffer-ImageBuffer 课后作业

news/2024/5/13 5:35:34

1)- 实现如下功能 

#include<stdio.h>
#include<stdlib.h>
#include<windows.h>
BYTE* bufferApply = nullptr;//将磁盘文件复制到内存中后, 使用bufferApply指向该空间
DWORD fileSize = 0;//将磁盘文件复制到内存时使用需要申请空间, 使用fileSize设置申请空间的大小BYTE* bufferMem = nullptr;//将内存中文件进行拉伸时需要申请新的空间, 使用bufferMem指向该空间
BYTE* bufferNewMem = nullptr;//将内存中拉伸后的文件拉回到新的空间, 使用bufferNewMem指向该空间WORD section_num = 0;//代表文件中节的个数
LPVOID pFileBuffer = NULL;
PIMAGE_DOS_HEADER pDosHeader = NULL;
PIMAGE_NT_HEADERS pNTHeader = NULL;
PIMAGE_FILE_HEADER pPEHeader = NULL;
PIMAGE_OPTIONAL_HEADER pOptionHeader = NULL;
PIMAGE_SECTION_HEADER pSectionHeader = NULL;
char str[9] = { 0 };//用于存储节表中的节表名称字符串
void LoadToMemory() {char* road = "D:\\Ddisk\\goodThing\\fg.exe";//设置文件路径FILE *note = NULL;fopen_s(&note, road, "rb");//打开文件fseek(note, 0, SEEK_END);//将文件指针移到末端fileSize = ftell(note);//获取文件指针位置得知文件大小fseek(note, 0, SEEK_SET);//将文件指针移到开始位置bufferApply = (BYTE*)malloc(fileSize);//根据文件大小分配内存fread(bufferApply, 1, fileSize, note);//将文件指针指向的内容读取到内存中fclose(note);//关闭文件指针
}
void SetHeader() {//设置各个PE文件头的参数pDosHeader = (PIMAGE_DOS_HEADER)bufferApply;pNTHeader = (PIMAGE_NT_HEADERS)(pDosHeader->e_lfanew + (DWORD)bufferApply);pPEHeader = (PIMAGE_FILE_HEADER)((DWORD)pNTHeader + 4);pOptionHeader = (PIMAGE_OPTIONAL_HEADER32)((DWORD)pPEHeader + 20);WORD optional_size = pPEHeader->SizeOfOptionalHeader;pSectionHeader = (PIMAGE_SECTION_HEADER)((DWORD)pOptionHeader + optional_size);section_num = pPEHeader->NumberOfSections;
}
void ReleaseMem() {free(bufferApply);free(bufferMem);free(bufferNewMem);
}
void File_To_Image() {//将内存中的文件拉伸到新的空间bufferMem = (BYTE*)calloc(pOptionHeader->SizeOfImage, sizeof(char));memcpy(bufferMem, bufferApply, pOptionHeader->SizeOfHeaders);PIMAGE_SECTION_HEADER SectionHeader = pSectionHeader;for (int i = 0; i < section_num; i++) {memcpy((void*)((DWORD)bufferMem + SectionHeader->VirtualAddress),(void*)((DWORD)bufferApply + SectionHeader->PointerToRawData), SectionHeader->SizeOfRawData);SectionHeader++;}}
void Image_To_Mem() {//将内存中的文件拉回到新的空间bufferNewMem = (BYTE*)malloc(fileSize);memcpy(bufferNewMem, bufferMem, pOptionHeader->SizeOfHeaders);PIMAGE_SECTION_HEADER SectionHeader = pSectionHeader;for (int i = 0; i < section_num; i++) {memcpy((void*)((DWORD)bufferNewMem + SectionHeader->PointerToRawData),(void*)((DWORD)bufferMem + SectionHeader->VirtualAddress), SectionHeader->SizeOfRawData);SectionHeader++;}
}
int main() {LoadToMemory();SetHeader();File_To_Image();Image_To_Mem();char* road = "D:\\Ddisk\\goodThing\\hello.exe";FILE *bomb = NULL;fopen_s(&bomb, road, "wb");size_t written = fwrite(bufferNewMem, 1, fileSize, bomb);fclose(bomb);ReleaseMem();
}

2)- 编写一个函数,能够将RVA的值转换成FOA. 

  • RVA (Relative Virtual Address):PE文件加载到内存中时相对于ImageBase的偏移量

  • FOA (File Offset Address):PE 文件中的数据相对于文件开始的偏移量

    #include<stdio.h>
    #include<stdlib.h>
    #include<windows.h>
    BYTE* bufferApply = nullptr;//将磁盘文件复制到内存中后, 使用bufferApply指向该空间
    DWORD fileSize = 0;//将磁盘文件复制到内存时使用需要申请空间, 使用fileSize设置申请空间的大小WORD section_num = 0;//代表文件中节的个数
    LPVOID pFileBuffer = NULL;
    PIMAGE_DOS_HEADER pDosHeader = NULL;
    PIMAGE_NT_HEADERS pNTHeader = NULL;
    PIMAGE_FILE_HEADER pPEHeader = NULL;
    PIMAGE_OPTIONAL_HEADER pOptionHeader = NULL;
    PIMAGE_SECTION_HEADER pSectionHeader = NULL;
    void LoadToMemory() {char* road = "D:\\Ddisk\\goodThing\\fg.exe";//设置文件路径FILE *note = NULL;fopen_s(&note, road, "rb");//打开文件fseek(note, 0, SEEK_END);//将文件指针移到末端fileSize = ftell(note);//获取文件指针位置得知文件大小fseek(note, 0, SEEK_SET);//将文件指针移到开始位置bufferApply = (BYTE*)malloc(fileSize);//根据文件大小分配内存fread(bufferApply, 1, fileSize, note);//将文件指针指向的内容读取到内存中fclose(note);//关闭文件指针
    }
    void SetHeader(BYTE* buffer) {//设置各个PE文件头的参数pDosHeader = (PIMAGE_DOS_HEADER)buffer;pNTHeader = (PIMAGE_NT_HEADERS)(pDosHeader->e_lfanew + (DWORD)buffer);pPEHeader = (PIMAGE_FILE_HEADER)((DWORD)pNTHeader + 4);pOptionHeader = (PIMAGE_OPTIONAL_HEADER32)((DWORD)pPEHeader + 20);WORD optional_size = pPEHeader->SizeOfOptionalHeader;pSectionHeader = (PIMAGE_SECTION_HEADER)((DWORD)pOptionHeader + optional_size);section_num = pPEHeader->NumberOfSections;
    }
    void ReleaseMem() {free(bufferApply);
    }
    DWORD RVA_To_FOA(BYTE* addr, BYTE* buffer) {BYTE* tem_buffer = (BYTE*)pDosHeader;//存储原来pDosHeader的数据, 因为下面要对数据进行修改SetHeader(buffer);//改变pDosHeader中的数据PIMAGE_SECTION_HEADER SectionHeader = pSectionHeader;DWORD offset = (DWORD)addr - (DWORD)buffer;//得到相对于起始位置的偏移地址for (int i = 0; i < section_num; i++) {//判断地址属于哪个节并做相应转换if (offset > SectionHeader->VirtualAddress &&(offset < (SectionHeader->VirtualAddress+SectionHeader->Misc.VirtualSize) || offset < (SectionHeader->VirtualAddress+SectionHeader->SizeOfRawData))) {offset = offset - SectionHeader->VirtualAddress;DWORD file_off = (SectionHeader->PointerToRawData) + offset;SetHeader(tem_buffer);return file_off;}SectionHeader++;}SetHeader(tem_buffer);return -1;
    }
    int main() {LoadToMemory();SetHeader(bufferApply);ReleaseMem();
    }


http://www.mrgr.cn/p/34020178

相关文章

17-项目风险管理(8/10 十大管理)

15.1 管理基础 15.1.1 项目风险概述 项目风险是一种不确定的事件或条件,一旦发生,会对项目目标产生某种正面或负面的影响。项目风险既包括对项目目标的威胁,也包括促进项目目标的机会。 风险源于所有项目之中的不确定因素。项目在不同阶段会有不同的风险。风险会随着项目的进…

18-项目采购管理(9/10 十大管理)

16.1 管理基础 16.1.1 协议/采购合同 项目采购管理包括从项目团队外部采购或获取所需产品、服务或成果的各个过程。例如合同、订购单、协议备忘录(MOA)和服务水平协议(SLA)。被授权采购项目所需货物、服务的人员可以是项目团队、管理层或组织采购部的成员。 因应用领域不同…

URL路由基础与Django处理请求的过程分析

1. URL路由基础 对于高质量的Web应用来讲&#xff0c;使用简洁、优雅的URL设计模式非常有必要。Django框架允许设计人员自由地设计URL模式&#xff0c;而不用受到框架本身的约束。对于URL路由来讲&#xff0c;其主要实现了Web服务的入口。用户通过浏览器发送过来的任何请求&am…

15-项目沟通管理(7/10 十大管理)

14.1 管理基础 14.1.1 沟通 沟通是指用各种可能的方式来发送或接收信息。具体形式包括:书面行驶、口头形式、正式或非正式、手势动作、媒体行驶、遣词造句。 14.1.2 沟通模型 关键要素包括:编码:把思想或想法转化为他人能理解的语言 信息和反馈信息 媒介 噪声 解码:把信息还…

与 Apollo 共创生态:Apollo 七周年大会给带来的震撼

文章目录 一、七年蛰伏&#xff0c;Apollo 迎来“智变”时刻二、Apollo 企业生态计划与开放平台2.1 Apollo X 企业自动驾驶解决方案2.2 Apollo 开放平台携手伙伴共创生态 三、个人感悟 一、七年蛰伏&#xff0c;Apollo 迎来“智变”时刻 让我们把时间倒回到 2013 年&#xff0…

13-项目质量管理(5/10 十大管理)

12.1 管理基础 12.1.1 质量与项目质量 1.质量 国际标准定义:反映实体满足主体明确和隐含需求的能力的特性总和。 国家标准定义:一组固有特性满足要求的程度。 质量通常是指产品的质量,广义上的质量还包括工作质量。质量与等级是两个不同的概念。 质量作为实现的性能或成果;…

11-项目进度管理(3/10 十大管理)

10.1 管理基础 10.1.1 项目进度计划的定义和总要求 项目进度计划是一种用于沟通和管理干系人期望的工具,为绩效报告提供依据。 编制进度计划一般步骤:首先选择进度计划方法,例如关键路径法;然后将项目特定数据,如活动、计划日期、持续时间、资源、依赖关系和制约因素等输入…

12-项目成本管理(4/10 十大管理)

11.1 管理基础 11.1.1 重要性和意义 项目成本管理重点关注完成项目活动所需资源的成本,但同时也考虑项目决策对项目产品、服务或成果的使用成本、维护成本和支持成本的影响。项目成本管理应考虑干系人对成本的要求,不同的干系人会在不同的时间,用不同的方法测算项目成本。 对…

ThingsBoard服务端使用RPC通过网关给设备发送消息

一、概述 1、发送服务器端网关RPC 二、案例&#xff1a; 1、建立设备与网关之间的通讯 2、查看设备和网关是否在线状态啊 3、通过 仪表盘&#xff0c;创建设备A的模拟RPC调用的窗口链接 4、在客户端的网关设备上订阅RPC网关的主题信息 5、通过服务端的窗口&#xff0c;发…

10-项目范围管理(2/10 十大管理)

9.1 管理基础 9.1.1 产品范围和项目范围产品范围:指某项产品、服务或成果所具有的特征和功能。产品范围的完成情况是根据产品需求来衡量的。 项目范围:包括产品范围,是为交付具有规定特性与功能的产品服务或成果而必须完成的工作。项目范围的完成情况是根据项目管理计划来衡…

神经网络的激活函数

目录 神经网络 激活函数 sigmoid 激活函数 tanh 激活函数 backward方法 relu 激活函数 softmax 激活函数 神经网络 人工神经网络&#xff08; Artificial Neural Network&#xff0c; 简写为ANN&#xff09;也简称为神经网络&#xff08;NN&#xff09;&#xff0c…

kvm网络,docker网络,,vm网络

一:vmware网络 1:概念的介绍虚拟网络编辑器:控制的就是虚拟机的网段的 window中的适配器:更这个虚拟网络编辑器连在一起的,是同一个网段,通常是分配的.1的IP地址 2:桥接模式 原理:就是将虚拟机的物理网卡桥接到物理主机上面,实现了访问外网的操作 图解: 操作:就是将…

第十五届蓝桥杯省赛第二场C/C++B组E题【遗迹】题解

解题思路 错解 贪心&#xff1a;每次都移动至当前最近的对应方块上。 反例&#xff1a; s s s abxac t t t abac 贪心结果&#xff08;下标&#xff09; 0 → 1 → 0 → 4 0 \rightarrow 1 \rightarrow 0 \rightarrow 4 0→1→0→4&#xff0c;答案为 5 5 5。 正确结…

ROS2学习-节点名随记

1.节点名定义: 主函数中的node = WriterNode("he") 定义了该节点的名称 def main(args=None):"""ros2运行该节点的入口函数,可配置函数名称"""rclpy.init(args=args) # 初始化rclpynode = WriterNode("he") # 新建一个节…

新建云仓库

1.GitHub新建云仓库&#xff1a; LICENSE:开源许可证&#xff1b;README.md:仓库说明文件&#xff1b;开源项目&#xff1b;cocoaPodsName.podspec: CocoaPods项目的属性描述文件。 2.Coding新建云仓库&#xff1a; 备注&#xff1a; Coding新建项目&#xff1a;

金融风控信用评分卡建模(Kaggle give me credit数据集)

1 数据预处理数据 数据来源于Kaggle的Give Me Some Credit&#xff0c;包括25万条个人财务情况的样本数据 1.1 导包读数据 import pandas as pd import numpy as np import matplotlib.pyplot as plt from sklearn.ensemble import RandomForestRegressor import seaborn as …

周末玩一下云技术,kvm 相关笔记

由于需要将企业的很贵的显卡和主机装在一个虚拟主机,用来跑 ue5 和 sd3 用来给用户临时使用,但是怎么将主机虚拟出来成多个主机呢,自己没有有钱请不起人,只能自己学一下虚拟化技术,第一步主机开启硬件支持 , grep -E vmx|svm /proc/cpuinfo 命令的功能是在/proc/cpuinf…

OSPF的协议特性

路由汇总的概念 l 路由汇总&#xff08; Route Aggregation &#xff09;&#xff0c;又称路由聚合&#xff08;Route Summarization&#xff09;&#xff0c;指的是把一组明细路由汇聚成一条汇总路由条目的操作 l 路由汇总能够减少路由条目数量、减小路由表规模&#xff0…

跳出框架:Facebook的创新策略与社交影响

1. 引言 在数字化时代&#xff0c;社交媒体如同一面镜子&#xff0c;反映出我们社会的多元性和变革。Facebook&#xff0c;作为这面镜子中最明亮的一个&#xff0c;不仅改变了人们的日常生活&#xff0c;更深刻地塑造了社交、文化和经济的面貌。本文将深入探讨Facebook的创新策…

RabbitMQ(高级)笔记

一、生产者可靠性 &#xff08;1&#xff09;生产者重连&#xff08;不建议使用&#xff09; logging:pattern:dateformat: MM-dd HH:mm:ss:SSSspring:rabbitmq:virtual-host: /hamllport: 5672host: 192.168.92.136username: hmallpassword: 123listener:simple:prefetch: 1c…