Foro de elhacker.net

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:

Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <windows.h>
  4.  
  5. int main()
  6. {
  7. IMAGE_DOS_HEADER idh;
  8. IMAGE_FILE_HEADER ifh;
  9. IMAGE_OPTIONAL_HEADER ioh;
  10. IMAGE_SECTION_HEADER ish;
  11.  
  12. char ruta[] = "C:\\MS-DOC.exe";
  13.  
  14. FILE * archivo = fopen(ruta,"r+b");
  15. if (archivo == NULL)
  16. { // si no podemos abrri el archivo.
  17. printf("Error al abrir el archivo\n");
  18. system("PAUSE");
  19.  
  20. return 1;
  21. }
  22.  
  23. fread(&idh,0x40,1,archivo); // rellenamos IMAGE_DOS_HEADER
  24. if (idh.e_magic != IMAGE_DOS_SIGNATURE)
  25. { // comprovamos el e_magic para saber si es un EXE
  26. printf("No es un archivo EXE\n");
  27. system("PAUSE");
  28.  
  29. return 1;
  30. }
  31.  
  32. fseek(archivo,idh.e_lfanew + 4,SEEK_SET);
  33. fread(&ifh,0x14,1,archivo); // rellenamos IMAGE_FILE_HEADER
  34. fseek(archivo, idh.e_lfanew + 4 + sizeof(ifh), SEEK_SET);
  35. fread(&ioh,ifh.SizeOfOptionalHeader,1,archivo); // Leemos IMAGE_OPTIONAL_HEADER
  36.  
  37. int suma = 0;
  38.  
  39. for (int i=0;i<ifh.NumberOfSections;i++)
  40. {
  41. fseek(archivo, idh.e_lfanew + 4 + sizeof(ifh) + ifh.SizeOfOptionalHeader + (sizeof(ish)*(ifh.NumberOfSections-1)) + suma ,SEEK_SET);
  42. fread(&ish, sizeof(ish),1,archivo); // rellenamos IMAGE_SECTION_HEADER
  43.  
  44. printf("%x\n",(&ish)[i].Misc.PhysicalAddress);
  45.  
  46. suma += 0x28; // sumo 0x28 que es lo que ocupa ish para pasar a los datos de la siguiente sección.
  47. }
  48.  
  49. fclose(archivo);
  50.  
  51. system("PAUSE");
  52.  
  53. return 0;
  54. }

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
  • Usas una estructura ISH y el tamaño que tiene por defecto es: 0x28 bytes como vas guardar más de una sección ahí?, no tienes un array.
  • Te recomiendo trabajar con archivo proyectado en memoria y para las estructuras punteros.
  • + (sizeof(ish)*(ifh.NumberOfSections-1)) + suma; + suma está sobrando ya lo haces con la multiplicación.

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:
Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <windows.h>
  4.  
  5. int main()
  6. {
  7. IMAGE_DOS_HEADER idh;
  8. IMAGE_FILE_HEADER ifh;
  9. IMAGE_OPTIONAL_HEADER ioh;
  10. IMAGE_SECTION_HEADER ish;
  11.  
  12. char ruta[] = "C:\\MS-DOC.exe";
  13.  
  14. FILE * archivo = fopen(ruta,"r+b");
  15. if (archivo == NULL)
  16. { // si no podemos abrri el archivo.
  17. printf("Error al abrir el archivo\n");
  18. system("PAUSE");
  19.  
  20. return 1;
  21. }
  22.  
  23. fread(&idh,0x40,1,archivo); // rellenamos IMAGE_DOS_HEADER
  24. if (idh.e_magic != IMAGE_DOS_SIGNATURE)
  25. { // comprovamos el e_magic para saber si es un EXE
  26. printf("No es un archivo EXE\n");
  27. system("PAUSE");
  28.  
  29. return 1;
  30. }
  31.  
  32. fseek(archivo,idh.e_lfanew + 4,SEEK_SET);
  33. fread(&ifh,0x14,1,archivo); // rellenamos IMAGE_FILE_HEADER
  34. fseek(archivo, idh.e_lfanew + 4 + sizeof(ifh), SEEK_SET);
  35. fread(&ioh,ifh.SizeOfOptionalHeader,1,archivo); // Leemos IMAGE_OPTIONAL_HEADER
  36.  
  37. for (int i=0;i<ifh.NumberOfSections;i++)
  38. {
  39. fread(&ish, sizeof(ish),1,archivo);
  40. printf("%x\n",ish.Misc.PhysicalAddress);
  41. }
  42.  
  43. fclose(archivo);
  44.  
  45. system("PAUSE");
  46.  
  47. return 0;
  48. }

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
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