como podria optimizar bound import directory?

Iniciado por Belial & Grimoire, 23 Junio 2013, 00:06 AM

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

Belial & Grimoire

hola

tengo una pregunta, es sobre runPE

cuando agrego una nueva sección supuestamente tengo que limpiar los bound import tables, con 0x00, pero he escuchado que es mejor optimizarlo, según tengo entendido, cuando no hay espacio para agregar una nueva sección es necesario insertar nuevos bytes y modificar RVA sumandole 0x28, lo que seria la nueva sección

por lo general borro bound import, la aplicación corre normalmente pero ahora se me ocurrio no borrarlo, y tratar de optimizarlo, estuve haciendo pruebas con notepad

el offset donde se encuentran los import es en 0x1B0 y 0x1B4

0x1B0 = 78 02 00 00

0x1B4 = 28 01 00 00

lo que serian 0x278 y 0x128

al ir a 0x278, es el final de .rsrc, despues son 128 hexadecimales donde puedo agregar la nueva sección, y terminando, desde 0x129 empieza ADVAPI32.DLL... etc

lo que me imagino es que es correcto

pero en esos 0x128 hexadecimales, es donde modifico 0x28 para la nueva sección, todavia me quedan 100...asi que como mencione al principio, si borro los import con 0x00, notepad funciona bien, pero tambien como mencione, tenia la intencion de mejor optimizarlo, asi que imagine que tendria que sumar 28 a los 278

quedaria 0x2A0 pasandolo a endian seria --> 0A 02 00 00

modifique los 0x278 de 1B0 a 0A 02 00 00 y guarde la aplicacion, pero me aparecio el error de windows

despues quise tambien agregarle 28 a size de import que seia 0x1B4

0x1B4 = 0x128 + 28 = 0x150 en endian seria 50 01 00 00

pero tampoco funciono, entonces despues de toda esa explicación, viene mi pregunta

De que forma lo optimizo para no tener que borrar import bound directory con 0x00?

ya que no estoy agregando bytes para poner una nueva sección por falta de espacio, solo estoy modificando los que ya estan alli, para agregar una nueva, hay alguna forma de modificar bound import? o solo se puede hacer eso cuando agregas bytes por falta de espacio?

.                                 

x64core

Hola,

Es posible agregar una nueva sección sin corromper el bound, el calcula esta se hace así:
* Comprobar si existe Bould directory
* Obtener el tamaño bould dir
* Obtener el tamaño de los todos los headers del PE 
* Sumar esos dos valores ( Variable_1 ) y ademas sumar sizeof(IMAGE_SECTION_HEADER) ( la nueva sección )
* comprobar si Variable_1 sobrepasa el valor de SizeOfHeaders
   # Si lo hace entonces alinear Variable_1 a FileAlignment. Crear un buffer con longitud de este valor
   # Si no sobrepasa el valor entonces crear un buffer de longitud SizeOfHeaders
* copiar al buffer creado todas las cabeceras de las secciones más la nueva y copiar la Bound acontinuación, ya tienes la nueva cabecera del PE.
* Sumar Sizeof(IMAGE_SECTION_HEADER) a OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_BOUND_IMPORT].VirtualAddress ( Si bound existio )
* Generar el nuevo PE utilizando la nueva cabecera
* Actualizar algunos campos del PE Header ( numeros de secciones, checksum , dependiendo de lo que contenga tu sección: SizeofCode,SizeofinitializateData,etc. tu sabras )

Por cierto, ya que estas haciendo pruebas con un archivo especifico pueda que quieras subirlo para quien quiera ayudarte se guie
de tal archivo, porque no sabemos si es el notepad de Win XP,Vista,7 o alguna otra version.

Y por experiencia, no recomiendo usar programas como notepad como para pruebas, pueda que ellos tengan algun metodo de
comprobar la integridad de el archivo, usa uno diferente. prueba con un "hello world" hecho en VB para este caso.



Belial & Grimoire

Estoy usando notepad de windows 7, lo que pasa es que yo utilizo linux y abro windows con Virtualbox y ya me acostumbre a hacer pruebas con notepad, creo todavía tengo algún disco de VB6, haber si lo instalo después, porque ya tiene algunos años que no uso VB ya solo me gusta usar C

al parecer hay que hacer mas cosas para no corromper bound import

una ultima pregunta, me podrías explicar un poco sobre "OptionalHeader.DataDirectory[0].VirtualAddress", se que es una estructura que se encuentra en IMAGE_OPTIONAL_HEADER, pero no comprendo bien cual es su función

salu2





.                                 

x64core

#3
Cita de: Belial & Grimoire en 23 Junio 2013, 17:37 PM
Estoy usando notepad de windows 7, lo que pasa es que yo utilizo linux y abro windows con Virtualbox y ya me acostumbre a hacer pruebas con notepad, creo todavía tengo algún disco de VB6, haber si lo instalo después, porque ya tiene algunos años que no uso VB ya solo me gusta usar C

al parecer hay que hacer mas cosas para no corromper bound import

una ultima pregunta, me podrías explicar un poco sobre "OptionalHeader.DataDirectory[0].VirtualAddress", se que es una estructura que se encuentra en IMAGE_OPTIONAL_HEADER, pero no comprendo bien cual es su función

salu2








Su funcion es simple, poder localizar el inicio de cada sección de datos ( Relocalizaciones, recursos, importaciones, Exportaciones, etc ).
Para obtenerla cuando el modulo es cargado en memoria seria: Base del module + OptionalHeader.DataDirectory[].VirtualAddress
Para obtenerlo directamente desde el raw seria convertir "OptionalHeader.DataDirectory[].VirtualAddress" a offset y sumarle la Base.

Para comprobarlo establece "OptionalHeader.DataDirectory[].VirtualAddress" del directorio de recursos a 0 y guarda, veras que windows
no puede reconocer la existencia del icono ya que este esta almacenado el tal sección.