VirtualSize mayor que RawSize??

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

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

~~

Hola

De siempre he tenido entendido que el VirtualSize debía ser menor que el RawSize, que el RawSize debía ser múltiplo del FileAlignment y que la diferencia debía estar rellenada con ceros.

Por ejemplo, si un ejecutable tiene FileAlignment 10 y una sección tiene un VirtualSize = 22 el RawSize debería ser 30 y que los últimos 8 bytes de la sección deberían ser ceros.

Y siempre lo he visto así en los exe's generados por el compilador, pero hoy me he puesto a añadir una sección con el Stud PE y para añadirla me pedía únicamente VirtualSize y RawSize, yo he puesto un RawSize múltiplo del FileAlignment (aunque si no es múltiplo funciona igual) y mi sorpresa es que cuando añado el VirtualSize (menor que el RawSize) me dice que tiene que ser mayor  :o :o

Si lo pongo el exe funciona, de hecho si luego lo dejo menor peta, pero por que hay que hacerlo así?? no le veo sentido, si yo quiero introducir código en esa sección no puedo meter más código del que entra, que es lo que me están diciendo....

Vamos, supongamos que quiero hacer una sección nueva que contendrá 15 bytes, si el FileAlignment es 10 el RawSize debería ser 20, pero no me deja, me obliga a poner un RawSize = 10... y donde meto yo los 5 bytes restantes???

A ver si alguien puede aclararme esto..
Salu2

Arkangel_0x7C5

bueno, que yo sepa, el RawSize es lo que ocupa cada sección en el archivo incluyendo los ceros. y el VirtualSize es lo que ocupa una vez cargado en la memoria ram.

Hacker_Zero izo un code para ampliar una sección, igual te sirve

~~

Claro, pues por eso mismo, no entiendo el por qué de que el virtual size sea mayor que el raw size, ampliar una sección ya se...

Tu mismo lo has dicho:
Citarel RawSize es lo que ocupa cada sección en el archivo incluyendo los ceros. y el VirtualSize es lo que ocupa una vez cargado en la memoria ram

Como vas a tener más código cargado en la ram del que puedes almacenar en disco? xDDD

[Zero]

#3
Pos yo siempre había entendido que el VirtualSize tiene que ser mayor o igual que el RawSize. Si sobra VirtualSize, el sobrante se rellena de 0's al cargarse en memoria . Lo que no creo que se pueda es menor, entonces no cogería el código en memoria   :P.

Saludos

PD: Es más, los redondeos que hacen los compiladores siempre redondean más largo el VirtualSize que el RawSize.

"El Hombre, en su orgullo, creó a Dios a su imagen y semejanza.”
Nietzsche

Arkangel_0x7C5

#4
ya, si se que no tiene logica lo de ese programa.

Pon la descarga de un exe, uno que este como deberia ser y otro como te dice el programa que tiene que ser. y asi miro la diferencia

Saludos

edit:
Cita de:  Hacker_Zero
Pos yo siempre había entendido que el VirtualSize tiene que ser mayor o igual que el RawSize. Si sobra VirtualSize, el sobrante se rellena de 0's al cargarse en memoria . Lo que no creo que se pueda es menor, entonces no cogería el código en memoria

Yo cuando miro un exe la virtualsize es donde acaban los datos y empiezan los zeros.
y la RawSize donde empieza la siguiente

bizco

la raw size tendria que ser el tamaño real (de codigo en bytes) que contiene la sección, y la virtual una vez alineada y tendria que ser superior a la raw size por el tema de redondeos.

~~

#6
Esto es un exe compilado con VC++, las dos primeras secciones son del compilador, la última se la he añadido con el stud pe:

Si el VirtualSize es menor me dice que aplicación Win32 no válida, lo cachondo del asunto es que si le añado una sección con un código mío (que por defecto deja el virtual size a cero)
http://e0n-productions.blogspot.com/2008/10/aadiendo-una-seccin-un-ejecutable.html

Luego puedo aumentar el VirtualSize, pero siempre menor al RawSize, podéis probarlo :P Y bueno, ya como gran colofón si amplio una sección a mano el VirtualSize tengo que dejarlo mayor para que funcione....

En fin, alguna explicación? xDDD




Te me has adelantado ctlon:
Citarla raw size tendria que ser el tamaño real (de codigo en bytes) que contiene la sección, y la virtual una vez alineada y tendria que ser superior a la raw size por el tema de redondeos.

No se supone que es siempre al revés??? Las dos primeras secciones de la foto desde luego lo respetan y las ha añadido el compilador...

Arkangel_0x7C5

misterios del win. xD

La añadida es la ultima o algo asi?

Saludos

PD:Yo prefiero poder comparar las diferencias y hacerle pruebas que ver imágenes

bizco

si siempre te dice que necesita ser menor, a ver si el sizeofimage tendra algo que ver. prueba aumentandolo.

~~

Curioso, al hacer los dos exe's he caído en que sería buena idea usar la función "compara" (muy útil por cierto) y he visto la diferencia entre los dos, aquí los dejo tal cual:
http://rapidshare.com/files/231186043/exes.zip.html


Al hecho a mano le he añadido una sección de 0x1000 bytes (RawSize = 0x1000) al creado con el stud pe también le he puesto un RawSize = 0x1000 peeeero al ser el VirtualSize = 0x1001, es decir, mayor, aunque al exe le añade 0x1000 bytes el size of image es 0x1001 bytes mayor...

Creo que ya he entendido por que, a la hora de crear la nueva sección el program te da dos opciones, la primera es llenar la sección con ceros, y la segunda cargar la sección desde otro exe, al darle al rellenarla con ceros y leyendo la documentación oficial...
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.

Todo arreglado xD Ahora si entiendo el por qué  ;D