#pragma warning(suppress : 4996)
#include "ImageBuffer.h"
char inputPath[] = "C:\\ipmsg\\Feige\\Feige.exe";
char outputPath[] = "C:\\ipmsg\\Feige\\Feige2.exe";
LPSTR FILEPATH = inputPath;
LPSTR OUT_FILEPATH = outputPath;
int main(void)
{
LPVOID pFileBuffer;
LPVOID pImageBuffer;
LPVOID pNewBuffer;
int size = 0;
ReadPEFile(FILEPATH,&pFileBuffer);
CopyFileBufferToImageBuffer(pFileBuffer,&pImageBuffer);
size = CopyImageBufferToNewBuffer(pImageBuffer,&pNewBuffer);
MemeryTOFile(pNewBuffer, size, OUT_FILEPATH);
free(pFileBuffer);
free(pImageBuffer);
free(pNewBuffer);
return 0;
}
DWORD ReadPEFile(IN LPSTR lpszFile, OUT LPVOID* pFileBuffer)
{
FILE* pFile = NULL;
DWORD fileSize = 0;
PIMAGE_DOS_HEADER pDosHeader = NULL;
PIMAGE_NT_HEADERS pNTHeader = NULL;
PIMAGE_FILE_HEADER pPEHeader = NULL;
PIMAGE_OPTIONAL_HEADER32 pOptionHeader = NULL;
PIMAGE_SECTION_HEADER pSectionHeader = NULL;
char tableName[9] = { 0 };
pFile = fopen(lpszFile, "rb");
if (!pFile)
{
printf("无法打开EXE文件\n");
return NULL;
}
fseek(pFile, 0, SEEK_END);
fileSize = ftell(pFile);
fseek(pFile, 0, SEEK_SET);
*pFileBuffer = (LPVOID)malloc(fileSize);
if (!(*pFileBuffer) )
{
printf("空间分配失败!\n");
fclose(pFile);
return NULL;
}
memset(*pFileBuffer,0, fileSize);
size_t n = fread(*pFileBuffer, fileSize, 1, pFile);
if (!n)
{
printf("读取数据失败!\n");
free(*pFileBuffer);
fclose(pFile);
return NULL;
}
fclose(pFile);
if (*((PWORD)(*pFileBuffer)) != IMAGE_DOS_SIGNATURE)
{
printf("不是有效地MZ标志\n");
free(*pFileBuffer);
return 0;
}
pDosHeader = (PIMAGE_DOS_HEADER)(*pFileBuffer);
if (*((PDWORD)((DWORD)(*pFileBuffer) + pDosHeader->e_lfanew)) != IMAGE_NT_SIGNATURE)
{
printf("不是有效的PE标志\n");
free(*pFileBuffer);
return 0;
}
pNTHeader = (PIMAGE_NT_HEADERS)((DWORD)(*pFileBuffer) + pDosHeader->e_lfanew);
pPEHeader = (PIMAGE_FILE_HEADER)(((DWORD)pNTHeader) + 4);
pOptionHeader = (PIMAGE_OPTIONAL_HEADER32)((DWORD)pPEHeader + IMAGE_SIZEOF_FILE_HEADER);
pSectionHeader = (PIMAGE_SECTION_HEADER)((char*)pOptionHeader + (pPEHeader->SizeOfOptionalHeader));
for (int i = 0; i < (pPEHeader->NumberOfSections); i++)
{
char* c = (char*)pSectionHeader;
for (int n = 0; n < 8; n++)
{
tableName[n] = *c;
c++;
}
pSectionHeader++;
}
printf("****************************************\n");
return fileSize;
}
DWORD CopyFileBufferToImageBuffer(IN LPVOID pFileBuffer, OUT LPVOID* pImageBuffer)
{
DWORD ImageSize = 0;
char* dest = NULL;
char* src = NULL;
PIMAGE_DOS_HEADER pDosHeader = NULL;
PIMAGE_NT_HEADERS pNTHeader = NULL;
PIMAGE_FILE_HEADER pPEHeader = NULL;
PIMAGE_OPTIONAL_HEADER32 pOptionHeader = NULL;
PIMAGE_SECTION_HEADER pSectionHeader = NULL;
pDosHeader = (PIMAGE_DOS_HEADER)pFileBuffer;
pNTHeader = (PIMAGE_NT_HEADERS)((DWORD)pFileBuffer + pDosHeader->e_lfanew);
pPEHeader = (PIMAGE_FILE_HEADER)(((DWORD)pNTHeader) + 4);
pOptionHeader = (PIMAGE_OPTIONAL_HEADER32)((DWORD)pPEHeader + IMAGE_SIZEOF_FILE_HEADER);
pSectionHeader = (PIMAGE_SECTION_HEADER)((char*)pOptionHeader + (pPEHeader->SizeOfOptionalHeader));
ImageSize = (pOptionHeader->SizeOfImage);
*pImageBuffer = malloc(ImageSize);
if (!(*pImageBuffer))
{
printf("空间分配失败!\n");
return 0;
}
memset(*pImageBuffer, 0, ImageSize);
dest = (char*)*pImageBuffer;
src = (char*)pFileBuffer;
memcpy(dest,src,(pOptionHeader->SizeOfHeaders));
for (int i = 0; i < (pPEHeader->NumberOfSections); i++)
{
dest = NULL;
src = NULL;
src = (char*)((char*)pFileBuffer + pSectionHeader->PointerToRawData);
dest = (char*)((char*)*pImageBuffer + pSectionHeader->VirtualAddress);
memcpy(dest, src, (pSectionHeader->SizeOfRawData));
pSectionHeader++;
}
printf("****************************************\n");
printf("%x\n", ImageSize);
return ImageSize;
}
DWORD CopyImageBufferToNewBuffer(IN LPVOID pImageBuffer, OUT LPVOID* pNewBuffer)
{
DWORD NewSize = 0;
char* dest = NULL;
char* src = NULL;
PIMAGE_DOS_HEADER pDosHeader = NULL;
PIMAGE_NT_HEADERS pNTHeader = NULL;
PIMAGE_FILE_HEADER pPEHeader = NULL;
PIMAGE_OPTIONAL_HEADER32 pOptionHeader = NULL;
PIMAGE_SECTION_HEADER pSectionHeader = NULL;
PIMAGE_SECTION_HEADER pLastSectionHeader = NULL;
pDosHeader = (PIMAGE_DOS_HEADER)pImageBuffer;
pNTHeader = (PIMAGE_NT_HEADERS)((DWORD)pImageBuffer + pDosHeader->e_lfanew);
pPEHeader = (PIMAGE_FILE_HEADER)(((DWORD)pNTHeader) + 4);
pOptionHeader = (PIMAGE_OPTIONAL_HEADER32)((DWORD)pPEHeader + IMAGE_SIZEOF_FILE_HEADER);
pSectionHeader = (PIMAGE_SECTION_HEADER)((char*)pOptionHeader + (pPEHeader->SizeOfOptionalHeader));
pLastSectionHeader = pSectionHeader + ((pPEHeader->NumberOfSections) - 1);
NewSize = pLastSectionHeader->PointerToRawData + pLastSectionHeader->SizeOfRawData;
*pNewBuffer = malloc(NewSize);
if (!(*pNewBuffer))
{
printf("空间分配失败!\n");
return 0;
}
memset(*pNewBuffer, 0, NewSize);
dest = (char*)*pNewBuffer;
src = (char*)pImageBuffer;
memcpy(dest, src, (pOptionHeader->SizeOfHeaders));
for (int i = 0; i < (pPEHeader->NumberOfSections); i++)
{
dest = NULL;
src = NULL;
src = (char*)((char*)pImageBuffer + pSectionHeader->VirtualAddress);
dest = (char*)((char*)*pNewBuffer + pSectionHeader->PointerToRawData);
memcpy(dest, src, (pSectionHeader->SizeOfRawData));
pSectionHeader++;
}
printf("****************************************\n");
printf("%x\n", NewSize);
return NewSize;
}
BOOL MemeryTOFile(IN LPVOID pMemBuffer, IN size_t size, OUT LPSTR lpszFile)
{
FILE* p = NULL;
int i = 0;
p = fopen(lpszFile,"wb+");
if (!p)
{
printf("无法创建文件\n");
return 0;
}
i = fwrite(pMemBuffer,size, 1,p);
printf("****************************************\n");
printf("%x\n", i);
fclose(p);
return i;
}