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. 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 sonSería lo mismo que meter un shellcode en un EXE... Aunque no estoy seguro de si esto es lo que quieres hacer. 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. Bueno en x64 es fastcall y si hace pre reserva, aquí esta mi código por si las dudas: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 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... |