Como cifrar llamadas a las funciones en programa C

Iniciado por gxg, 15 Abril 2011, 13:01 PM

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

gxg

Si abro un ejecutable compilado por C en modo te texto, y este tiene llamadas a la api de windows, al final del texto aparecen todas estas funciones.

¿hay alguna forma de ocultar esto?


D4RIO

Si, pero no del todo. Si algo de información de este tipo queda oculta en el ejecutable, deberá existir una forma de que el ejecutable lo desenrede (desencripte) cuando se ejecute, y por ende, la forma de desencriptarlo estará dentro del código mismo. No será legible a simple vista, pero cualquiera podría descifrarlo.
OpenBSDFreeBSD

gxg

Ya, pero yo lo que estoy preguntando es como se hace eso.

Un string si que lo se cifrar porque es manipulable, pero una llamada a una funcion no se como.

Lo que quiero saber es como se hace esto:

char s[]="lkjashdkljashdklajsd"

Descifrar(s);

//s=="FreeConsole()"

ejecutar(s)//<<==Esto es lo que quiero saber como se hace,

D4RIO

De hecho, no preguntate cómo se hace  :rolleyes: ... preguntaste:
Citar¿hay alguna forma de ocultar esto?

A lo que la rta es "si, hay".

Pero ya que ahora preguntas esto. Puedes simplemente ocultarlo cifrando todo el ejecutable. Busca algun crypter por inet, o escribe uno. Parece poca ayuda, pero ahora conoces la palabra crypter, y te bastará para buscarlo.
OpenBSDFreeBSD

gxg

#4
Lo he cifrado con Themida y aparte de ocupar el doble el ejecutable al final del todo siguen apareciendo las llamadas a la api de wiindows.

Esto es lo que veo:

__gnu_exception_handler@4 ___mingw_CRTStartup _mainCRTStartup _WinMainCRTStartup ___do_sjlj_init __pei386_runtime_relocator __fpreset _initialized ___do_global_dtors ___do_global_ctors pseudo-reloc-list.c _w32_atom_suffix ___w32_sharedptr_default_unexpected ___w32_sharedptr_get dw2_object_mutex.0 dw2_once.1 sjl_fc_key.2 sjl_once.3 ___w32_sharedptr_initialize ___eprintf ___sjlj_init_ctor ___RUNTIME_PSEUDO_RELOC_LIST__ __imp___setmode __data_start__ ___DTOR_LIST__ __imp___onexit __head_libwinmm_a ___p__fmode _SetUnhandledExceptionFilter@4 ___w32_sharedptr_terminate ___tls_start__ __libmsvcrt_a_iname __imp__FindAtomA@4 __imp__abort __size_of_stack_commit__ __size_of_stack_reserve__ __major_subsystem_version__ __imp__GetAsyncKeyState@4 ___crt_xl_start__ _AddAtomA@4 ___crt_xi_start__ ___chkstk ___crt_xi_end__ __imp__AllocConsole@0 __imp____p__environ __head_libuser32_a __imp___iob __libmoldname_a_iname __bss_start__ ___RUNTIME_PSEUDO_RELOC_LIST_END__ __size_of_heap_commit__ ___p__environ ___crt_xp_start__ ___crt_xp_end__ __imp__signal __minor_os_version__ __imp__atexit __head_libmsvcrt_a __image_base__ __section_alignment__ __head_libmoldname_a __RUNTIME_PSEUDO_RELOC_LIST__ __imp____p__fmode _ExitProcess@4 __data_end__ ___getmainargs ___w32_sharedptr __CTOR_LIST__ ___set_app_type __bss_end__ __CRT_fmode __imp__scanf ___crt_xc_end__ ___crt_xc_start__ ___CTOR_LIST__ __imp__GetAtomNameA@12 _AllocConsole@0 _mciSendStringA@16 __imp__system __file_alignment__ __imp__malloc __major_os_version__ __imp__itoa __DTOR_LIST__ __imp__fprintf __imp__fclose __size_of_heap_reserve__ ___crt_xt_start__ __subsystem__ __imp__fflush __libwinmm_a_iname _FreeConsole@0 ___w32_sharedptr_unexpected __imp__fopen __imp____getmainargs ___tls_end__ __imp__ExitProcess@4 __imp__free __imp__SetUnhandledExceptionFilter@4 __major_image_version__ __loader_flags__ __libuser32_a_iname __CRT_glob __setmode __imp__AddAtomA@4 __head_libkernel32_a __imp___cexit __minor_subsystem_version__ __minor_image_version__ __imp____set_app_type __imp__mciSendStringA@16 _FindAtomA@4 __imp__sleep _GetAtomNameA@12 __RUNTIME_PSEUDO_RELOC_LIST_END__ __libkernel32_a_iname _GetAsyncKeyState@4 __imp__FreeConsole@0 ___crt_xt_end__


¿Entonces no hay ninguna forma de ejecutar una llamada a una funcion que este guardada en un string?

D4RIO

Primero:
¿Son las mismas llamadas? Obviamente el crypter usara llamadas al sistema, aunque pocas (si es bueno, sino tendrás que codificar uno mejor)

Segundo:
Hay otra manera, que seria:

a) Abrir las bibliotecas con funciones del linker (no se si en Windows tendrán lo mismo, pero en Unix hay "dlopen", "dlsym", "dlclose"), y obtener los símbolos. En el caso sería con dlsym, que recibe como parámetro el nombre del símbolo.
b) Guardas los nombres de los simbolos cifrados como te guste (es ASCII) y los usas en una funcion cargar_simbolo_encriptado, el que los descifra, y luego los busca y carga.

El resultado sería que tu programa solo llamaría realmente a las funciones del linker, todo lo demas serían pedazos codificados y sin sentido. Tomarian sentido a la hora de cargarse.

OpenBSDFreeBSD