Foro de elhacker.net

Programación => ASM => Mensaje iniciado por: Vaagish en 7 Mayo 2014, 21:10 pm



Título: PE mas PEqueños..
Publicado por: Vaagish en 7 Mayo 2014, 21:10 pm
Se puede configurar Masm32 para que queden mas pequeñas las secciones del PE? Tengo mas db 0 que instrucciones..  :¬¬

En C++ podríamos hacer algo asi:

Código
  1. #pragma comment(linker,"/merge:.rdata=.text")
Ademas de configurar el IDE para reducir el PE

En masm32 hay alguna opcion de eso? O alguna herramienta para modificar las secciones de un programa?

Gracias! Saludos!


Título: Re: PE mas PEqueños..
Publicado por: MCKSys Argentina en 7 Mayo 2014, 22:08 pm
Y si le pasas UPX despues de compilar?

Saludos!


Título: Re: PE mas PEqueños..
Publicado por: Vaagish en 7 Mayo 2014, 22:38 pm
No me reconoce el formato dice..  :huh: Creo que se podria editar a mano... pero existiendo herramientas no me quiero complicar con cada programa..



Título: Re: PE mas PEqueños..
Publicado por: Eternal Idol en 8 Mayo 2014, 16:39 pm
¿Ya probaste a pasarle ese parametro al linker? En principio es el mismo ...

ml /c /Cp /coff archivo.asm
link /merge:.rdata=.text archivo.obj


Título: Re: PE mas PEqueños..
Publicado por: Vaagish en 8 Mayo 2014, 20:04 pm
Citar
¿Ya probaste a pasarle ese parametro al linker? En principio es el mismo ...

ml /c /Cp /coff archivo.asm
link /merge:.rdata=.text archivo.obj

Casi.. el comando lo entiende, pero rompe el archivo.. quedaría así:

ml /c /Cp /coff archivo.asm
link /subsystem:windows /merge:.rdata=.text archivo.obj

No reduce mucho igual.. alguna herramienta que modifique los campos del PEB y redimensione no hay? Esta bien lo que digo, no? Si cambiamos el tamaño de las secciones hay que modificar el PEB, verdad?

Saludos! Gracias!


Título: Re: PE mas PEqueños..
Publicado por: Eternal Idol en 9 Mayo 2014, 10:34 am
Casi.. el comando lo entiende, pero rompe el archivo.. quedaría así:

ml /c /Cp /coff archivo.asm
link /subsystem:windows /merge:.rdata=.text archivo.obj

No reduce mucho igual.. alguna herramienta que modifique los campos del PEB y redimensione no hay? Esta bien lo que digo, no? Si cambiamos el tamaño de las secciones hay que modificar el PEB, verdad?

El mio funciona bien, es muy elemental, apenas emula RtlGetCurrentPeb y llama a MessageBox con la linea de comandos: 1024 bytes. ¿Que tamaño tiene tu ejecutable y como se rompe exactamente?

link /merge:.data=.text /merge:.rdata=.text

PD. El PEB es una estructura en memoria, el PE es el formato del binario.


Título: Re: PE mas PEqueños..
Publicado por: x64core en 9 Mayo 2014, 11:28 am
Imposible, no es posible eliminar ningun campo del PE. talvez ajustar el DOS stub pero apuesto que te ahorras solamente unos bytes, juntar
todas las secciónes a formar una sola, Filealignment, etc habria que ver el ejecutable. En fin, lejos de recudir por medio de las caberas
al contrario se puede incrementar.

Por cierto ¿Cuanto es el tamaño del ejecutable 40kb? ¿Adonde se piensa ejecutar? en un S.O de disquette?


Título: Re: PE mas PEqueños..
Publicado por: Vaagish en 9 Mayo 2014, 20:15 pm
Ayer @Lord Pei me sugirió que trate de quitar la sección .data, con eso se redujo 50Kb,, el único problema es que tengo la cadena "cmd.exe" que estoy tratando de colocarla dentro del código..

Ahora con unas modificaciones me dejo juntar la sección data (no rdata) y se redujo 1024 bytes. Un lujo!

