AGE_OPTIONAL_HEADER ImageOptionalHeader;
IMAGE_SECTION_HEADER ImageSectionHeader;
DWORD dwFileSize=0;
RtlZeroMemory(&;ImageDosHeader,sizeof(IMAGE_DOS_HEADER));
RtlZeroMemory(&;ImageNTHeaders,sizeof(IMAGE_NT_HEADERS));
RtlZeroMemory(&;ImageFileHeader,sizeof(IMAGE_FILE_HEADER));
RtlZeroMemory(&;ImageOptionalHeader,sizeof(IMAGE_OPTIONAL_HEADER));
RtlZeroMemory(&;ImageSectionHeader,sizeof(IMAGE_SECTION_HEADER));
strcpy(DestinationPEFile,FileName);
hDestinationFile=CreateFile(DestinationPEFile,
FILE_WRITE_DATA|FILE_READ_DATA,
FILE_SHARE_WRITE,NULL,OPEN_ALWAYS,FILE_ATTRIBUTE_ARCHIVE,NULL);
if(hDestinationFile==INVALID_HANDLE_VALUE)
{
// printf("\nCreateFile() fails!Can't open file. Please try again!\n");
// CloseHandle(hDestinationFile);
return TRUE;
}
else
{
dwFileSize=GetFileSize(hDestinationFile,NULL);
}
SetFilePointer(hDestinationFile,0,NULL,FILE_BEGIN); //Revert the file
pointer,this is very important.
ReadFile(hDestinationFile,&;ImageDosHeader,
sizeof(IMAGE_DOS_HEADER),&;NumberOfBytesRead,NULL);
if(NumberOfBytesRead!=sizeof(IMAGE_DOS_HEADER))
{
// printf("\nReadFile() fails! Can't get IMAGE_DOS_HEADER.\n");
CloseHandle(hDestinationFile);
return FALSE;
}
OffsetOfNewHeader=ImageDosHeader.e_lfanew; //File address of new exe header
SetFilePointer(hDestinationFile,(LONG)OffsetOfNewHeader,NULL,FILE_BEGIN);
ReadFile(hDestinationFile,
&;ImageNTHeaders,
sizeof(IMAGE_NT_HEADERS),&;NumberOfBytesRead,NULL); //Retrieve
IMAGE_NT_HEADERS
if(NumberOfBytesRead!=sizeof(IMAGE_NT_HEADERS))
{
CloseHandle(hDestinationFile);
return FALSE;
}
if(ImageNTHeaders.Signature!=0x00004550)
{
// printf("Error.\nPE signature is invalid!\n");
CloseHandle(hDestinationFile);
return FALSE;
}
SetFilePointer(hDestinationFile,OffsetOfNewHeader+4,NULL,FILE_BEGIN); //Set
the file pointer to point to IMAGE_FILE_HEADER
ReadFile(hDestinationFile,&;ImageFileHeader,
sizeof(IMAGE_FILE_HEADER),&;NumberOfBytesRead,NULL); //Retrieve
IMAGE_FILE_HEADER
if(NumberOfBytesRead!=sizeof(IMAGE_FILE_HEADER))
{
// printf("\nReadFile() fails! Can't get IMAGE_FILE_HEADER.\n");
CloseHandle(hDestinationFile);
return FALSE;
}
if(ImageFileHeader.NumberOfSections<1)
{
CloseHandle(hDestinationFile);
return FALSE;
}
if(dwFileSize<(sizeof(IMAGE_DOS_HEADER)+sizeof(IMAGE_NT_HEADERS)+sizeof(IMAGE_