#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; //基址 void* 无类型指针无法进行加减就是因为不知道步长;注意指针的加减 的步长
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);
//printf("%x", phead.pSectionHeader->VirtualAddress);
}
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);
//printf("%u", 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
}
}
EXE的拉伸
最新推荐文章于 2024-09-13 17:43:09 发布
该博客主要探讨了PE文件的结构,包括DOS头、文件头、可选头和节头,并展示了如何从文件缓冲区初始化这些结构,然后将文件缓冲区转换为映像缓冲区,最后将结果写入新的文件。这个过程涉及内存映射、文件读写和指针操作。
摘要由CSDN通过智能技术生成