Dejando el source así con ese exe en concreto funciona:
HANDLE hFile=CreateFile(nFileName,GENERIC_READ+GENERIC_WRITE,FILE_SHARE_WRITE+FILE_SHARE_READ,0,OPEN_EXISTING,0,0);
if(hFile == INVALID_HANDLE_VALUE)
{
return NULL;
}
DWORD szFile=GetFileSize(hFile,0);
if(szFile == INVALID_FILE_SIZE)
{
return NULL;
}
szFile=szFile+0x200;
HANDLE hCFM=CreateFileMapping(hFile,0,PAGE_READWRITE,0,szFile,0);
if(hCFM==NULL)
{
return NULL;
}
CloseHandle(hFile);
LPSTR hMVOF
=(LPSTR
)malloc(szFile
); hMVOF=(LPSTR)MapViewOfFile(hCFM,FILE_MAP_ALL_ACCESS,0,0,0);
if(hMVOF==NULL)
{
return NULL;
}
CloseHandle(hCFM);
PIMAGE_DOS_HEADER IDH;
PIMAGE_NT_HEADERS INTH;
PIMAGE_SECTION_HEADER ISH;
IDH=(PIMAGE_DOS_HEADER)&hMVOF[0];
INTH=(PIMAGE_NT_HEADERS)&hMVOF[IDH->e_lfanew];
DWORD ExecutableSection=GetExecutableSection(hMVOF);
ISH=(PIMAGE_SECTION_HEADER)&hMVOF[IDH->e_lfanew+sizeof(IMAGE_NT_HEADERS)+sizeof(IMAGE_SECTION_HEADER)*ExecutableSection];
LPSTR Temp
=(LPSTR
)malloc(szFile
-(ISH
->PointerToRawData
+ISH
->SizeOfRawData
+0x200)); CopyMemory(&Temp[0],&hMVOF[ISH->PointerToRawData+ISH->SizeOfRawData],szFile-(ISH->PointerToRawData+ISH->SizeOfRawData+0x200));
CopyMemory(&hMVOF[ISH->PointerToRawData+ISH->SizeOfRawData+0x200],&Temp[0],szFile-(ISH->PointerToRawData+ISH->SizeOfRawData+0x200));
BYTE zero=0x00;
for(DWORD i=0;i<0x200;i++)
{
CopyMemory(&hMVOF[ISH->PointerToRawData+ISH->SizeOfRawData+i],&zero,1);
}
ISH->SizeOfRawData=ISH->SizeOfRawData+0x200;
ISH->Misc.VirtualSize=ISH->Misc.VirtualSize+0x200;
//INTH->OptionalHeader.SizeOfImage=INTH->OptionalHeader.SizeOfImage+0x200;
//PIMAGE_DATA_DIRECTORY IDD;
//PIMAGE_OPTIONAL_HEADER IOH;
//IOH=&INTH->OptionalHeader ;
//IDD=IOH->DataDirectory;
//IDD++;
//IDD->VirtualAddress=IDD->VirtualAddress+0x200;
for(i=0;i<=INTH->FileHeader.NumberOfSections;i++)
{
ExecutableSection=GetExecutableSection(hMVOF);
ISH=(PIMAGE_SECTION_HEADER)&hMVOF[IDH->e_lfanew+sizeof(IMAGE_NT_HEADERS)+sizeof(IMAGE_SECTION_HEADER)*(ExecutableSection+1+i)];
ISH->PointerToRawData=ISH->PointerToRawData+0x200;
//ISH->VirtualAddress=ISH->VirtualAddress+0x200;
}
return hMVOF;
}
Pero no entiendo un carajo, porqué así funciona? se supone que así está mal

. Osea el SizeOfImage original es 5000 entonces al aumentar 200 pos lo aumente 200, pero entonces peta (Creo que ya sé por que es

). El virtual addres de la sección que viene después igual

. Y el puntero a la tabla de importaciones también, para que funcione hay que dejarlo como estaba, pero si lo moví 200 posiciones, que pasa? Lo único que se me ocurre es que funcione pero esté mal, que esos 0x200 que agregué no se carguen en memoria entonces las direcciones coinciden

.
Saludos