El stud_PE me esta volviendo loco!

Iniciado por andres52, 16 Mayo 2009, 07:10 AM

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

andres52

Estoy tratando de crear espacio manualmente con el stud pe, aca los pasos de como lo estoy haciendo:

Abro el ejecutable con el programa:


Luego me voy a sections y abro la última (rsrc)


Ahora le sumo 200 en hexa (512 bytes) a RawSize y VirtualSize:


Finalmente le sumo 200 al Size of Image:


Y se me jode.. no funciona de ninguna manera.. guardo el ejecutable y lo abro con el hexadecimal y no sale el nuevo espacio... luego lo trato de abrir con el Olly y me da un error, que no se puede abrir algo así.

Trato de hacer lo mismo con el lord y me pasa exactamente lo mismo, solo que ahora con una diferencia:



Al principio, cuando lo abro, me sale el número de Size of Image que me salía en el Stud, 12000, pero despúes de modificar la sección se me cambia a 11ADC... es decir.. un número menor al anterior... ¿Y esto porque? De cualquier manera... pasa lo mismo que con el stud.. me da el mismo error en el olly y no me agrega el espacio.

Un amigo mio me ayudo a agregarle espacio al ejecutable, se lo pase por msn e hizo lo mismo que yo en el Lord. La diferencia es que a él si le funcionó y el ejecutable si tiene el espacio y se puede abrir en el olly. Compare las cabeceras entre su ejectuable y el mio y eran idénticas, También noté que de size of image tiene 11ADC (porque lo hizo en el lord) y esto me frustró todavía más... ya no entiendo nada.

¿Porque no me funciona? Muchas gracias...

karmany

#1
Claro, es que te estás olvidando de una cosa importantísima que tienes que hacer a mano:
-Añadir físicamente los bytes que has añadido en el PE header. Esto lo puedes hacer fácilmente con el programa Ultraedit: Botón derecho --> Añadir bytes

En principio, sólo con modificar el RawSize de la última sección y añadir con UltraEdit los bytes al final, te tiene que funcionar.
El problema que te puede ocurrir es que superes el valor de Section Alignment con los nuevos bytes que añades. En un primer momento tampoco te tiene que dar problema, porque Windows cuando cargue la aplicación en memoria modificará su Virtual Size y lo aumentará. Sin embargo, te digo lo del problema porque hay un valor que no será modificado y es posible que lo necesites modificar: SizeofImage; SizeofImage es el tamaño total del PE Image en memoria y por eso si pones un valor muy elevado, tal vez tengas que aumentar el SizeofImage. Aumentarlo es muy fácil, simplemente debes examinar el número de bytes que has añadido realmente y el valor de Section Alignment. Modificar SizeofImage va unido a la modificación de Virtual Size.

En tu primer ejemplo que haces, tienes un RawSize = 0000CA00
Le has sumado 200h bytes --> 0000CC00 = nuevo RawSize
Después modificas el valor de SizeofImage. Eso que haces no es correcto del todo, aunque puede valer, ya que el valor de SizeofImage tiene que ser múltiplo de SectionAlingment. En todo caso tendrías que sumarle 1000h bytes. Sin embargo, si te fijas,:
RawSize_original = 0000CA00
RawSize_final = 0000CC00
Como Section Alignment = 1000h no necesitas sumarle a SizeofImage nada ya que:
0000C000(multiplo de 1000h) + 00001000(Section Alignement) = 0000D000 y 0000CC00 no pasa de 0000D000. Esto quiere decir que tus datos nuevos aparecerán en memoria.

Por lo tanto en este ejemplo que has puesto,simplemente con modificar el RawSize y aumentar los bytes con UltraEdit, te tiene que funcionar.


PD. Otra cosa importante que me dejo es que si añades como te he dicho en el párrafo anterior, bastantes bytes y pasan del siguiente múltiplo de Section Alignment (en el ej. anterior sería que RawSize pasara de D000) debes modificar el Virtual Size de la última sección ya que sino cuando se cargue en memoria el programa, tus datos no se verán. Esto es importante.
Y además cuando aumentes el Virtual Size (sobrepasando el siguiente múltiplo de Section Alignment) debes aumentar el SizeofImage(en múltiplo de Section Alignment).

Finalmente si tienes dudas, sube un archivo que quieras y modificamos la última sección.

andres52

Muchas gracias, funcionó perfectamente. No se porque tenía la idea de que simplemente con modificar la cabezera se me agregrían los 200h bytes xd.

Otra cosa, estoy tratando de agregar instrucciones en el nuevo código, pero el problema es que me sale unable to save changes in exe file cuando modifico con el olly en la memoria, luego hice más grande el virtual size que el rawsize y nada...


¿Como soluciono esto?

karmany

#3
Eso te ocurre normalmente porque te encuentras en una zona Virtual, es decir, que no estás en la zona donde has insertado el código.
Fíjate:
En este programa la ImageBase = 400000 y la primera sección es la siguiente:
Nombre      Virtual Offset     Virtual Size     Raw Offset     Raw Size
.text             00001000         00000076       00000400     00000200


Viendo esa sección: ¿Cuál es la última dirección en donde puedes escribir? ¿Dónde acaban los bytes y dónde empieza la zona virtual?
Pues es muy sencillo fíjate:
-Realmente hay 200 bytes de código en la sección .text
-Al cargarlo en memoria te aparecerán 1000 bytes(Section Alignment) en esa sección.
-Es decir, el último byte que puedes modificar estará en:
00400000 (ImageBase) + 00001000 (Virtual Offset sección .text) + 00000200 = 401200, no puedes escribir después, te dará error. Realmente tienes que restar un byte.

Por lo tanto, si aumentas 100h bytes y te queda así:
Nombre      Virtual Offset     Virtual Size     Raw Offset     Raw Size
.text             00001000         00000076       00000400     00000300


Cuando se cargue en memoria: ¿Dónde se encuentran esos 100h bytes nuevos que has puesto?
-Respuesta: entre 401200 y 401300. Realmente creo que es 4011FF y 4012FF

PD. Mira, como no he visto ningún programa para poder añadir bytes a la última sección, me comprometo desde hoy a hacer un programa para poder hacer todo este trabajo de una sola vez. Así no habrá que añadir bytes ni modificar nada, y con un visor PE se podrán ver los resultados..