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, 06:25  


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

Mensajes: 1.050


CALL DWORD PTR DS:[0]


Ver Perfil WWW
[SRC][C] Ampliar Sección Ejecutable
« en: 21 Julio 2009, 13:03 »

Bueno, una de las funciones que terminamos del VM (siempre haciendo publicidad  :xD). Muchas funciones no las publicaremos antes de sacar el VM, pero ésta no lo perjudicará  :P.

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 espacio al final de la sección ejecutable
////////////////////////////////////////////////////////////////
LPSTR AddExecutableSectionSize(LPSTR lpFileMaped,DWORD FileSize,DWORD minSize,DWORD &newFileSize)
{
PIMAGE_DOS_HEADER IDH;
PIMAGE_NT_HEADERS INTH;
PIMAGE_SECTION_HEADER ISH;
 
IDH=(PIMAGE_DOS_HEADER)&lpFileMaped[0];
INTH=(PIMAGE_NT_HEADERS)&lpFileMaped[IDH->e_lfanew];
 
//Calculo el tamaño a añadir
DWORD SizeToAdd=0;
while(SizeToAdd<minSize)
{
SizeToAdd=SizeToAdd+INTH->OptionalHeader.FileAlignment;
}
 
DWORD ExecutableSection=GetExecutableSection(lpFileMaped);
ISH=(PIMAGE_SECTION_HEADER)&lpFileMaped[IDH->e_lfanew+sizeof(IMAGE_NT_HEADERS)+sizeof(IMAGE_SECTION_HEADER)*ExecutableSection];
 
//Si intetamos añadir demasiado, retornamos null
if(ISH->Misc.VirtualSize+SizeToAdd>INTH->OptionalHeader.SectionAlignment)
{
return NULL;
}
 
//Copio la parte del archivo que no cambia su posición
LPSTR Temp=(LPSTR)malloc(FileSize+SizeToAdd);
CopyMemory(&Temp[0],&lpFileMaped[0],ISH->PointerToRawData+ISH->SizeOfRawData);
 
//Copio 0's para rellenar el tamaño que añado a la sección
memset(&Temp[ISH->PointerToRawData+ISH->SizeOfRawData],0,SizeToAdd);
 
//Copio el resto de datos que si cambian su posición
CopyMemory(&Temp[ISH->PointerToRawData+ISH->SizeOfRawData+SizeToAdd],&lpFileMaped[ISH->PointerToRawData+ISH->SizeOfRawData],FileSize-(ISH->PointerToRawData+ISH->SizeOfRawData));
 
IDH=(PIMAGE_DOS_HEADER)&Temp[0];
INTH=(PIMAGE_NT_HEADERS)&Temp[IDH->e_lfanew];
ISH=(PIMAGE_SECTION_HEADER)&Temp[IDH->e_lfanew+sizeof(IMAGE_NT_HEADERS)+sizeof(IMAGE_SECTION_HEADER)*ExecutableSection];
 
//Ajusto el SizeOfRawData de la sección a la que añado espacio
ISH->SizeOfRawData=ISH->SizeOfRawData+SizeToAdd;
 
//Ajustamos los punteros y tamaños de las secciones que movimos
for(DWORD i=ExecutableSection+1;i<INTH->FileHeader.NumberOfSections;i++)
{
ISH=(PIMAGE_SECTION_HEADER)&Temp[IDH->e_lfanew+sizeof(IMAGE_NT_HEADERS)+sizeof(IMAGE_SECTION_HEADER)*i];
ISH->PointerToRawData=ISH->PointerToRawData+SizeToAdd;
}
 
//Ajustamos el VirtualSize de todas las Secciones y obtenemos el SizeOfImage
DWORD SizeOfImage=0;
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;
if(ISH->VirtualAddress>SizeOfImage)
{
SizeOfImage=ISH->VirtualAddress+ISH->Misc.VirtualSize;
}
}
 
//Ajustamos el SizeOfImage
INTH->OptionalHeader.SizeOfImage=SizeOfImage;
 
//Retornamos el puntero al archivo y el nuevo tamaño
newFileSize=FileSize+SizeToAdd;
return Temp;
}
 

Modo de uso:
Código
	DWORD newFileSize=0;
LPSTR Temp=AddExecutableSectionSize(lpFileMaped,FileSize,0x800,newFileSize);
 

Saludos
« Última modificación: 21 Julio 2009, 13:16 por Hacker_Zero » 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] Ampliar Sección Ejecutable
« Respuesta #1 en: 21 Julio 2009, 15:08 »

Ya que haces propaganda hazla bien... :P

VM  = Virus Metamorph

+Info:
Código:
https://foro.elhacker.net/analisis_y_diseno_de_malware/virus_metamorph_v10_beta-t252898.0.html


Buen código, cuando estuve probandolo pensé que fallaría al llamar punteros y tal, ya que se desplazan los datos, pero no! Funciona al 100% :D :D!

Código recomendado ;)
En línea

[Zero]
Moderador
***
Desconectado Desconectado

Mensajes: 1.050


CALL DWORD PTR DS:[0]


Ver Perfil WWW
Re: [SRC][C] Ampliar Sección Ejecutable
« Respuesta #2 en: 21 Julio 2009, 15:14 »

Buen código, cuando estuve probandolo pensé que fallaría al llamar punteros y tal, ya que se desplazan los datos, pero no! Funciona al 100% :D :D!

Al final si me dió problemas, por eso tiene un límite, sólo se puede agrandar la sección hasta que:

Código
	//Si intetamos añadir demasiado, retornamos null
if(ISH->Misc.VirtualSize+SizeToAdd>INTH->OptionalHeader.SectionAlignment)
{
return NULL;
}

Ya que si quieres añadir más sería necesario cambiar los VirtualOffset de las secciones que se cargan despues y ahí como dices, habría problemas con todo, los call's a las API's, y todo lo que haga referencia a una dirección de memoria. En algunos exe's no es demasiado lo que se puede agrandar, pero bueno, a veces te libra de tener que agregar sección.

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:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Intento de agregar sección a ejecutable
Análisis y Diseño de Malware
mDrinky 6 1,019 Último mensaje 7 Octubre 2011, 17:59
por The Swash
Powered by SMF 1.1.16 | SMF © 2006-2008, Simple Machines