Función Dlsym() 3 C

“Linux diseñó muchas de sus características únicas para realizar tareas rutinarias. La función dlsym() es una de ellas. El objetivo de la función dlsym() es encontrar la dirección de un símbolo definido especificado en una DLL (Biblioteca de enlaces dinámicos) expuesta a través de una llamada a la función dlopen(). Después de cargar el archivo de objeto compartido dinámico (Biblioteca de vínculos comunes) especificado por el nombre de archivo de cadena terminado en nulo, la función dlopen() devuelve una «conexión» anónima para el objeto cargado. El símbolo nombrado se busca en la biblioteca de enlaces dinámicos (DLL) llamada por el método dlopen(). En este artículo hablaremos sobre el uso de dlsym(). Si el símbolo deseado no existe en esta DLL, entonces se buscan las DLL dependientes de esta DLL, luego todas las dependencias de estas y así sucesivamente hasta encontrar el símbolo deseado o se han buscado todas las DLL para este fin. Aunque no se determina el orden en que se buscan las DLL dependientes en el mismo nivel, este orden de búsqueda determina cómo se identifican los símbolos duplicados en diferentes DLL. Tenga en cuenta que las bibliotecas dinámicas dependientes descargadas no se cargan como resultado de una búsqueda dlsym() de archivos DLL dependientes. Solo se escanean las DLL cargadas como un componente de las DLL dependientes de la llamada dlopen()».
RTLD_AHORA: Si la colección completa de archivos DLL dependientes debe estar disponible para llamadas posteriores a la función dlsym(), esta marca se usa para llamar a bibliotecas de vínculos dinámicos.
RTLD_LAZY: Con este indicador no podemos determinar qué bibliotecas de vínculos dinámicos dependientes se cargan, no se sabe.
RTLD GLOBAL: Las bibliotecas recargadas pueden usar los símbolos especificados por este paquete para la determinación de símbolos.
RTLD_LOCAL: Dado que no se menciona ninguna de las banderas, esto es lo contrario de RTLD GLOBAL y el valor predeterminado. Esta es la sintaxis del comando dlsym(): #include # void *dlsym(void *__restrict__ manejador, const char *__restrict__ símbolo_nombre); El archivo de encabezado en el que se define la función dlsym() es . «symbol_name» es la cadena que es una representación del nombre del símbolo, y «handler» es el valor obtenido por una llamada a dlopen() (que aún no ha sido devuelto por una solicitud a dlclose()). Se devuelve el valor NULL si el identificador no apunta a una DLL correspondiente abierta por dlopen(). La función dlsym() devuelve el valor NULL si ninguna dll asociada con el controlador coincide con el símbolo nombrado (nombre del símbolo). Cree el archivo dlsym.c usando el editor VIM o cualquier editor de su elección que puede incluir Nano, etc.

Escriba el código dado en la siguiente pantalla en el archivo C creado en el paso anterior. Los archivos de encabezado se incluyen en las primeras cuatro líneas de código en el siguiente código de ejemplo. Luego se inicia la función principal y se crea un puntero de controlador de tipo void dentro de la función principal. La línea de código anterior declara un puntero codificado en caracteres de tipo void. Con eso, llamamos al método dlopen y proporcionamos el indicador RTLD-LAZY junto con la ubicación del archivo .so (un archivo compartido dinámicamente en Linux). La variable del controlador contiene los resultados de dlopen. Al devolver 1, la siguiente línea determina si dlopen cargó correctamente la biblioteca de vínculos dinámicos. En caso de error, el error se escribía en la pantalla y finalizaba la función principal. Después de la expresión condicional, ahora llamamos al método dlerror() para corregir el error existente. Tan pronto como agregamos 1 entero ASCII al símbolo codificado del tipo de carácter que definimos, tiene el valor «puts». En la siguiente línea, la longitud de la cadena se calculó y almacenó en la variable de longitud codificada, que luego se utilizó en el bucle for utilizado para la decodificación. Usamos el terminador «0» para terminar el código después del bucle for. Luego ejecutamos el método dlsym(), pasamos el controlador y los parámetros del código decodificado, y la variable de salida contenía los resultados.

Al llamar a la función dlsym() para compilar un archivo C, el proceso de compilación en un compilador C difiere de un comando de compilación estándar. Construiría el programa con el siguiente comando si estuviera en un archivo llamado dlsym.c: $ gcc -rdynamic -o foo dlsym.c -ldl

Después de una compilación exitosa, se crea el archivo de salida y se le asigna el nombre dlsym.out. Simplemente escriba el comando ./dlsym.out y presione Entrar para ejecutar el archivo de salida. La salida del archivo se muestra en la pantalla del terminal en un sistema operativo UNIX o similar a Linux.

Usando el editor vim, hicimos un pequeño ajuste a las últimas líneas de código en el archivo C. La declaración de impresión al final de la función principal debe reemplazarse con la salida convertida a la función puts. Se agregó el texto en las comillas dobles de la pantalla.

Ahora vuelva a compilar el código y observe el resultado en la pantalla del terminal. sin usar la declaración de impresión, obtenemos la salida en la pantalla con nuestro valor de salida cambiado a la función puts. Aquí está el resultado de este archivo de código en particular que se muestra arriba.

Conclusión

En la sección introductoria de este artículo, analizamos el uso de la función dlsym() 3c para averiguar la dirección de un símbolo definido específico en la DLL. Hemos discutido y elaborado dos ejemplos ilustrativos de C en el sistema operativo Kali Linux para esto. Ambos ejemplos son muy simples y al mismo tiempo muy eficientes y demuestran muy claramente el uso de la función dlsym() para una mejor comprensión.

Deja una respuesta

Tu dirección de correo electrónico no será publicada.