Bueno, éste método para añadir una sección es un tanto chapucera pero bueno :P. Luego si tengo tiempo hago otra para agrandar la cabecera PE y ahí poder añadir las secciones que quieras como es debido, pero de momento esto sirve :xD.

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;
}
Uso:

Código: Seleccionar todo

	DWORD newFileSize=0;
	LPSTR Temp=AddSection(lpFileMaped,FileSize,newFileSize);
Saludos
Responder

Volver a “Fuentes”