Citar
¿Que tamaño tiene tu ejecutable y como se rompe exactamente?
Citar
Por cierto ¿Cuanto es el tamaño del ejecutable 40kb? ¿Adonde se piensa ejecutar? en un S.O de disquette?

Jeje,, no.. pero va a ir metido dentro de un .mp3 el código.. igual lo estoy achicando para ver hasta donde se puede dejar.. Ahora pesa 1,50 KB y lo puedo dejar en 1 si logro sacar ese "cmd.exe" y juntar el .rdata, igual creo que ahora se ajusta mas a lo que tiene de codigo real y el tamaño..

Citar
PD. El PEB es una estructura en memoria, el PE es el formato del binario.
Si, verdad.. pifie yo.

Citar
Imposible, no es posible eliminar ningun campo del PE. talvez ajustar el DOS stub pero apuesto que te ahorras solamente unos bytes, juntar
todas las secciónes a formar una sola, Filealignment, etc habria que ver el ejecutable. En fin, lejos de recudir por medio de las caberas
al contrario se puede incrementar.
El Filealignament me puede servir.. hay una forma de hacerlo que no recuerdo.. igual como decis, quizas no se gane mucho..

Saludos!! Gracias!


Título: Re: PE mas PEqueños..
Publicado por: Eternal Idol en 9 Mayo 2014, 20:30 pm
Ahora con unas modificaciones me dejo juntar la sección data (no rdata) y se redujo 1024 bytes. Un lujo!

Jeje,, no.. pero va a ir metido dentro de un .mp3 el código.. igual lo estoy achicando para ver hasta donde se puede dejar.. Ahora pesa 1,50 KB y lo puedo dejar en 1 si logro sacar ese "cmd.exe" y juntar el .rdata, igual creo que ahora se ajusta mas a lo que tiene de codigo real y el tamaño..

Si, ahi te deje la linea para juntar los 3 en 1.

El Filealignament me puede servir.. hay una forma de hacerlo que no recuerdo.. igual como decis, quizas no se gane mucho..

Eso si me jodio el ejecutable, al menos en Windows 7 x64 no funciona (es /align:16 por ejemplo).


Título: Re: PE mas PEqueños..
Publicado por: x64core en 9 Mayo 2014, 20:46 pm
Ayer @Lord Pei me sugirió que trate de quitar la sección .data, con eso se redujo 50Kb,, el único problema es que tengo la cadena "cmd.exe" que estoy tratando de colocarla dentro del código..

Ahora con unas modificaciones me dejo juntar la sección data (no rdata) y se redujo 1024 bytes. Un lujo!

Jeje,, no.. pero va a ir metido dentro de un .mp3 el código.. igual lo estoy achicando para ver hasta donde se puede dejar.. Ahora pesa 1,50 KB y lo puedo dejar en 1 si logro sacar ese "cmd.exe" y juntar el .rdata, igual creo que ahora se ajusta mas a lo que tiene de codigo real y el tamaño..
Si, verdad.. pifie yo.
El Filealignament me puede servir.. hay una forma de hacerlo que no recuerdo.. igual como decis, quizas no se gane mucho..

Saludos!! Gracias!
El código dentro de un .mp3 seria entonces la imagen PE o sólo el código? Sino pues apostaria a generar una shellcode.
Además es la cadena "cmd.exe" constante? de ser así puede ir en rdata definiendola como constante así el compilador no la agregaria en .data.

Si, ahi te deje la linea para juntar los 3 en 1.

Eso si me jodio el ejecutable, al menos en Windows 7 x64 no funciona (es /align:16 por ejemplo).
¿Cómo Filealignament pudo joder el ejecutable? No me referia a dejarlo a cero... se puede modificar si es mayor de 0x200.


Título: Re: PE mas PEqueños..
Publicado por: Vaagish en 9 Mayo 2014, 21:07 pm
Citar
El código dentro de un .mp3 seria entonces la imagen PE o sólo el código? Sino pues apostaria a generar una shellcode.
Además es la cadena "cmd.exe" constante? de ser así puede ir en rdata definiendola como constante así el compilador no la agregaria en .data.

