VirtualSize mayor que RawSize??

Iniciado por ~~, 10 Mayo 2009, 00:09 AM

0 Miembros y 1 Visitante están viendo este tema.

Shaddy

Y básicamente el raw_size es el tamaño exacto en el ejecutable, en bytes, y el virtual size tiene que ir alineado porque se alojará en la sección, pero que si... por eso no puede meter menor Virtual Size que sus bytes del fichero, se descuarenjaría todo...

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

http://abssha.reversingcode.com
http://www.reversingcode.com

karmany

#11
RawSize es el tamaño real de los bytes que hay en disco, es decir, el número de bytes que hay en la sección que te marca.
Si un exe tiene un PE header correcto, pues podrías sumar todos los RawSize de cada sección (incluída la del encabezado) y te tiene que dar exactamente lo que pesa el ejecutable.

Tanto los "Raw" como los "Virtual" se alinean en distintos tamaños, y eso nos lo da:
Section Alignment y File Alignment. Por ejemplo en esta imagen de un programa que hice:


El VirtualSize es el tamaño virtual de la sección cuando la tengas cargada en memoria.
Por ej. en el caso anterior, si ves la sección .text tiene un RawSize de 4E00 bytes, es decir, tiene realmente 4E00 bytes, sin embargo, tiene un VirtualSize de 4DF0.

Normalmente algunos compiladores, como tienen que alinear con File Alignment pues rellenan toda la sección (Raw) hasta completarla.
Fíjate, en este caso el código llega exactamente hasta 4DF0 y lo puedes ver en un desensamblador:(ImageBase: 400000 + 1000 + 4DF0 = 405DF0)


Pero como hay que alinear en el disco de 200 en 200 (File Alignment)pues hay que llegar a 4E00.

Y así queda cargado en memoria:

~~

Ok ok gracias, si ya entendía lo que era cada uno, lo que no entendía es por que podía ser el VirtualSize mayor que el RawSize, pero vamos a ver...

CitarY básicamente el raw_size es el tamaño exacto en el ejecutable, en bytes, y el virtual size tiene que ir alineado porque se alojará en la sección, pero que si... por eso no puede meter menor Virtual Size que sus bytes del fichero, se descuarenjaría todo...

No habíamos quedado (según acaba de contar Karmany) en que el RawSize debía ser mayor y ser el que tiene que estar alineado con el FileAligment?? El VirtualSize, que yo sepa y según cuenta MS:
CitarVirtualSize
The total size of the section when loaded into memory. If this value is greater than SizeOfRawData, the section is zero-padded. This field is valid only for executable images and should be set to zero for object files.

No tiene que ir alineado con nada... Y un claro ejemplo es el exe de karmany, el VirtualSize no es múltiplo de nada  :huh:

karmany

#13
Cita de: E0N
.. lo que no entendía es por que podía ser el VirtualSize mayor que el RawSize
Virtual Size puede ser menor y mayor que Raw Size.

En determinados ejemplos es muy fácil saber porqué. Fíjate en un UPX cualquiera, sus secciones pueden ser las siguientes:
Nombre      Virtual Offset     Virtual Size     Raw Offset     Raw Size
UPX0              00001000         00005000       00000400     00000000
UPX1              00006000         00001000       00000400     00000400
.rsrc             00007000         00001000       00000800     00000200


File Alignment: 200
Section Alignment: 1000

1ª sección: UPX0
Virtual Size = 5000 mientras que el Raw Size es ¡cero!
¿Qué ocurrirá? Pues que cuando se cargue en memoria la sección UPX0 tendrá un tamaño de 5000 bytes y será rellenada de ceros.

Fíjate en la segunda: UPX1
Un UPX es muy sencillo saber cuándo salta al OEP, así que me voy a poner en el salto después de descomprimirse:

00406324  cmp esp,eax
00406326  jne short 00406322
00406328  sub esp,-80
0040632B  jmp 00401000
00406330  db 00...


A partir de ahí son todo 0. Como se observa el Virtual Size son 1000 bytes pero el Raw Size son 400 entonces... ¿Qué pasa con esos C00 bytes? Pues que son rellenados con ceros.
Se puede poner el Virtual Size a 400 y será correcto también, porque como Section Alignment es 1000 en memoria la sección será de un tamaño = 1000 bytes.



Ahora vamos a ver lo contrario:

Un caso lógico que hace por ejemplo Topo es el siguiente:

Código real: 6 bytes
File Alignment: 10 bytes

Por lo tanto podríamos tener una sección con Raw Size = 10 bytes, pero realmente son 6, aunque por File Alignment le ponemos 10. La sección podría ser la siguiente:
Nombre      Virtual Offset     Virtual Size     Raw Offset     Raw Size
.sección          00000000         00000006       00000000     00000010


Cita de: E0Nmi sorpresa es que cuando añado el VirtualSize (menor que el RawSize) me dice que tiene que ser mayor
Tampoco veo yo que te tenga que marcar ese error. Es que no te lo tiene que dar.

Mira, de todos modos te recomiendo que uses el programa Topo 1.2 para añadir secciones y ese problema ya no te lo marcará.
También te comento que los antivirus dan a Topo 1.2 como virus, así que tendrás que modificarlo.

Un saludo

~~

Oks muchas gracias ya he entendido el funcionamiento y por qué no me funcionaba si ponía un VirtualSize mayor (por el tema del SizeOfImage).

Muchas gracias  ;-)