Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: x64core en 18 Octubre 2012, 04:35 am



Título: Compilar funcion sin entrypoint
Publicado por: x64core en 18 Octubre 2012, 04:35 am
Hey chicos alguien sabe como puedo compilar una funcion sin establecer entrypoint?
por ejemplo quiero tener en un .exe esta funcion compilada, por escribir un ejemplo:

int test( int a ,int b, int c, int d, int e, int f )
{
     int t1;
     int t2;

     t1 = a + b + c;

     t2 = d + e + t1 + f;

     return t2;
}

utilizando Visual C++ con optimizaciones activadas. Alguien sabe si es posible hacerlo?


PD: Creo que es imposible pero quiero confirmarlo.



Título: Re: Compilar funcion sin entrypoint
Publicado por: MCKSys Argentina en 18 Octubre 2012, 06:12 am
La verdad es que C no C ( :P), pero se me ocurre que podrias compilar la función como quieres que quede. Luego buscas los bytes del codigo generado en el EXE y los metes en el EXE final.

Sería lo mismo que meter un shellcode en un EXE...

Aunque no estoy seguro de si esto es lo que quieres hacer.


Título: Re: Compilar funcion sin entrypoint
Publicado por: x64core en 18 Octubre 2012, 06:17 am
La verdad es que C no C ( :P), pero se me ocurre que podrias compilar la función como quieres que quede. Luego buscas los bytes del codigo generado en el EXE y los metes en el EXE final.

Sería lo mismo que meter un shellcode en un EXE...

Aunque no estoy seguro de si esto es lo que quieres hacer.
Pues para lo quiero haha, además nosé si sabeis bro, pero el compilador de VC cuando tiene todas las opciones de optimizacion activadas, pasa parametros en registros ( y eso que es stdcall ), hace pre reserva de variables locales dentro del llamador que son
parte de la funcion para no hacer doble reserva, etc, etc. no funciona eso.


Título: Re: Compilar funcion sin entrypoint
Publicado por: MCKSys Argentina en 18 Octubre 2012, 06:26 am
Si usa registros no es stdcall. Lo mas probable es que se de cuenta de que la  funcion es interna (osea, solo va a ser llamada por el mismo EXE) y use ese tipo de optimizacion.

Pero para eso necesita saber si o si el entrypoint.

Lo que he visto son optimizaciones pero referentes a las variables locales, las cuales si son definidas como registros sin usar stack (aunque depende del uso que tengan).

Por lo que me dices, está mezclando todos los tipos de convenciones de llamadas que hay en 32 bits, lo cual es un dilema bastante dificil de resolver..  :P


Título: Re: Compilar funcion sin entrypoint
Publicado por: x64core en 18 Octubre 2012, 06:36 am
Si usa registros no es stdcall. Lo mas probable es que se de cuenta de que la  funcion es interna (osea, solo va a ser llamada por el mismo EXE) y use ese tipo de optimizacion.

Pero para eso necesita saber si o si el entrypoint.

Lo que he visto son optimizaciones pero referentes a las variables locales, las cuales si son definidas como registros sin usar stack (aunque depende del uso que tengan).

Por lo que me dices, está mezclando todos los tipos de convenciones de llamadas que hay en 32 bits, lo cual es un dilema bastante dificil de resolver..  :P
Bueno en x64 es fastcall y si hace pre reserva, aquí esta mi código por si las dudas:

00000001`3f3d1050 4883ec48        sub     rsp,48h
00000001`3f3d1054 c744242880000000 mov     dword ptr [rsp+28h],80h
00000001`3f3d105c c744242060000000 mov     dword ptr [rsp+20h],60h
00000001`3f3d1064 41b950000000    mov     r9d,50h
00000001`3f3d106a 41b840000000    mov     r8d,40h
00000001`3f3d1070 ba30000000      mov     edx,30h
00000001`3f3d1075 b910000000      mov     ecx,10h
00000001`3f3d107a e881ffffff      call    image00000001_3f3d0000+0x1000 (00000001`3f3d1000)
00000001`3f3d107f 89442430        mov     dword ptr [rsp+30h],eax
00000001`3f3d1083 8b442430        mov     eax,dword ptr [rsp+30h]
00000001`3f3d1087 4883c448        add     rsp,48h
00000001`3f3d108b c3              ret

00000001`3f3d1000:
00000001`3f3d1000 44894c2420      mov     dword ptr [rsp+20h],r9d
00000001`3f3d1005 4489442418      mov     dword ptr [rsp+18h],r8d
00000001`3f3d100a 89542410        mov     dword ptr [rsp+10h],edx
00000001`3f3d100e 894c2408        mov     dword ptr [rsp+8],ecx
00000001`3f3d1012 4883ec18        sub     rsp,18h
00000001`3f3d1016 8b442428        mov     eax,dword ptr [rsp+28h]
00000001`3f3d101a 8b4c2420        mov     ecx,dword ptr [rsp+20h]
00000001`3f3d101e 03c8            add     ecx,eax
00000001`3f3d1020 8bc1            mov     eax,ecx
00000001`3f3d1022 03442430        add     eax,dword ptr [rsp+30h]
00000001`3f3d1026 89442404        mov     dword ptr [rsp+4],eax
00000001`3f3d102a 8b442440        mov     eax,dword ptr [rsp+40h]
00000001`3f3d102e 8b4c2438        mov     ecx,dword ptr [rsp+38h]
00000001`3f3d1032 03c8            add     ecx,eax
00000001`3f3d1034 8bc1            mov     eax,ecx
00000001`3f3d1036 03442404        add     eax,dword ptr [rsp+4]
00000001`3f3d103a 03442448        add     eax,dword ptr [rsp+48h]
00000001`3f3d103e 890424          mov     dword ptr [rsp],eax
00000001`3f3d1041 8b0424          mov     eax,dword ptr [rsp]
00000001`3f3d1044 4883c418        add     rsp,18h
00000001`3f3d1048 c3              ret

como podréis ver hace una pre reserva que es parte de la función y no hace marco de la pila, y eso que desactivo Omit Frame Pointer, y el compilador
omite muchos comandos por las optimizaciones, así que estoy buscando una forma de hacerlo con las optimizaciones activadas, lo mismo pasa con
programas de 32 bit, me omite muchos comandos como podréis ver.




Título: Re: Compilar funcion sin entrypoint
Publicado por: MCKSys Argentina en 18 Octubre 2012, 06:54 am
Ya veo. Pero entonces, como dije antes, este tipo de optimizaciones solo se deben dar en funciones que  solo sean llamadas desde el EXE (internas).

Si, por ej, fuera un funcion exportada de una DLL, no funcionaria.

Imagino entonces que la optimizacion es para funciones que sean llamadas "estaticamente" (osea, que el compilador pueda resolver) pero no para aquellas que se llamen en forma dinamica.

Osea, si el compilador no puede determinar si la función es llamada directamente desde el código, no le aplica optimizacion.

Aunque habria que verificar esto...