Vos decís de meter los opcodes dentro del mp3? Se podria, no? Igual quiero tener un ejecutable "a mano" por las dudas,, para poder hacer otras cosas con el.. y siempre lo podría pasar a opcode..
Mal yo: (ando distraído hoy) la sección que me deja juntar es la .rdata y no .data como dije hoy.. la cadena es constante si.. pensé en hacer algo así:

.cadena:
       db "cmd.exe", 0

Citar
¿Cómo Filealignament pudo joder el ejecutable? No me referia a dejarlo a cero... se puede modificar si es mayor de 0x200.
Por ahi lei a otros que tenian el mismo problema,, a mi con align:16 me lo redujo 10 bytes, no es mucho pero suma.. y con align:4 lo redujo 12 bytes.. me gustaria mantener la portabilidad.. asi que si no funciona en win7 x64, no lo uso...

Saludos!


Título: Re: PE mas PEqueños..
Publicado por: Eternal Idol en 9 Mayo 2014, 21:08 pm
Con /align:512:

eax=77452070 ebx=7745206c ecx=00000001 edx=7745206c esi=7efde000 edi=7efdd000
eip=77395321 esp=0018fcb8 ebp=0018fd00 iopl=0         nv up ei pl zr na pe nc
cs=0023  ss=002b  ds=002b  es=002b  fs=0053  gs=002b             efl=00000246
ntdll!_LdrpInitialize+0x73:
77395321 e8ab1c0000      call    ntdll!LdrpInitializeProcess (77396fd1)

0:000> p
eax=c0000018 ebx=7745206c ecx=761b4fc4 edx=00000000 esi=7efde000 edi=7efdd000
eip=77395326 esp=0018fcc0 ebp=0018fd00 iopl=0         nv up ei pl zr na pe nc
cs=0023  ss=002b  ds=002b  es=002b  fs=0053  gs=002b             efl=00000246

0:000> !error c0000018
Error code: (NTSTATUS) 0xc0000018 (3221225496) - {Conflicting Address Range}  The specified address range conflicts with the address space.

Viene de ntdll!LdrpWx86FormatVirtualImage, a su vez de ntdll!Wow64LdrpWx86FormatVirtualImage y por ntdll!LdrpWx86DetectSectionOverlap. Es un programa de 32 bits en un Windows 7 de x64 ...


Título: Re: PE mas PEqueños..
Publicado por: Vaagish en 9 Mayo 2014, 21:15 pm
Citar
s un programa de 32 bits en un Windows 7 de x64 ...
Pero debería funcionar.., igual no entiendo.. con align 512 no queda mas grande??

Citar
Vos decís de meter los opcodes dentro del mp3? Se podria, no?

Me cite a mi mismo para preguntar.. igual tendria que tener la cabecera MZ y todo lo correspondiente a un ejecutable en opcodes,, seria como la imagen al final...  :¬¬

Salute!


Título: Re: PE mas PEqueños..
Publicado por: x64core en 9 Mayo 2014, 21:24 pm
Vos decís de meter los opcodes dentro del mp3? Se podria, no? Igual quiero tener un ejecutable "a mano" por las dudas,, para poder hacer otras cosas con el.. y siempre lo podría pasar a opcode..
Mal yo: (ando distraído hoy) la sección que me deja juntar es la .rdata y no .data como dije hoy.. la cadena es constante si.. pensé en hacer algo así:

.cadena:
       db "cmd.exe", 0
Por ahi lei a otros que tenian el mismo problema,, a mi con align:16 me lo redujo 10 bytes, no es mucho pero suma.. y con align:4 lo redujo 12 bytes.. me gustaria mantener la portabilidad.. asi que si no funciona en win7 x64, no lo uso...

Saludos!
Pues habria que ver cual es tu idea si esperas que los opcodes sean ejecutados como instrucciones habria que pensarlo :)

Con /align:512:

