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

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

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

Danyfirex

tengo una duda :S

como podria obtener el valor de SizeofinitializedData.

Osea no se que parametros tomar para actualizarlo.


Perdon por la doble respuesta.  saludos The Swash




The Swash

Hola,

Danyfirex, para encontrar dicho campo debes primero:

  • Encontrar el valor de e_lfanew.
  • Sumarle 0x24 que corresponde a PE_SIGNATURE + SIZE_IMAGE_FILE_HEADER.
  • Luego súmale la posición del campo SizeOfInitializedData que es 0x08.
  • Ya estás en el campo que requieres.

Un saludo,
Iván Portilla.

Danyfirex

Cita de: The Swash en 18 Agosto 2012, 04:13 AM
Hola,

Danyfirex, para encontrar dicho campo debes primero:

  • Encontrar el valor de e_lfanew.
  • Sumarle 0x24 que corresponde a PE_SIGNATURE + SIZE_IMAGE_FILE_HEADER.
  • Luego súmale la posición del campo SizeOfInitializedData que es 0x08.
  • Ya estás en el campo que requieres.

Un saludo,
Iván Portilla.


Gracias. hasta ahi lo entiendo. pero realmente quiero saber como haces para actualizarlos.

Osea como lo hace to Realing PE. que parámetros tomo en cuenta para actualizarlo.

Saludos perdón por liarte tanto :S

Cauch

Hola gente,
Primero de todo felicitar a The Swash por ese taller tan bien escrito y estructurado :p

Hice las practicas #1 y #2 (Agregar una sección y We vs Bound Import) y después cuando quise practicar por mi cuenta, al primer intento batacazo (las prácticas me salieron bien ;)).
Resulta que el ejecutable tiene 5 secciones, añado una y ese es el resultado que yo creía que debería tener (aún me falta incluir las 'Characteristics'):

Nota: El recuadro amarillo es la sección añadida, el recuadro que no es amarillo es la sección previa.


Para obtener la Virtual Adress, sumo la Virtual Adress y Virtual Size de la sección anterior, con lo cual nos queda:
0x43A0 + 0x3F000 = 0x433A0

Redondeamos el valor acuerdo con el valor de SectionAlignment, el cual es 0x1000, con lo que nos queda lo siguiente:
0x433A0 -> 0x44000

Finalmente, cuando voy a introducir el código, por ejemplo un texto que ponga 'Hola mundo' en la dirección 0x44000 (debería incluir 200 Bytes dado que FileAlignment = 0x200), ésta está totalmente ocupada.
De hecho la última dirección del archivo es  DF9D0.

Tiene pinta que he calculado algo mal, alguien me puede ayudar?



Una pantalla completa de todo por si las moscas
http://i50.tinypic.com/11mc3tw.png

The Swash

Hola,

Gracias por leer el material de he dejado.
En cuanto a tu duda temo que es porque el archivo tiene "overlay" que es información sobrante que no pertenece a ninguna sección.

Estaría bien si puedes subirlo y así lo miramos todos.

Un saludo,
Iván Portilla.

s7evin

#45
Buenas tardes a tod@s :)

Lo primero agradecer a The Swash por sus aportes y paciencia; he aprendido muchisimo gracias a él.

Y ahora a lo que iba... jeje
A ver si alguien puede ayudarme/guiarme... ando algo perdido.
He realizado las prácticas de este taller y he logrado el resultado esperado.
(todo desde código C/C++ en vez de editores hex)

Ahora bien, estoy intentando añadir una nueva sección donde pretendo copiar el código de un segundo ejecutable (lanza un MessageBox y ya está) para que aparezca nada más ejecutar el original y después siga con su proceso normal.

El problema está en que no se si debo añadir todas las secciones de este segundo ejecutable o tan solo una sección determinada. Si fuera solo una sección... como determino de cual se trata? (el tamaño me imagino que sabría sacarlo)

Enfin.. no me enrollo más, que me estoy liando yo sólito..
Gracias por adelantado y saludos!

