[Taller en construcción]Secciones en archivos PE.

Iniciado por The Swash, 23 Mayo 2012, 18:44 PM

0 Miembros y 3 Visitantes están viendo este tema.

The Swash

Hola,

Estás leyendo bien los datos del ejecutable?, los punteros se se me hacen un poco altos como para el tamaño de un "notepad". Y sin duda, si esos fuesen los valores están alineados. Para verificar si un valor está alineado o no debes hacer (valor módulo FileAlignment), si esto es igual a 0, está alineado.

Un saludo,
Iván Portilla.

Belial & Grimoire

#31
si hice basicamente lo mismo que con la aplicacion VB6, el archivo queda con la misma cantidad de datos al final

0x2BE00

lo repeti varias veces para verificar que no me equivoque al cambiar los bytes, y conte poco a pco los hexa de las secciones

en la aplicacion de VB6, me salio bien, y se que practicamente es lo mismo, pero no se que podria ser ahora

mira esto es lo de la PE

000000E0 50 45 00 00 4C 01 04 00 0F C6 5B 4A 00 00 00 00 00 PE..L.....[J.....
000000F1 00 00 00 E0 00 02 01                               .......          


FileAligment

00020000

Esto es .text

000001D8 2E 74 65 78 74 00 00 00 8C A6 00 00 00 10 00 00 00 .text............
000001E9 A8 00 00 00 04 00 00 00 00 00 00 00 00 00 00 00 00 .................
000001FA 00 00 20 00 00 60                                  .. ..`          


este es .reloc

00000250 2E 72 65 6C 6F 63 00 00 34 0E 00 00 00 F0 02 00 00 .reloc..4........
00000261 10 00 00 00 AE 02 00 00 00 00 00 00 00 00 00 00 00 .................
00000272 00 00 40 00 00 42                                  ..@..B          


Y como te menciono, en la aplicacion de VB6 lo hice bien, pero aqui no se que podria pasar
.                                 

The Swash

#32
Hola,

Si leemos los datos (recuerda lo del endian byte). Tenemos que:

  • .text:
  • VirtualAddress: 0x1000
  • VirtualSize: 0xA68C
  • PointerToRawData: 0x400
  • SizeOfRawData: 0xA800


  • .data:
  • VirtualAddress: 0xC000
  • VirtualSize: 0x2164
  • PointerToRawData: 0xAC00
  • SizeOfRawData: 0x1000


  • .rsrc:
  • VirtualAddress: 0xF000
  • VirtualSize: 0x1F160
  • PointerToRawData: 0xBC00
  • SizeOfRawData: 0x1F200


  • .reloc:
  • VirtualAddress: 0x2F000
  • VirtualSize: 0xE34
  • PointerToRawData: 0x2AE000
  • SizeOfRawData: 0x1000

Ahora resulta que los tamaños de las secciones a intercambiar no son iguales, por ende deberás "desbaratar" y rearmar todo el cuerpo del archivo. Para ello deberás trabajar con sus SizeOfRawData y cambiarles el orden, luego actualizar las cabeceras.

Si vamos a cambiar ".reloc" por ".text" primero que todo analizamos que todas las otras secciones se desplazarán debido a que ".text" es más grande.

Entonces vamos de a poco:

  • .reloc:
  • VirtualAddress: 0x1000
  • VirtualSize: 0xE34
  • PointerToRawData: 0x2AE000
  • SizeOfRawData: 0x1000

Luego seguiría:


  • .data:
  • VirtualAddress: 0xC000
  • VirtualSize: 0x2164
  • PointerToRawData: 0x2000 -> Suma de PointerToRawData y SizeOfRawData de ".reloc".
  • SizeOfRawData: 0x1000

Luego:


  • .rsrc:
  • VirtualAddress: 0xF000
  • VirtualSize: 0x1F160
  • PointerToRawData: 0x3000 -> Hacemos lo mismo con ".data".
  • SizeOfRawData: 0x1F200

Y por último:


  • .text:
  • VirtualAddress: 0x1000
  • VirtualSize: 0xA68C
  • PointerToRawData: 0x22200
  • SizeOfRawData: 0xA800

Y en base a estos datos es que debes ubicar las secciones en el cuerpo del archivo en el orden tal cual porque ese era el cambio que querías hacer.

Recuerda CUERPO DEL ARCHIVO, no en la cabecera de secciones, en la cabecera solo actualizas los nuevos valores pero no el orden.

Un saludo,
Iván Portilla.



Belial & Grimoire

Hola

Ok creo si se tenia que modificar algunas cosas, bueno creo ahora haré el intento y como ejercicio tratare de agregar una secciona mia y vere si puedo cambiarla por. Text

Solo una última duda, porque quedo 0x1000 Reloc si la suma de la sección anterior no da. 0x1000?

Y otra pregunta, si filealigment es de 0x200 como podría estar alineado con 0xA800?

Bueno mientras haré esto y el ejercicio a ver que tal me va

Salu2
.                                 

The Swash

Hola,

Te explico:
Tú vas a cambiar de posición ".reloc" y ".data", el 0x1000 que ahora vale el PointerToRawData de ".reloc" sale de donde estaba ubicado ".text" recuerda que ahí es justamente donde finaliza la cabecera y empieza la primera sección.

En cuanto a lo otro:
0xA800 %(modulo, residuo) 0x200 = 0. Entonces es múltiplo.

Un saludo,
Iván Portilla.

Belial & Grimoire

#35
hola

bueno, pues ya logre agregar al block de notas mi sección y cambiarla con .reloc

solo que cambiar la secciones del block .text, .data, .rsrc y .reloc, he tenido problemas

si cambio .data y .reloc se alinea a 0x22200, pero .text y .rsrc son muy grandes y cuando los selecciono

0x1f200 ---> .rsrc

0xA800 ----> .text

abarca mucho incluso, se selecciona parte de .data y .reloc y no puedo borralos

ahora si primero cambio .rsrc y .text pasan dos cosas

si .text tiene que quedar en 0x22200, al seleccionar y luego eliminar 0xA800 ya no queda lineado con 0x22200, y pensando que si alineo .data y .reloc se alienaria todo... pero no alcanza y lo mismo pasa con .rsrc --> 0x1f200, es muy grande y si lo elimino ya no quedan alineados

lo unico que se me ocurre, es fijarme donde quedan alineados y volver a modificar PointerToRawData con las nuevas direcciones

Aunque...

de la misma manera que hice con el ejercicio de poner mi sección y cambiarlo por otra, al modificarlo ya no queda en 0x2BE00, la nueva direccion fue 0x2B000 y con cambiar eso funciono, aunque si al intentar cambiar .text con mi sección tambien hay algo mal

0x400 ---> .text

0x2BE00 --> .BAG

al cambiarlo quedo

0x400 ---> .BAG

0x21800 --> .text

queda como 0x21800 porque al borrar A800 de 0x2CA00 se eliminan hasta quedar en 0x21800

y son 0x2CA00 por la suma de mi sección agregada

pero me dice que ya no es un aplicacion win32

creo al eliminar A800, tambien elimino parte de .data incluso tambien .rsrc, talvez por eso falla

pero entonces tendria que eliminar de A800, el tamaño de las secciones siguientes para no tocarlas?


bueno almenos, ya logre agregar mi sección y cambiarla con .reloc, jeje ahora no tuve tiempo de practicar, pero creo cada vez entiendo mas  ;-)

salu2
.                                 

d(-_-)b

Max 400; caracteres restantes: 366

franfis

Muy buen tutorial, felicitaciones  ;-) , no se mucho de esto pero donde quedan las estructuras IMAGE_RESOURCE_DIRECTORY, IMAGE_RESOURCE_DIRECTORY_ENTRY, IMAGE_RESOURCE_DATA_ENTRY , _IMAGE_RESOURCE_DIRECTORY_STRING, etc, etc. No los veo ni con el Olly, ni en programas complejos como el abode acrobat los veo.

Por otro lado seria aun mas interesante que expliques que pasa con el PE header cuando el exe esta empaquetado y como desempaquetarlo.

Saludos




avzila

muy buen aporte, los tomo en cuenta gracias ....

Danyfirex

Excelente Taller. muy Bien explicado.  ;-)  Felicidades Crack