eax=77452070 ebx=7745206c ecx=00000001 edx=7745206c esi=7efde000 edi=7efdd000
eip=77395321 esp=0018fcb8 ebp=0018fd00 iopl=0         nv up ei pl zr na pe nc
cs=0023  ss=002b  ds=002b  es=002b  fs=0053  gs=002b             efl=00000246
ntdll!_LdrpInitialize+0x73:
77395321 e8ab1c0000      call    ntdll!LdrpInitializeProcess (77396fd1)

0:000> p
eax=c0000018 ebx=7745206c ecx=761b4fc4 edx=00000000 esi=7efde000 edi=7efdd000
eip=77395326 esp=0018fcc0 ebp=0018fd00 iopl=0         nv up ei pl zr na pe nc
cs=0023  ss=002b  ds=002b  es=002b  fs=0053  gs=002b             efl=00000246

0:000> !error c0000018
Error code: (NTSTATUS) 0xc0000018 (3221225496) - {Conflicting Address Range}  The specified address range conflicts with the address space.

Viene de ntdll!LdrpWx86FormatVirtualImage, a su vez de ntdll!Wow64LdrpWx86FormatVirtualImage y por ntdll!LdrpWx86DetectSectionOverlap. Es un programa de 32 bits en un Windows 7 de x64 ...

Pero /align establece SectionAlignment no FileAlignment.

-

El SectionAlignment no altera absolutamente en nada la imagen PE respecto al tamaño este tiene otra relación sobre la carga de la imagen.
Me refiero a FileAlignment ya que algunos compiladores agregan un valor mayor a 0x200 de ser así es posible modificarlo sino problemas de alineamiento
de datos como suele pasar en x64.




Título: Re: PE mas PEqueños..
Publicado por: Eternal Idol en 9 Mayo 2014, 21:41 pm
Ah, me confundi con el otro alignment entonces (en realidad nunca use el que mencionas vos), pero si afecta al tamaño, con /align:4 mi misero ejecutable tiene 592 bytes.


Título: Re: PE mas PEqueños..
Publicado por: Vaagish en 9 Mayo 2014, 21:53 pm
Citar
con /align:4 mi misero ejecutable tiene 592 bytes.
Pero lo estropea, no?

Yo ahora lo deje en 1.34Kb, y creo que no le puedo ganar mucho mas.. aun hay mucho db 00 .. pero tengo declaradas 4 estructuras.. calculo que es ese el espacio.. o es un bolazo eso?

Citar
.data?
   _Wsadata       WSADATA <>
   _Sockaddrin      sockaddr_in <>
   _Processinfo   PROCESS_INFORMATION <>
   _StartupinfoA   STARTUPINFOA <>


Título: Re: PE mas PEqueños..
Publicado por: xv0 en 9 Mayo 2014, 21:59 pm
Puedes colocar la cadena "cmd.exe" incluso en .text, siempre y cuando no escribas en ella, y se ejecute, por que genera un bad opcode.

Código
  1. .section .text
  2. .globl _start
  3.  
  4. .cadena: db "cmd.exe", 0
  5.  
  6. _start:
  7.  
  8. // code

Asi te puedes ahorrar alguna section, eso se usa para las shellcodes.

Un saludo.


Título: Re: PE mas PEqueños..
Publicado por: Eternal Idol en 9 Mayo 2014, 22:24 pm
Pero lo estropea, no?

En el entorno que mencione si, no me funciona.

Yo ahora lo deje en 1.34Kb, y creo que no le puedo ganar mucho mas.. aun hay mucho db 00 .. pero tengo declaradas 4 estructuras.. calculo que es ese el espacio.. o es un bolazo eso?

Depende, investiga con dumpbins (/headers, /all, /disasm, etc.) como va quedando tu ejecutable.


