实现功能: 硬盘上的PE文件-》FileBuffer(原封不动的复制到内存)-》ImageBuffer(拉伸为4G空间存储模式)=>NewBuffer(又还原成FileBUffer)=>存盘(保存为PE文件)
//主程序 硬盘上的PE文件-》FileBuffer(原封不动的复制到内存)-》ImageBuffer(拉伸为4G空间存储模式)=>NewBuffer(又还原成FileBUffer)=>存盘(保存为PE文件)
#include <stdio.h>
#include <stdlib.h>
#include "func.h"
int main(void)
{
PrintNTHeaders();//打印PE头信息
LPVOID pFileBuffer = NULL;
LPVOID pImageBuffer = NULL;
LPVOID pNewBuffer = NULL;
size_t size;
if (!ReadPEFile(FILEPATH, &pFileBuffer))
{
printf("文件读取失败\n");
return;
}
printf("newbuffer开始的位置:%p \n", pNewBuffer);
CopyFileBufferToImageBuffer(pFileBuffer, &pImageBuffer);
size=CopyImageBufferToNewBuffer(pImageBuffer, &pNewBuffer);
printf("newbuffer里的pImageBuffer当前位置:%p \n", pNewBuffer);
MemeryTOFile(pNewBuffer, size, "D:/逆向学习/soure/b.exe");
getchar();
return 1;
}
//func.h 头文件
#pragma once
#include <Windows.h>
#define FILEPATH "D:/逆向学习/soure/HelloWorld.exe"
//函数声明
//**************************************************************************
//ReadPEFile:将文件读取到缓冲区
//参数说明:
//lpszFile 文件路径
//pFileBuffer 缓冲区指针
//返回值说明:
//读取失败返回0 否则返回实际读取的大小
//**************************************************************************
DWORD ReadPEFile(IN LPSTR lpszFile, OUT LPVOID* pFileBuffer);
//CopyFileBufferToImageBuffer:将文件从FileBuffer复制到ImageBuffer
//参数说明:
//pFileBuffer FileBuffer指针
//pImageBuffer ImageBuffer指针
//返回值说明:
//读取失败返回0 否则返回复制的大小
//**************************************************************************
DWORD CopyFileBufferToImageBuffer(IN LPVOID pFileBuffer, OUT LPVOID* pImageBuffer);
//**************************************************************************
//CopyImageBufferToNewBuffer:将ImageBuffer中的数据复制到新的缓冲区
//参数说明:
//pImageBuffer ImageBuffer指针
//pNewBuffer NewBuffer指针
//返回值说明:
//读取失败返回0 否则返回复制的大小
//**************************************************************************
DWORD CopyImageBufferToNewBuffer(IN LPVOID pImageBuffer, OUT LPVOID* pNewBuffer);
//MemeryTOFile:将内存中的数据复制到文件
//参数说明:
//pMemBuffer 内存中数据的指针
//size 要复制的大小
//lpszFile 要存储的文件路径
//返回值说明:
//读取失败返回0 否则返回复制的大小
//**************************************************************************
BOOL MemeryTOFile(IN LPVOID pMemBuffer, IN size_t size, OUT LPSTR lpszFile);
//打印PE文件信息
VOID PrintNTHeaders();
//func.c 函数的实现
#include "func.h"
#include <stdio.h>
DWORD ReadPEFile(LPSTR lpszFile, OUT LPVOID* pFileBuffer)
{
FILE* pFile = NULL;
DWORD fileSize = 0;
//LPVOID pFileBuffer = NULL;
//打开文件
pFile = fopen(lpszFile, "rb");
if (!pFile)
{
printf(" 无法打开 EXE 文件! ");
return NULL;
}