Autor
|
Tema: como podria optimizar bound import directory? (Leído 3,063 veces)
|
Belial & Grimoire
Desconectado
Mensajes: 559
Tea_Madhatter
|
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?
|
|
|
En línea
|
.
|
|
|
x64core
Desconectado
Mensajes: 1.908
|
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.
|
|
|
En línea
|
|
|
|
Belial & Grimoire
Desconectado
Mensajes: 559
Tea_Madhatter
|
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
|
|
|
En línea
|
.
|
|
|
x64core
Desconectado
Mensajes: 1.908
|
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[]. VirtualAddressPara 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.
|
|
« Última modificación: 23 Junio 2013, 20:20 pm por x64Core »
|
En línea
|
|
|
|
|
|