博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
PE文件从文件加载到内存,再从内存读取,然后存盘到文件
阅读量:7204 次
发布时间:2019-06-29

本文共 2332 字,大约阅读时间需要 7 分钟。

// mem.cpp : 定义控制台应用程序的入口点。//PE文件从文件加载到内存,再从内存读取,然后存盘到文件#include "stdafx.h"#include 
#include
#define PATH "C:\\Users\\Administrator\\Desktop\\MSG.exe"int Filelength(FILE *fp);int _tmain(int argc, _TCHAR* argv[]){ FILE *Fp; fopen_s(&Fp, PATH, "rb"); int FileSize = Filelength(Fp);//获取文件大小 char * FileBuffer = (char *)malloc(FileSize);//申请存放文件的内存空间 if (FileBuffer == NULL) { printf("申请iImageBuffer失败"); } fread_s(FileBuffer, FileSize, 1, FileSize, Fp); //将文件复制到内存中 //定位一下内存中的数据 各个头表 //定位标准PE头 PIMAGE_FILE_HEADER MyFileHeader; MyFileHeader = (PIMAGE_FILE_HEADER)(char *)(FileBuffer + *(int *)(FileBuffer + 0x3c) + 0x4); //定位可选PE头 PIMAGE_OPTIONAL_HEADER MyOptionalHeader; MyOptionalHeader = (PIMAGE_OPTIONAL_HEADER)((char *)MyFileHeader + 0x14); //定位节表 PIMAGE_SECTION_HEADER MySectionHeader; MySectionHeader = (PIMAGE_SECTION_HEADER)((char *)MyOptionalHeader + MyFileHeader->SizeOfOptionalHeader); //拉伸,也就是读到内存中的状态 char * ImageBuffer = (char *)malloc(MyOptionalHeader->SizeOfImage);//给拉伸申请内存空间 //ZeroMemory(ImageBuffer, MyOptionalHeader->SizeOfImage); if (ImageBuffer == NULL) { printf("申请iImageBuffer失败"); } memcpy(ImageBuffer, FileBuffer, MyOptionalHeader->SizeOfHeaders); for (int i = 0; i < MyFileHeader->NumberOfSections ; i++) { memcpy(ImageBuffer + MySectionHeader->VirtualAddress, FileBuffer + MySectionHeader->PointerToRawData, MySectionHeader->SizeOfRawData);// MySectionHeader++; } //压缩,为存盘做准备 char * NewBuffer = (char *)malloc(FileSize);//给压缩申请内存空间 if (NewBuffer == NULL) { printf("申请iImageBuffer失败"); } memcpy(NewBuffer, ImageBuffer, MyOptionalHeader->SizeOfHeaders); MySectionHeader = (PIMAGE_SECTION_HEADER)((char *)MyOptionalHeader + MyFileHeader->SizeOfOptionalHeader);//重新指一下,前面动过了 for (int i = 0; i < MyFileHeader->NumberOfSections; i++) { memcpy(NewBuffer + MySectionHeader->PointerToRawData, ImageBuffer + MySectionHeader->VirtualAddress, MySectionHeader->SizeOfRawData); MySectionHeader++; } FILE *nFp; fopen_s(&nFp, "C:\\Users\\Administrator\\Desktop\\CYP.exe", "wb"); fwrite(NewBuffer, FileSize, 1, nFp); //getchar(); fclose(nFp); free(FileBuffer); free(ImageBuffer); free(NewBuffer); return 0;}//获取文件大小int Filelength(FILE *fp){ int num; fseek(fp, 0, SEEK_END); num = ftell(fp); fseek(fp, 0, SEEK_SET); return num;}

 

转载于:https://www.cnblogs.com/wumac/p/5270052.html

你可能感兴趣的文章
JAVA并发,BlockingQuene
查看>>
书单丨打开投资理财之路,从这25本书开始
查看>>
有关httpContext.Current.Session[值] 取值的问题
查看>>
JQuery连接地址
查看>>
eclipse/myeclipse 中,如何删除已经下载过的插件(举例:删除scala ide)
查看>>
课程设计__分数的计算
查看>>
Poj (3239),m皇后问题
查看>>
删除重复的记录
查看>>
装饰模式(Decorator)
查看>>
yarn的学习-1-包管理工具
查看>>
学习四种类型转换
查看>>
maomao的每日动向
查看>>
Ubuntu下BOINC服务器安装(step8失败)
查看>>
C++消息框架-基于sigslot
查看>>
ORM-数据库命令操作包装实例对象学习
查看>>
转:深入理解css中position属性及z-index属性
查看>>
判断一个点是否在指定三角形内(1)
查看>>
Linux 日志
查看>>
cocos2dx使用CocosBuilder(编辑器)完成基础骨骼动画
查看>>
vue 移动端适配 ,px自动转换rem
查看>>