Autor
|
Tema: [AYUDA] formato PE obtener dirección fisica de secciones y mas cosas (Leído 5,092 veces)
|
fary
|
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"); 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"); 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. } 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 pm por Drinky94 »
|
En línea
|
Un byte a la izquierda.
|
|
|
The Swash
Desconectado
Mensajes: 194
Programmer
|
- 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
|
|
« Última modificación: 4 Septiembre 2011, 04:07 am por The Swash »
|
En línea
|
|
|
|
Arkangel_0x7C5
Desconectado
Mensajes: 361
|
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
Wiki
Desconectado
Mensajes: 3.158
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
|
The Dark Shadow is my passion.
|
|
|
fary
|
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"); 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"); 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); } return 0; }
saludos.
|
|
|
En línea
|
Un byte a la izquierda.
|
|
|
Queta
Desconectado
Mensajes: 267
|
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.
|
|
|
fary
|
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
|
Un byte a la izquierda.
|
|
|
|
|
Mensajes similares |
|
Asunto |
Iniciado por |
Respuestas |
Vistas |
Último mensaje |
|
|
Se puede saber la direccion fisica de NW
Programación Visual Basic
|
juanjoxx
|
3
|
2,091
|
1 Abril 2007, 20:12 pm
por juanjoxx
|
|
|
Direccion fisica del kernel
ASM
|
xv0
|
0
|
2,213
|
15 Agosto 2014, 20:38 pm
por xv0
|
|
|
[Ayuda] Secciones web desplegables y contraibles - Acordeon Vertical
Desarrollo Web
|
Graphixx
|
3
|
3,100
|
30 Agosto 2014, 17:49 pm
por Graphixx
|
|
|
Kerberos y el filtrado/autenticación por dirección física (MAC)
Seguridad
|
guiu
|
1
|
2,195
|
21 Febrero 2015, 17:02 pm
por DavEmmanuel
|
|
|
[Ayuda] Obtener direccion MAC desde script PHP
PHP
|
danny920825
|
9
|
6,697
|
24 Febrero 2017, 00:48 am
por engel lex
|
|