zoukankan      html  css  js  c++  java
  • PE文件从文件加载到内存,再从内存读取,然后存盘到文件

    // mem.cpp : 定义控制台应用程序的入口点。
    //PE文件从文件加载到内存,再从内存读取,然后存盘到文件
    
    #include "stdafx.h"
    #include <windows.h>
    #include <winnt.h>
    
    #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;
    }
    
  • 相关阅读:
    js 判断所选时间(或者当前时间)是否在某一时间段的实现代码
    js 日期比较大小,js判断日期是否在区间内,js判断时间段是否在另外一个时间段内
    tfs 2013 利用 web deploy 完成asp.net站点自动发布
    Web Deploy 服务器安装设置与使用
    MD5加密解密类(asp.net)&使用MD5过时处理
    C# 中Web.config文件的读取与写入
    巧用Ajax的beforeSend 提高用户体验
    一个通用的分页类
    EventSource 对象用于接收服务器发送事件通知,是网页自动获取来自服务器的更新
    Java WebSockets
  • 原文地址:https://www.cnblogs.com/wumac/p/5270052.html
Copyright © 2011-2022 走看看