Foro de elhacker.net

Programación => ASM => Mensaje iniciado por: Usuario887 en 14 Julio 2020, 18:44 pm



Título: ¿que significa exactamente el alineamiento?
Publicado por: Usuario887 en 14 Julio 2020, 18:44 pm
Hola,

estoy inseguro de si entiendo el significado de "alineamiento" cuando se habla de programacion en ensamblador y otras categorias; segun lo que hasta ahora se, el alineamiento es el ambito de acceso. Sin embargo, ¿es eso exactamente?

Por ejemplo, existe un miembro de la estructura IMAGE_OPTIONAL_HEADER del formato PE llamado FileAlignment (cosa que no entiendo: ¿por que alinear un archivo en disco? ¿o se trata mas bien de informacion para la paginacion?). Ademas, MASM tiene ciertos atributos para la declaracion de segmentos que puede ser BYTE, WORD, PARA, etcetera, ¿se refiere esto solo al ambito del segmento que debe calcular el ensamblador? ¿o va mas alla de esto?.

Gracias de antemano.


Título: Re: ¿que significa exactamente el alineamiento?
Publicado por: Eternal Idol en 14 Julio 2020, 19:01 pm
estoy inseguro de si entiendo el significado de "alineamiento" cuando se habla de programacion en ensamblador y otras categorias; segun lo que hasta ahora se, el alineamiento es el ambito de acceso. Sin embargo, ¿es eso exactamente?

No ...

https://en.wikipedia.org/wiki/Data_structure_alignment
https://foro.elhacker.net/asm/declaracion_de_segmentos_en_tasm-t504472.0.html

Por ejemplo, existe un miembro de la estructura IMAGE_OPTIONAL_HEADER del formato PE llamado FileAlignment (cosa que no entiendo: ¿por que alinear un archivo en disco? ¿o se trata mas bien de informacion para la paginacion?). Ademas, MASM tiene ciertos atributos para la declaracion de segmentos que puede ser BYTE, WORD, PARA, etcetera, ¿se refiere esto solo al ambito del segmento que debe calcular el ensamblador? ¿o va mas alla de esto?.

https://docs.microsoft.com/en-us/windows/win32/api/winnt/ns-winnt-image_optional_header32


Título: Re: ¿que significa exactamente el alineamiento?
Publicado por: Usuario887 en 15 Julio 2020, 18:59 pm
Segun el primer enlace:
Citar
To ensure natural alignment, it may be necessary to insert some padding between structure elements or after the last element of a structure.

Estudiando la estructura de los archivos PE, me encontre con algo asi entre la ultima estructura IMAGE_SECTION_HEADER y la sección de codigo (de un EXE, cuya sección de codigo es la primera):

(https://i.imgur.com/veLFBXQ.png)

Hasta ahora no le hallo un sentido. Supongamos que se trata de tal padding entre estructuras, ¿no seria mas eficiente especificar la forma de alineamiento en IMAGE_OPTIONAL_HEADER32 y aplicarlo en memoria, y no en el disco? Honestamente, no entiendo cual es el sentido de aplicarlo tambien al archivo en disco...

Ademas, estoy casi seguro de que esto se debe a una razon practica mas que fundamental... pero ¿por que es necesario? es decir ¿por que no acceder a la memoria en unidades de palabra simplemente (sea cual sea la palabra del computador, 16-bits, 32-bits, 64-bits...)?


Título: Re: ¿que significa exactamente el alineamiento?
Publicado por: Eternal Idol en 15 Julio 2020, 20:39 pm
FileAlignment
The alignment of the raw data of sections in the image file, in bytes. The value should be a power of 2 between 512 and 64K (inclusive). The default is 512. If the SectionAlignment member is less than the system page size, this member must be the same as SectionAlignment.


Estudiando la estructura de los archivos PE, me encontre con algo asi entre la ultima estructura IMAGE_SECTION_HEADER y la sección de codigo (de un EXE, cuya sección de codigo es la primera):

Hasta ahora no le hallo un sentido. Supongamos que se trata de tal padding entre estructuras, ¿no seria mas eficiente especificar la forma de alineamiento en IMAGE_OPTIONAL_HEADER32 y aplicarlo en memoria, y no en el disco? Honestamente, no entiendo cual es el sentido de aplicarlo tambien al archivo en disco...

Simplemente responde al alineamiento, cada sección esta alineada a minimo 512 bytes (de acuerdo al campo FileAlignment de IMAGE_OPTIONAL_HEADER) y esa de la imagen que subiste debe arrancar en 1024.

Ademas, estoy casi seguro de que esto se debe a una razon practica mas que fundamental... pero ¿por que es necesario? es decir ¿por que no acceder a la memoria en unidades de palabra simplemente (sea cual sea la palabra del computador, 16-bits, 32-bits, 64-bits...)?

Yo no diseñe el formato PE (y te estas desviando del alineamiento, buscando explicaciones mas alla de como funciona una tecnologia, a la larga te vas a topar con decisiones de diseño y si es tecnologia de hace decadas las razones no van a ser evidentes siempre) pero te puedo dar una razon: no se pueden leer de disco unidades de palabra, la unidad minima con la que se trabaja es el sector (tipicamente 512 bytes).


Título: Re: ¿que significa exactamente el alineamiento?
Publicado por: Usuario887 en 15 Julio 2020, 20:59 pm
FileAlignment
The alignment of the raw data of sections in the image file, in bytes. The value should be a power of 2 between 512 and 64K (inclusive). The default is 512. If the SectionAlignment member is less than the system page size, this member must be the same as SectionAlignment.

Esta bien... ahora entiendo. Sin embargo ahora tengo una sutil duda: ¿cual es la diferencia entonces entre los miembros FileAlignment y SectionAlignment?

SectionAlignment
The alignment of sections loaded in memory, in bytes.

FileAlignment
The alignment of the raw data of sections in the image file, in bytes.


A menos que uno se refiera a todas las secciones conjuntamente y el otro a los datos de estas secciones, no lo intuyo.

y en el caso de que el primero se refiera a tal ¿con secciones conjuntamente nos referimos a los descriptores las secciones o a las secciones en si?


edito: acabo de notar que mientras uno dice in the image file, el otro loaded in memory. En ese caso tendria otras dudas (si no es molestia):

respecto a SectionAlignment:
¿por que esta informacion es relevante?
¿es relevante solo para el cargador de Windows?
¿tiene que ver con el mecanismo de paginacion?


Título: Re: ¿que significa exactamente el alineamiento?
Publicado por: Eternal Idol en 16 Julio 2020, 00:21 am
https://en.wikipedia.org/wiki/Data_structure_alignment#Hardware_significance_of_alignment_requirements

- En teoria se usa al mappear un binario en memoria (podes depurar Windows y comprobarlo).
- En la practica al cargador (Ldr el Loader de NTDLL.dll) ya le llega hecho por el Kernel (las secciones alineadas digo) una vez que accede a esas paginas de memoria.
- Si, tiene que ver.