PD: ya puestos a pedir... podríais explicarme las distintas secciones que se generan en los ejecutables? Porque veo que normalmente se generan las mismas: .text, .data, .rdata, .bss, .idata, etc. Son imprescindibles? Que datos contienen? Hay alguna forma de evitar que se creen tantas secciones y se genere 1 sola?

The Swash

Hola,

Respecto a lo de agregar un ejecutable dentro de otro, si bien miraste el material y leíste un poco de teoría sabrás que la información de referencia para el lanzador, cargador de Windows se encuentra en la cabecera así que si vas a hacer eso se debe copiar todo el ejecutable. Que lo metas en una sola sección sería lo "ideal" puesto que  tu necesitas la información para hacer una ejecución "casera". Luego tienes unas dependencias de que tu mismo le tienes que dar espacio en memoria, un thread, etc.
Es aquí donde se presentan los problemas, porque además de eso debes resolver las importaciones y relocaciones.

Generalmente muchos ejecutables traen un ImageBase similar a 0x400000 y la única forma de cambiar estos campos sería teniendo una tabla .reloc en tu exe y no todos lo tienen.

Como ves que complica un poco la cosa, cualquier cosa preguntas y con gusto.

En cuanto a las secciones, son muchísimas y la mejor explicación está en el PE COFF de Microsoft, pero entonces te digo las más conocidas:


  • .text -> Sección de código ejecutable
  • .code -> Sección de código ejecutable
  • .data -> Sección de datos (variables)
  • .idata -> Sección de importación de librerías (import data)
  • .rdata -> Igual que la anterior
  • .rsrc -> Sección de recursos.
  • .reloc -> Sección de relocaciones.
  • .debug -> Sección con datos para la depuración

Y esos son los que momentáneamente recuerdo.

Saludos.

Newhack32

la estructura IMAGE_DOS_HEADER: que acaso no tiene esto  :huh:


  IMAGE_DOS_HEADER = record lleno
    e_magic: Word; / / Número mágico ("MZ")
    e_cblp: Word; / / Bytes en la última página del archivo
    e_cp: Word; / / Artículos en el archivo
    e_crlc: Word; / / Movimientos
    e_cparhdr: Word; / / Tamaño de la cabecera en los párrafos
    e_minalloc: Word; párrafos supletorias / / mínimos necesarios
    e_maxalloc: Word; / / Máximo párrafos adicionales necesarios
    e_ss: Word; / / inicial (relativa) SS valor
    e_sp: Word, valor SP / / Inicial
    e_csum: Word; / / Suma de comprobación
    e_ip: Word, valor IP / / Inicial
    e_cs: Word; / / inicial (relativa) de valor CS
    e_lfarlc: Word; / / Dirección de la tabla de reubicación
    e_ovno: Word; / / Overlay número
    e_res: arsenal lleno [0 .. 3] de la Palabra / / palabras reservadas
    e_oemid: Word; / / OEM identificador (por e_oeminfo)
    e_oeminfo: Word; / / Información OEM; e_oemid específico
    e_res2: arsenal lleno de [0 .. 9] de la Palabra / / palabras reservadas
    e_lfanew: Entero; / / Archivo dirección del encabezado exe nuevo

The Swash

Hola,

Con todo respeto se nota mucho lo poco que has leído o al menos el poco cuidado que has prestado.

Citar[29 WORDS] -> Aquí abreviaremos son campos poco utilizados.

Saludos.

s7evin

Buenos días a tod@s!

Estoy haciendo la última práctica, bueno de hecho ya la terminé y el ejecutable resultante funciona perfectamente.

La cuestión es que he descargado tu ejecutable final ("Practica 4 Resultado") y al examinar la estructura PE veo que hay algunas cosas que difieren del mio... por ejemplo:


   OptionalHeader->SizeOfImage = 0x3400

- No debería estar alineado a 0x4000 ?

   Sección: .idata->VirtualSize = 0x98
   Sección: .data->VirtualSize = 0x400

- ? La sección ampliada no era la .idata?? como es que le has aumentado el VirtualSize al .data en vez de al .idata?



Y ya por último... como lo has hecho para que el MessageBox coja el texto insertado al final de la sección? :S

Serias tan amable de aclararme estos puntos?

Gracias y saludos! :)