elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Arreglado, de nuevo, el registro del warzone (wargame) de EHN


+  Foro de elhacker.net
|-+  Programación
| |-+  Ingeniería Inversa (Moderadores: karmany, .:UND3R:., MCKSys Argentina)
| | |-+  Duda sobre ejecutables
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] 2 Ir Abajo Respuesta Imprimir
Autor Tema: Duda sobre ejecutables  (Leído 7,752 veces)
Tinkipinki

Desconectado Desconectado

Mensajes: 242



Ver Perfil
Duda sobre ejecutables
« en: 22 Septiembre 2011, 20:16 pm »

Hola a todos:
No se si este sera el foro adecuado para esta consulta pero bueno lo intentamos.

En un ejecutable quien decide todos los parametros de Image Base, Entry Point,
o sea , todos los parametros que podemos ver en el LordPE.
Mi duda es si todo debe seguir estas diractrices, o sea que fuera una configuracion estandard y que por ejemplo yo no pudiera tener un programa con una ImageBase por ejemplo en 00003000 en vez de 00400000.
Otra pregunta seria quien decide las direcciones de memoria a las que debe ir el programa al cargarse en la memoria, o sea las direcciones de memoria que nos aparecen al hacer un dump del programa.

Saludos
En línea

Shaddy


Desconectado Desconectado

Mensajes: 722


one_bit_manipulator()


Ver Perfil WWW
Re: Duda sobre ejecutables
« Respuesta #1 en: 22 Septiembre 2011, 21:46 pm »

Hola a todos:
No se si este sera el foro adecuado para esta consulta pero bueno lo intentamos.

En un ejecutable quien decide todos los parametros de Image Base, Entry Point,
o sea , todos los parametros que podemos ver en el LordPE.
Mi duda es si todo debe seguir estas diractrices, o sea que fuera una configuracion estandard y que por ejemplo yo no pudiera tener un programa con una ImageBase por ejemplo en 00003000 en vez de 00400000.
Otra pregunta seria quien decide las direcciones de memoria a las que debe ir el programa al cargarse en la memoria, o sea las direcciones de memoria que nos aparecen al hacer un dump del programa.

Saludos

Esos parámetros generalmente vienen definidos por el compilador. Pero los puedes crear a mano, más que parámetros podríamos llamarles reglas.

En primer lugar tenemos la cabecera 'MZ' IMAGE_DOS_HEADER que sería esta:

Código:
typedef struct _IMAGE_DOS_HEADER
{
     WORD e_magic;
     WORD e_cblp;
     WORD e_cp;
     WORD e_crlc;
     WORD e_cparhdr;
     WORD e_minalloc;
     WORD e_maxalloc;
     WORD e_ss;
     WORD e_sp;
     WORD e_csum;
     WORD e_ip;
     WORD e_cs;
     WORD e_lfarlc;
     WORD e_ovno;
     WORD e_res[4];
     WORD e_oemid;
     WORD e_oeminfo;
     WORD e_res2[10];
     LONG e_lfanew;
} IMAGE_DOS_HEADER, *PIMAGE_DOS_HEADER;

Luego ya tienes la de sistemas 'NT' (elfa_new apunta a ella) IMAGE_NT_HEADERS:

Código:
typedef struct _IMAGE_NT_HEADERS
{
     ULONG Signature;
     IMAGE_FILE_HEADER FileHeader;
     IMAGE_OPTIONAL_HEADER OptionalHeader;
} IMAGE_NT_HEADERS, *PIMAGE_NT_HEADERS;

Donde:

Código:

struct IMAGE_FILE_HEADER

typedef struct _IMAGE_FILE_HEADER
{
     WORD Machine;
     WORD NumberOfSections;
     ULONG TimeDateStamp;
     ULONG PointerToSymbolTable;
     ULONG NumberOfSymbols;
     WORD SizeOfOptionalHeader;
     WORD Characteristics;
} IMAGE_FILE_HEADER, *PIMAGE_FILE_HEADER;


Código:
typedef struct _IMAGE_OPTIONAL_HEADER
{
     WORD Magic;
     UCHAR MajorLinkerVersion;
     UCHAR MinorLinkerVersion;
     ULONG SizeOfCode;
     ULONG SizeOfInitializedData;
     ULONG SizeOfUninitializedData;
     ULONG AddressOfEntryPoint;
     ULONG BaseOfCode;
     ULONG BaseOfData;
     ULONG ImageBase;
     ULONG SectionAlignment;
     ULONG FileAlignment;
     WORD MajorOperatingSystemVersion;
     WORD MinorOperatingSystemVersion;
     WORD MajorImageVersion;
     WORD MinorImageVersion;
     WORD MajorSubsystemVersion;
     WORD MinorSubsystemVersion;
     ULONG Win32VersionValue;
     ULONG SizeOfImage;
     ULONG SizeOfHeaders;
     ULONG CheckSum;
     WORD Subsystem;
     WORD DllCharacteristics;
     ULONG SizeOfStackReserve;
     ULONG SizeOfStackCommit;
     ULONG SizeOfHeapReserve;
     ULONG SizeOfHeapCommit;
     ULONG LoaderFlags;
     ULONG NumberOfRvaAndSizes;
     IMAGE_DATA_DIRECTORY DataDirectory[16];
} IMAGE_OPTIONAL_HEADER, *PIMAGE_OPTIONAL_HEADER;