Título: Re: PE mas PEqueños..
Publicado por: x64core en 9 Mayo 2014, 22:29 pm
Ah, me confundi con el otro alignment entonces (en realidad nunca use el que mencionas vos), pero si afecta al tamaño, con /align:4 mi misero ejecutable tiene 592 bytes.
Esta bien, estaba viendo eso de SectionAlignment ya que teoricamente y logicamente no deberia afectar el tamaño de la imagen y
noté que es afectada ya que FileAlignment no puede ser mayor a SectionAlignment por obvias razones y por eso FileAlignment es
alterado también. Además estaba en VC++ y nisiquiera me deja compilar con Align:4 lo min es Align:16... link.exe... :)

Por cierto, lo min valido en Winx64 fue de 1024 bytes alguien da menos ^^
Estoy viendo si lo hago manualmente puede que talvez reduzca algunos bytes...


Título: Re: PE mas PEqueños..
Publicado por: Eternal Idol en 9 Mayo 2014, 22:34 pm
Claro, aunque en realidad todos estos son parametros para el enlazador - el/los obj tienen todas las secciones y el enlazador puede mezclarlas por ej. - y en principio se usa el mismo (linker.exe).


Título: Re: PE mas PEqueños..
Publicado por: x64core en 9 Mayo 2014, 22:38 pm
y en principio se usa el mismo (linker.exe).
Pues eso mismo pensaba ya que alveces suelo usar el linker que viene con el WDK pero en VS 2012 no me permite compilar con /align:4...

PD. Desde el IDE no he probado desde linea de comandos ^^


Título: Re: PE mas PEqueños..
Publicado por: Vaagish en 9 Mayo 2014, 23:18 pm
Citar
Puedes colocar la cadena "cmd.exe" incluso en .text, siempre y cuando no escribas en ella, y se ejecute, por que genera un bad opcode.

En masm no hay sección ".text", creo que el equivalente seria le sección ".code",, igual lo que decis es correcto, aunque no te lo permite en una sola linea, quedaría la etiqueta primero y abajo el db "valor", 0. Lo probé, pero al final, usando merge y uniendo todas las partes en una sola, el tamaño no cambia.. por eso creo que no lo puedo reducir mas.. son 1.376 bytes, y tengo 4 estructuras, 5 funciones y algunas instrucciones.. no esta tan mal..

Citar
En el entorno que mencione si, no me funciona.
En conclusión para que sea compatible con x64, no usar Align?  :rolleyes:

Temas resuelto!

Gracias Genios! Saludos!


Título: Re: PE mas PEqueños..
Publicado por: Eternal Idol en 9 Mayo 2014, 23:30 pm
En conclusión para que sea compatible con x64, no usar Align?  :rolleyes:

Si, o siempre usar un ejecutable nativo  ::)


Título: Re: PE mas PEqueños..
Publicado por: xv0 en 10 Mayo 2014, 00:13 am
Ya veo que das el tema por resuleto, asi que no le dare mucha mas cuerda.

No entiendo eso de "no te lo permite en una sola linea", yo puedo añadir los bytes que quiera en cualquier parte de .text ".code".

Al no utilizar .data ami me bajo algo de peso, pero no mucho, igual que las estructuras tambien puedes ponerlas en ".code", normalmente todos esos datos se ponen al final del code para que estos no se ejecuten.

Tambien te recuerdo de que yo creo el binario con el formato ELF, cosa que a este le puedes modificar todo, hasta reducir el tamaño de las secciones. Pero como trata de Windows esto no viene al caso.

Un saludo.


Título: Re: PE mas PEqueños..
Publicado por: Vaagish en 10 Mayo 2014, 01:04 am
Citar
No entiendo eso de "no te lo permite en una sola linea", yo puedo añadir los bytes que quiera en cualquier parte de .text ".code".

En realidad es un tema de sintaxis.. ej:

Código
  1. cadena: db "cmd.exe", 0 -> db syntax error

Pero si lo hago asi:

Código
  1. cadena:
  2.     db "cmd.exe", 0

No es porque no se pueda.. es un tema de sintaxis nomas..
Ya corrobore que los db que quedan en el código son las estructuras,, así que no se puede reducir mas, y si se puede serán unos bytes.. no me caliento mas jaja

Me parece que el formato ELF es menos exigente con el formato.. en win, un cambio inesperado y se pudre el PE..  :rolleyes: