#include<stdio.h>
#include<Windows.h>
struct
{
PIMAGE_DOS_HEADER pDosHeader;
PIMAGE_FILE_HEADER pFileHeader;
PIMAGE_OPTIONAL_HEADER pOptionHeader;
PIMAGE_SECTION_HEADER pSectionHeader;
}phead;
void initData(LPVOID pbuffer)
{
phead.pDosHeader = (PIMAGE_DOS_HEADER) pbuffer;
phead.pFileHeader = (PIMAGE_FILE_HEADER)((char*)pbuffer + phead.pDosHeader->e_lfanew + 4);
phead.pOptionHeader = (PIMAGE_OPTIONAL_HEADER)((char*)pbuffer+phead.pDosHeader->e_lfanew + 24);
phead.pSectionHeader = (PIMAGE_SECTION_HEADER)((char*)phead.pOptionHeader + 224);
}
void ReadToFileBuffer(LPVOID *pbuffer)
{
const char * path = "C:\\Users\\我\\Desktop\\gifcam.exe";
FILE* fp = fopen(path, "rb+");
if (fp == NULL)
printf(" file fail open");
fseek(fp, 0, SEEK_END);
unsigned int Size = ftell(fp);
*pbuffer = malloc(Size);
memset(*pbuffer, 0, Size);
fseek(fp, 0, SEEK_SET);
fread(*pbuffer, Size, 1, fp);
fclose(fp);
}
void FilebufToImagebuf(LPVOID *pDesbuffer,LPVOID pSrcbuffer)
{
PIMAGE_SECTION_HEADER temp;
temp = phead.pSectionHeader;
*pDesbuffer = malloc(phead.pOptionHeader->SizeOfImage);
memset(*pDesbuffer, 0, phead.pOptionHeader->SizeOfImage);
memcpy(*pDesbuffer, pSrcbuffer, phead.pOptionHeader->SizeOfHeaders);
for (int i = 0; i < phead.pFileHeader->NumberOfSections; i++)
{
memcpy((char*)*pDesbuffer + temp->VirtualAddress,
(char*)pSrcbuffer + temp->PointerToRawData,
temp->SizeOfRawData);
temp += 1;
}
}
void WriteBufToFile(LPVOID pbuffer)
{
FILE* fp;
const char* path = "C:\\Users\\我\\Desktop\\Strectchgifcam.exe";
fp = fopen(path, "wb+");
fwrite(pbuffer, sizeof(char), phead.pOptionHeader->SizeOfImage, fp);
fclose(fp);
}
int main()
{
byte *FileBuffer;
byte *ImageBuffer;
ReadToFileBuffer(&FileBuffer);
initData(FileBuffer);
FilebufToImagebuf(&ImageBuffer, FileBuffer);
WriteBufToFile(ImageBuffer);
free(FileBuffer);
free(ImageBuffer);
_asm{
nop
nop
}
}