Ahora, sobre la pregunta de si necesita estar en la base 0x00400000 la respuesta es: No.

No es necesario, el Sistema Operativo siempre da prioridad al ImageBase, pero en caso de no poder mapearse en esa zona de memoria lo situaría en una página sin reservar.

El caso más fácil de ver son por ejemplo las librerías, la mayoría de ellas intentan mapearse en 0x01000000 pero si te fijas en tu debugger favorito verás que siempre se van alojando de forma contigua.

En cuánto a la última pregunta deberías definir a qué secciones te refieres. Si es a la parte de las secciones (IMAGE_SECTION_HEADER) como ".text"/".data"/etc entonces el header del binario es el que lo define.

Ahora si me preguntas sobre el resto de direcciones quitando las que reservan las librerías tienes las páginas de Stack y contextos (PEB y TEB) en los últimos 100K de los 2GB.

El resto son páginas que se reservan para generar memoria (y devolver heaps).

Un saludo.

En línea

"Si buscas resultados diferentes, no hagas siempre lo mismo" (Albert Einstein)

http://abssha.reversingcode.com
http://www.reversingcode.com
Иōҳ


Desconectado Desconectado

Mensajes: 563


Ver Perfil
Re: Duda sobre ejecutables
« Respuesta #2 en: 23 Septiembre 2011, 00:22 am »


Luego ya tienes la de sistemas 'NT' (elfa_new apunta a ella) IMAGE_NT_HEADERS:


Error de tipografía es e_lfanew   :laugh:

ohh.. shaddy volvistes por estos lares :P, sin duda un 3lit3...  ;D

Citar
Ahora, sobre la pregunta de si necesita estar en la base 0x00400000 la respuesta es: No.

No es necesario, el Sistema Operativo siempre da prioridad al ImageBase, pero en caso de no poder mapearse en esa zona de memoria lo situaría en una página sin reservar.

El caso más fácil de ver son por ejemplo las librerías, la mayoría de ellas intentan mapearse en 0x01000000 pero si te fijas en tu debugger favorito verás que siempre se van alojando de forma contigua.

Si no me equivoco a la hroa de linkear puedes cambiar eso...


Citar
Ahora si me preguntas sobre el resto de direcciones quitando las que reservan las librerías tienes las páginas de Stack y contextos (PEB y TEB) en los últimos 100K de los 2GB.

El resto son páginas que se reservan para generar memoria (y devolver heaps).

Aparte de lo que te dijo Shaddy:

Cada programa tiene sus 4GB  de memoria en el espacio de direcciones, eso no quiere decir que ocupen 4gb de memoria física, si no que el programa puede direccionar cualquier dirección en ese rango.

Nox.
« Última modificación: 23 Septiembre 2011, 00:30 am por Иōҳ » En línea

Eres adicto a la Ing. Inversa? -> www.noxsoft.net
Tinkipinki

Desconectado Desconectado

Mensajes: 242



Ver Perfil
Re: Duda sobre ejecutables
« Respuesta #3 en: 23 Septiembre 2011, 05:23 am »

Gracias Shaddy y Иōҳ por vuestras respuestas.
Con esto ya me queda mas claro lo del mapeado de la memoria.
Mi duda era si podia generar un programa con las abeceras bien definidas pero mapeado en unas direcciones fura de las que se usan por costumbre y claro esta, que luego el procesador lo entendiease y el programa funcionara.
Sabiendo que estos parametros los puedo definir en el linkador ya puedo hacer pruebas.

Saludos
En línea

Shaddy


Desconectado Desconectado

Mensajes: 722


one_bit_manipulator()


Ver Perfil WWW
Re: Duda sobre ejecutables
« Respuesta #4 en: 23 Septiembre 2011, 09:05 am »

Aparte de lo que te dijo Shaddy:

Cada programa tiene sus 4GB  de memoria en el espacio de direcciones, eso no quiere decir que ocupen 4gb de memoria física, si no que el programa puede direccionar cualquier dirección en ese rango.

Nox.

Bueno, eso en realidad no es cierto. En arquitecturas x86 (32-Bit) el máximo de memoria virtual por proceso son 2 GB (0x00000000-0x7FFFFFFF).

Gracias Shaddy y Иōҳ por vuestras respuestas.
Con esto ya me queda mas claro lo del mapeado de la memoria.
Mi duda era si podia generar un programa con las abeceras bien definidas pero mapeado en unas direcciones fura de las que se usan por costumbre y claro esta, que luego el procesador lo entendiease y el programa funcionara.
Sabiendo que estos parametros los puedo definir en el linkador ya puedo hacer pruebas.

