Código: Seleccionar todo
////////////////////////////////////////////////////////////////
//Obtiene la sección ejecutable de un archivo
////////////////////////////////////////////////////////////////
DWORD GetExecutableSection(LPSTR lpFileMaped)
{
PIMAGE_DOS_HEADER IDH;
PIMAGE_NT_HEADERS INTH;
PIMAGE_SECTION_HEADER ISH;
BOOL flag=FALSE;
IDH=(PIMAGE_DOS_HEADER)&lpFileMaped[0];
INTH=(PIMAGE_NT_HEADERS)&lpFileMaped[IDH->e_lfanew];
//Recorremos todas las secciones
for(DWORD i=0;i<INTH->FileHeader.NumberOfSections;i++)
{
ISH=(PIMAGE_SECTION_HEADER)&lpFileMaped[IDH->e_lfanew+sizeof(IMAGE_NT_HEADERS)+sizeof(IMAGE_SECTION_HEADER)*i];
//Comprobamos si se trata de una sección de código
if((ISH->Characteristics&0x20000000)==0x20000000)
{
return i;
}
}
return -1;
}
////////////////////////////////////////////////////////////////
//Añade una nueva sección al final de ejecutable
////////////////////////////////////////////////////////////////
LPSTR AddSection(LPSTR lpFileMaped,DWORD FileSize,DWORD &newFileSize)
{
PIMAGE_DOS_HEADER IDH;
PIMAGE_NT_HEADERS INTH;
PIMAGE_SECTION_HEADER ISH;
DWORD NewSectionSize=0x200;
LPSTR Temp=(LPSTR)malloc(FileSize+NewSectionSize);
CopyMemory(&Temp[0],&lpFileMaped[0],FileSize);
memset(&Temp[FileSize],0,NewSectionSize);
IDH=(PIMAGE_DOS_HEADER)&Temp[0];
INTH=(PIMAGE_NT_HEADERS)&Temp[IDH->e_lfanew];
//Ajustamos el VirtualSize de las Secciones
for(DWORD i=0;i<INTH->FileHeader.NumberOfSections;i++)
{
ISH=(PIMAGE_SECTION_HEADER)&Temp[IDH->e_lfanew+sizeof(IMAGE_NT_HEADERS)+sizeof(IMAGE_SECTION_HEADER)*i];
ISH->Misc.VirtualSize=ISH->SizeOfRawData;
}
DWORD NumberOfSections=INTH->FileHeader.NumberOfSections;
DWORD e_lfanew=IDH->e_lfanew;
ISH=(PIMAGE_SECTION_HEADER)&Temp[IDH->e_lfanew+sizeof(IMAGE_NT_HEADERS)+sizeof(IMAGE_SECTION_HEADER)*(NumberOfSections-1)];
DWORD LastVirtualOffset=ISH->VirtualAddress;
CopyMemory(&Temp[IDH->e_lfanew-0x28],&lpFileMaped[IDH->e_lfanew],sizeof(IMAGE_NT_HEADERS)+sizeof(IMAGE_SECTION_HEADER)*INTH->FileHeader.NumberOfSections);
memset(&Temp[e_lfanew+sizeof(IMAGE_NT_HEADERS)+sizeof(IMAGE_SECTION_HEADER)*(NumberOfSections-1)],0,0x28);
IDH->e_lfanew=IDH->e_lfanew-0x28;
INTH=(PIMAGE_NT_HEADERS)&Temp[IDH->e_lfanew];
ISH=(PIMAGE_SECTION_HEADER)&Temp[e_lfanew+sizeof(IMAGE_NT_HEADERS)+sizeof(IMAGE_SECTION_HEADER)*(NumberOfSections-1)];
BYTE SectionName[8]=".VM_SEC";
CopyMemory(ISH->Name,SectionName,8);
ISH->SizeOfRawData=NewSectionSize;
ISH->PointerToRawData=FileSize;
ISH->Characteristics=0xE0000020;
ISH->VirtualAddress=LastVirtualOffset+INTH->OptionalHeader.SectionAlignment;
ISH->Misc.VirtualSize=NewSectionSize;
INTH->FileHeader.NumberOfSections=INTH->FileHeader.NumberOfSections+1;
INTH->OptionalHeader.SizeOfImage=ISH->VirtualAddress+ISH->Misc.VirtualSize;
newFileSize=FileSize+NewSectionSize;
return Temp;
}
Código: Seleccionar todo
DWORD newFileSize=0;
LPSTR Temp=AddSection(lpFileMaped,FileSize,newFileSize);