只申请一块sizeofimage的内存能否实现PE文件的拉伸

server/2024/10/9 11:16:22/


不能,别试了,浪费时间.
从最后一个节复制,也会被覆盖

BOOL StrechFileBuffer(__in char* m_fileName, __inout char** LPImageBuffer)
{FILE* file = (fopen(m_fileName, "rb"));if (file == NULL){printf("error :%d", GetLastError());return FALSE;}// 从文件头跳转到偏移0x3C位置if (fseek(file, 0x3C, SEEK_SET) != 0) {perror("fseek failed");fclose(file);return FALSE;}//读到e_lfannew的值LONG e_lfannew = 0;if (fread(&e_lfannew, sizeof(LONG), 1, file) != 1) {perror("fread failed");fclose(file);return FALSE;}//从文件开始跳到可选头的imagebase的位置 fseek(file, e_lfannew+sizeof(DWORD)+sizeof(IMAGE_FILE_HEADER)+0x38, SEEK_SET);DWORD sizeofimage = 0;fread(&sizeofimage, sizeof(DWORD), 1, file);//根据imagebase申请拉伸后的内存char* buffer = malloc(sizeofimage);if (buffer == NULL){perror("malloc failed");fclose(file);return FALSE;}memset(buffer, 0, sizeofimage);fseek(file, 0, SEEK_END);//到文件尾部DWORD fileSize = ftell(file);//获得文件的大小fseek(file, 0, SEEK_SET);//返回文件头部fread(buffer, 1, fileSize, file);//将文件读取到内存中fclose(file);//*已经将PE文件写到内存中了.但是需要分开拷贝,从最后的节开始拷贝数据*///看看是多少位的程序WORD magic = *(WORD*)(buffer + e_lfannew + sizeof(DWORD) + sizeof(IMAGE_FILE_HEADER));//得到文件头,为了获取节区的数量,和可选头的大小,便于定位到节表中PIMAGE_FILE_HEADER pFileHeader = (PIMAGE_FILE_HEADER)(buffer + e_lfannew + sizeof(DWORD));//跳到最后一个节区信息结构列表WORD NumberOfSections = pFileHeader->NumberOfSections;PIMAGE_SECTION_HEADER PLastSectionTable = (char*)pFileHeader +sizeof(IMAGE_FILE_HEADER)+ (pFileHeader->SizeOfOptionalHeader) + ((NumberOfSections -1) * sizeof(IMAGE_SECTION_HEADER));//if (magic == 0X10B)//{//	//这是32位的程序//}//else //{//	//这是64位的程序//}//循环// 从最后一个节区开始向前拷贝for (size_t i = pFileHeader->NumberOfSections; i > 0; i--) {size_t index = i - 1; // 计算索引(从0开始)PIMAGE_SECTION_HEADER currentSection = &PLastSectionTable[index]; // 获取当前节区的指针// 从文件中获取源地址和目标地址char* src = buffer + currentSection->PointerToRawData; // 文件中的数据char* dest = buffer + currentSection->VirtualAddress; // 内存中的目标地址// 计算拷贝的大小size_t sizeToCopy = currentSection->SizeOfRawData > currentSection->Misc.VirtualSize? currentSection->SizeOfRawData: currentSection->Misc.VirtualSize;// 拷贝数据memmove(dest, src, sizeToCopy);//内存被覆盖了}


 


http://www.ppmy.cn/server/127739.html

相关文章

Android Framework AMS(02)AMS启动及相关初始化5-8

该系列文章总纲链接:专题总纲目录 Android Framework 总纲 本章关键点总结 & 说明: 说明:本章节主要涉及systemserver启动AMS及初始化AMS相关操作。同时由于该部分内容过多,因此拆成2个章节,本章节是第二章节&…

雷池 WAF 如何配置才能正确获取到源 IP

经常有大哥反馈说雷池攻击日志里显示的 IP 有问题。 这里我来讲一下为什么一些情况下雷池显示的攻击 IP 会有问题。 问题说明 默认情况下,雷池会通过 HTTP 连接的 Socket 套接字读取客户端 IP。在雷池作为最外层网管设备的时候这没有问题,雷池获取到的…

中间件技术

在Java开发中,中间件技术是一种非常关键且广泛使用的技术。中间件通常被定义为位于操作系统、网络和数据库之上的软件层,用于简化分布式系统的开发、部署和管理。它们提供了一系列服务,如消息传递、事务管理、安全控制等,以帮助开…

【深海王国】初中生也能画的电路板?目录合集

Hi٩(๑ ^ o ^ ๑)۶, 各位深海王国的同志们,早上下午晚上凌晨好呀~辛勤工作的你今天也辛苦啦 (o゜▽゜)o☆ 今天大都督为大家带来系列文章《初中生也能画的电路板》,帮你一周内快速入门PCB设计,手把手教你从元器件库添加、电路原理图绘制、…

pytorch线性/非线性回归拟合

一、线性回归 1. 导入依赖库 import numpy as np import matplotlib.pyplot as plt import torch from torch import nn, optim from torch.autograd import Variable numpy:用来构建数据matplotlib.pyplot: 将构建好的数据可视化torch.nn&#xff1a…

Excel中查找某个值的位置,用位置取值

有 2022 年 1 月的日销售额统计表如下所示: 找出销售额最大的是哪一天,在 C2 单元格里输入: spl("E(?1).pmax(Sales)",A1:B32)返回结果 12 接着找出销售额最大的那天的前 5 天和后 5 天的销售额: spl("E(?1).…

漫谈前端:2025年框架是该选vue还是react?

相信很多前端小伙伴都有过纠结的时候,开始一个项目的时候是该选vue还是react。很多情况下,都是根据团队现有框架延续,或者是自身数量度。渐渐的公司组件和规范全基于某一种框架,虽然很爽但Allin难掉头。本文就浅浅的比较下vue和re…

OpenAI大模型API代码落地实战模拟本地知识库和多轮会话实现

学习OpenAI API的意义在于多方面的,不仅限于对技术本身的掌握,更关乎于对当前大模型领域发展趋势的理解与应用。 技术创新与引领: OpenAI作为大模型技术的先行者之一,其API设计和功能定义往往代表了行业内的最新趋势和技术标准。…