Saludos

Puedes definirlos en el 'linker' o puedes definirlos a mano, como ya te dije ImageBase lo puedes cambiar manualmente.

Un saludo.
En línea

"Si buscas resultados diferentes, no hagas siempre lo mismo" (Albert Einstein)

http://abssha.reversingcode.com
http://www.reversingcode.com
Иōҳ


Desconectado Desconectado

Mensajes: 563


Ver Perfil
Re: Duda sobre ejecutables
« Respuesta #5 en: 23 Septiembre 2011, 19:50 pm »

Bueno, eso en realidad no es cierto. En arquitecturas x86 (32-Bit) el máximo de memoria virtual por proceso son 2 GB (0x00000000-0x7FFFFFFF).


Iczellion  me angaño ._.

En mi experiencia tocando juegos, llege a encontrar direcciones 0xEXXXXXXX, y tomando aquellas para hacer uno que otro cheat...

Entonces a leer a Iczellion, no dude en creerle  :-\

Nox.
En línea

Eres adicto a la Ing. Inversa? -> www.noxsoft.net
Shaddy


Desconectado Desconectado

Mensajes: 722


one_bit_manipulator()


Ver Perfil WWW
Re: Duda sobre ejecutables
« Respuesta #6 en: 24 Septiembre 2011, 00:08 am »

Estarías en un entorno de 64-Bit o expresamente configurado para que el kernel tenga sólamente 1 GB. Aunque ya te digo que muy raro sería ;).

Un saludo.
En línea

"Si buscas resultados diferentes, no hagas siempre lo mismo" (Albert Einstein)

http://abssha.reversingcode.com
http://www.reversingcode.com
Иōҳ


Desconectado Desconectado

Mensajes: 563


Ver Perfil
Re: Duda sobre ejecutables
« Respuesta #7 en: 24 Septiembre 2011, 00:36 am »

Vale, lo entiendo, yo pensaba que este temilla estaba totalmente correcto en mi cabeza, luego vienen y te dicen que no XD

 :laugh:

Pero en arquitecturas x64 entonces, tienen 4gb de memoria en el espacio de direcciones?
Nox.
« Última modificación: 24 Septiembre 2011, 00:39 am por Иōҳ » En línea

Eres adicto a la Ing. Inversa? -> www.noxsoft.net
.:UND3R:.
Moderador Global
***
Desconectado Desconectado

Mensajes: 3.118


Ingeniería inversa / MASM


Ver Perfil WWW
Re: Duda sobre ejecutables
« Respuesta #8 en: 24 Septiembre 2011, 16:09 pm »

Leyendo un estudio de PE me topé con esto:
Sick Troen:
Citar
•   Magic  0B 01 ; esto nos dice que es un PE32, a diferencia del 0B 02 que es el PE32+ (estas limitan nuestra imagen hasta 4gb!).

PE32 32 byte y el de 64 comentan que el límite es de 4gb

Optional Header
campos estandar
MagicNumber:puede ser P32 o P32+

la diferencia:

Citar
The PE32 format stands for Portable Executable 32-bit, while PE32+ is Portable Executable 64-bit format.

Saludos
« Última modificación: 24 Septiembre 2011, 16:11 pm por .:UND3R:. » En línea


Solicitudes de crack, keygen, serial solo a través de mensajes privados (PM)
Shaddy


Desconectado Desconectado

Mensajes: 722


one_bit_manipulator()


Ver Perfil WWW
Re: Duda sobre ejecutables
« Respuesta #9 en: 24 Septiembre 2011, 21:22 pm »

Vale, lo entiendo, yo pensaba que este temilla estaba totalmente correcto en mi cabeza, luego vienen y te dicen que no XD

 :laugh:

Pero en arquitecturas x64 entonces, tienen 4gb de memoria en el espacio de direcciones?
Nox.

No, en x64 tienes hasta 256 TeraBytes ;).

Un saludo.
En línea

"Si buscas resultados diferentes, no hagas siempre lo mismo" (Albert Einstein)

http://abssha.reversingcode.com
http://www.reversingcode.com
Páginas: [1] 2 Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Una pregunta sobre los ejecutables.
Programación Visual Basic
^_^ 7 3,179 Último mensaje 24 Julio 2009, 19:40 pm
por LeandroA
[DUDA]Crear ejecutables mas pequeños en Dev-c++
Programación C/C++
SquX 2 4,473 Último mensaje 24 Agosto 2010, 22:10 pm
por Horricreu
duda sobre formateo y cosa sobre todos los pcs de una casa
Dudas Generales
Senior++ 5 4,698 Último mensaje 27 Agosto 2011, 09:21 am
por Senior++
Sobre Informacion de Ejecutables
ASM
x64core 3 3,188 Último mensaje 1 Enero 2012, 00:12 am
por Eternal Idol
[Problema o duda] G++ y ficheros ejecutables?
Programación C/C++
EzianGES 0 1,218 Último mensaje 14 Febrero 2014, 20:59 pm
por EzianGES
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines