Test Foro de elhacker.net SMF 2.1

Seguridad Informática => Análisis y Diseño de Malware => Mensaje iniciado por: fary en 2 Septiembre 2011, 13:38 PM

Título: [AYUDA] formato PE obtener dirección fisica de secciones y mas cosas
Publicado por: fary en 2 Septiembre 2011, 13:38 PM
Buenas, bueno al fin he decidido meterme de lleno a aprender el formato PE y tenia pensado agrandar  la sección de código par aintroducir un pequeño opcode con un msgbox y tal una chorradilla pero para ensayar no me parece mal  >:D.
El problema viene cuando no puedo detectar el ISH bien de todas las secciones, solo lo detecta bien de la primera, el código que he creado es este:

#include <stdio.h>
#include <stdlib.h>
#include <windows.h>

int main()
{
IMAGE_DOS_HEADER idh;
IMAGE_FILE_HEADER ifh;
IMAGE_OPTIONAL_HEADER ioh;
IMAGE_SECTION_HEADER ish;

char ruta[] = "C:\\MS-DOC.exe";

FILE * archivo = fopen(ruta,"r+b");
if (archivo == NULL)
{ // si no podemos abrri el archivo.
printf("Error al abrir el archivo\n");
system("PAUSE");

return 1;
}

fread(&idh,0x40,1,archivo); // rellenamos IMAGE_DOS_HEADER
if (idh.e_magic != IMAGE_DOS_SIGNATURE)
{ // comprovamos el e_magic para saber si es un EXE
printf("No es un archivo EXE\n");
system("PAUSE");

return 1;
}

fseek(archivo,idh.e_lfanew + 4,SEEK_SET);
fread(&ifh,0x14,1,archivo); // rellenamos IMAGE_FILE_HEADER
fseek(archivo, idh.e_lfanew + 4 + sizeof(ifh), SEEK_SET);
fread(&ioh,ifh.SizeOfOptionalHeader,1,archivo); // Leemos IMAGE_OPTIONAL_HEADER

int suma = 0;

for (int i=0;i<ifh.NumberOfSections;i++)
{
fseek(archivo, idh.e_lfanew + 4 + sizeof(ifh) + ifh.SizeOfOptionalHeader + (sizeof(ish)*(ifh.NumberOfSections-1)) + suma ,SEEK_SET);
fread(&ish, sizeof(ish),1,archivo); // rellenamos IMAGE_SECTION_HEADER

printf("%x\n",(&ish)[i].Misc.PhysicalAddress);

suma += 0x28; // sumo 0x28 que es lo que ocupa ish para pasar a los datos de la siguiente sección.
}

fclose(archivo);

system("PAUSE");

return 0;
}


Nose que andará mal por ahi si me peuden hechar una mano sería de gran ayuda >:(

un saludo.
Título: Re: [AYUDA] formato PE obtener dirección fisica de secciones y mas cosas
Publicado por: The Swash en 4 Septiembre 2011, 04:01 AM

Un saludo ;)
Título: Re: [AYUDA] formato PE obtener dirección fisica de secciones y mas cosas
Publicado por: Arkangel_0x7C5 en 4 Septiembre 2011, 16:31 PM
yo opino como The swash.

ademas, el fseek y suma sobra ya que fread avanza lo el numero de bytes que lee. 2 llamadas consecutivas de fread no leeran los mismos datos.

Saludos
Título: Re: [AYUDA] formato PE obtener dirección fisica de secciones y mas cosas
Publicado por: BlackZeroX en 5 Septiembre 2011, 02:34 AM
Me gustaria ver un diagrama del formato PE... se que son estructuras pero lo grafico se analiza mas facil mente xP, quizas tambien te sirva graficarlo Drinky94

P.D.: solo he dicho un Consejo/Opinion ¬¬"

Dulces Lunas!¡.
Título: Re: [AYUDA] formato PE obtener dirección fisica de secciones y mas cosas
Publicado por: fary en 5 Septiembre 2011, 13:21 PM
Ya lo e conseguido, muchas gracias a todos...
El código arreglado es el siguiente:
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>

int main()
{
IMAGE_DOS_HEADER idh;
IMAGE_FILE_HEADER ifh;
IMAGE_OPTIONAL_HEADER ioh;
IMAGE_SECTION_HEADER ish;

char ruta[] = "C:\\MS-DOC.exe";

FILE * archivo = fopen(ruta,"r+b");
if (archivo == NULL)
{ // si no podemos abrri el archivo.
printf("Error al abrir el archivo\n");
system("PAUSE");

return 1;
}

fread(&idh,0x40,1,archivo); // rellenamos IMAGE_DOS_HEADER
if (idh.e_magic != IMAGE_DOS_SIGNATURE)
{ // comprovamos el e_magic para saber si es un EXE
printf("No es un archivo EXE\n");
system("PAUSE");

return 1;
}

fseek(archivo,idh.e_lfanew + 4,SEEK_SET);
fread(&ifh,0x14,1,archivo); // rellenamos IMAGE_FILE_HEADER
fseek(archivo, idh.e_lfanew + 4 + sizeof(ifh), SEEK_SET);
fread(&ioh,ifh.SizeOfOptionalHeader,1,archivo); // Leemos IMAGE_OPTIONAL_HEADER

for (int i=0;i<ifh.NumberOfSections;i++)
{
fread(&ish, sizeof(ish),1,archivo);
printf("%x\n",ish.Misc.PhysicalAddress);
}

fclose(archivo);

system("PAUSE");

return 0;
}


saludos.
Título: Re: [AYUDA] formato PE obtener dirección fisica de secciones y mas cosas
Publicado por: Queta en 5 Septiembre 2011, 13:40 PM
Puedes programar la entrada y salida de ficheros, y básicamente todo el código, con las funciones de la API, así te ahorras la C Runtime Library y reduces el peso del ejecutable.
Título: Re: [AYUDA] formato PE obtener dirección fisica de secciones y mas cosas
Publicado por: fary en 5 Septiembre 2011, 16:21 PM
Cita de: Queta en  5 Septiembre 2011, 13:40 PM
Puedes programar la entrada y salida de ficheros, y básicamente todo el código, con las funciones de la API, así te ahorras la C Runtime Library y reduces el peso del ejecutable.

Cierto pero bueno yo ya lo hice asi ;)
Título: Re: [AYUDA] formato PE obtener dirección fisica de secciones y mas cosas
Publicado por: The Swash en 5 Septiembre 2011, 18:33 PM
http://www.sendspace.com/file/eiwwul

Ahí les dejo un código en C con todas las estructuras hechas a mano y la lectura de cada campo ;).

Un saludo.
The Swash