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.
- 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 ;)
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
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!¡.
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.
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.
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 ;)
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