Tema destacado: Entra al canal IRC oficial de #elhacker.net
Autor
|
Tema: [AYUDA] formato PE obtener dirección fisica de secciones y mas cosas (Leído 1,282 veces)
|
mDrinky
Desconectado
Mensajes: 274
Miauuuuuuuuuuuuu dice el gato XD
|
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  . 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.
|
|
|
|
« Última modificación: 2 Septiembre 2011, 13:40 por Drinky94 »
|
En línea
|
|
|
|
|
|
Arkangel_0x7C5
Desconectado
Mensajes: 298
|
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
|
|
|
|
|
En línea
|
|
|
|
BlackZeroX (Astaroth)
Wiki
Desconectado
Mensajes: 2.824
I'Love...!¡.
|
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!¡.
|
|
|
|
|
En línea
|
|
|
|
mDrinky
Desconectado
Mensajes: 274
Miauuuuuuuuuuuuu dice el gato XD
|
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.
|
|
|
|
|
En línea
|
|
|
|
Queta
Desconectado
Mensajes: 250
|
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.
|
|
|
|
|
En línea
|
"Intenta no volverte un hombre de éxito, sino volverte un hombre de valor." Albert Einstein.
|
|
|
mDrinky
Desconectado
Mensajes: 274
Miauuuuuuuuuuuuu dice el gato XD
|
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 
|
|
|
|
|
En línea
|
|
|
|
|
|
|
|