当前位置: 首页 > news >正文

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


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

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);//内存被覆盖了}


 

相关文章:

  • 【PyTorch】生成对抗网络
  • C++游戏开发详解:从入门到实践
  • c++primier第十二章类和动态内存
  • openKylin--安装 .net6.0
  • 锁住K8S集群版本和系统内核版本
  • 生产环境升级mysql流程及配置主从服务
  • 【深度学习】ubuntu系统下docker部署cvat的自动标注功能(yolov8 segmentation)
  • 投影算子 Projection
  • CMake构建学习笔记18-cpp-httplib库的构建
  • CC攻击和DDOS攻击的区别有哪些?
  • [单master节点k8s部署]22.构建EFK日志收集平台(一)
  • 河南人社厅:注册满两年可按条件认定副高
  • 【Python报错已解决】TypeError: object of type ‘complex‘ has no len()
  • 红绿灯倒计时读秒数字识别系统源码分享
  • VisualGLM-6B——原理与部署
  • JS中 map, filter, some, every, forEach, for in, for of 用法总结
  • android图片蒙层
  • Centos6.8 使用rpm安装mysql5.7
  • Consul Config 使用Git做版本控制的实现
  • Hibernate最全面试题
  • Linux gpio口使用方法
  • Next.js之基础概念(二)
  • react 代码优化(一) ——事件处理
  • React系列之 Redux 架构模式
  • Sublime text 3 3103 注册码
  • TCP拥塞控制
  • 百度小程序遇到的问题
  • 程序员最讨厌的9句话,你可有补充?
  • 回顾2016
  • 利用DataURL技术在网页上显示图片
  • 爬虫进阶 -- 神级程序员:让你的爬虫就像人类的用户行为!
  • 如何利用MongoDB打造TOP榜小程序
  • 微信公众号开发小记——5.python微信红包
  • 在GitHub多个账号上使用不同的SSH的配置方法
  • 支付宝花15年解决的这个问题,顶得上做出十个支付宝 ...
  • ​Linux Ubuntu环境下使用docker构建spark运行环境(超级详细)
  • ​软考-高级-系统架构设计师教程(清华第2版)【第20章 系统架构设计师论文写作要点(P717~728)-思维导图】​
  • #laravel部署安装报错loadFactoriesFrom是undefined method #
  • #Spring-boot高级
  • #微信小程序:微信小程序常见的配置传值
  • $.ajax()方法详解
  • (1)Map集合 (2)异常机制 (3)File类 (4)I/O流
  • (JSP)EL——优化登录界面,获取对象,获取数据
  • (web自动化测试+python)1
  • (二)JAVA使用POI操作excel
  • (附源码)ssm高校志愿者服务系统 毕业设计 011648
  • (附源码)计算机毕业设计ssm基于Internet快递柜管理系统
  • (七)Knockout 创建自定义绑定
  • (转)Android学习系列(31)--App自动化之使用Ant编译项目多渠道打包
  • (转载)(官方)UE4--图像编程----着色器开发
  • ..thread“main“ com.fasterxml.jackson.databind.JsonMappingException: Jackson version is too old 2.3.1
  • .NET BackgroundWorker
  • .NET Framework .NET Core与 .NET 的区别
  • .net开发引用程序集提示没有强名称的解决办法
  • /usr/lib/mysql/plugin权限_给数据库增加密码策略遇到的权限问题