elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.
 
Inicio Ayuda Buscar Ingresar Registrarse
14 Febrero 2012, 10:46  


+  Foro de elhacker.net
|-+  Seguridad Informática
| |-+  Análisis y Diseño de Malware (Moderadores: Karcrack, [Zero])
| | |-+  [SRC][C] Añadir una sección
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: [SRC][C] Añadir una sección  (Leído 1,460 veces)
[Zero]
Moderador
***
Desconectado Desconectado

Mensajes: 1.050


CALL DWORD PTR DS:[0]


Ver Perfil WWW
[SRC][C] Añadir una sección
« en: 21 Julio 2009, 13:12 »

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
////////////////////////////////////////////////////////////////
//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
	DWORD newFileSize=0;
LPSTR Temp=AddSection(lpFileMaped,FileSize,newFileSize);
 

Saludos
En línea


“El Hombre, en su orgullo, creó a Dios a su imagen y semejanza.”
Nietzsche
Karcrack
Moderador
***
Desconectado Desconectado

Mensajes: 2.132


Se siente observado ¬¬'


Ver Perfil
Re: [SRC][C] Añadir una sección
« Respuesta #1 en: 21 Julio 2009, 15:05 »

Buen code :D

Solo una costa, que estaría bien que el nombre de la sección se pudiera establecer con un parámetro ;D, pero bueno, eso no es difícil :xD
En línea

[Zero]
Moderador
***
Desconectado Desconectado

Mensajes: 1.050


CALL DWORD PTR DS:[0]


Ver Perfil WWW
Re: [SRC][C] Añadir una sección
« Respuesta #2 en: 21 Julio 2009, 15:17 »

Ahí ya cada uno que 'parametree' lo que quiera, también seria recomendable hacerlo con el tamaño y las características. Ahora a ver si consigo mover la IAT a esa sección  :P.

Saludos
En línea


“El Hombre, en su orgullo, creó a Dios a su imagen y semejanza.”
Nietzsche
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  
Powered by SMF 1.1.16 | SMF © 2006-2008, Simple Machines