Red de conocimientos turísticos - Conocimientos sobre calendario chino - Nombre del capítulo en ELF después del enlace dinámico

Nombre del capítulo en ELF después del enlace dinámico

Después de realizar enlaces dinámicos en So, leí el archivo ELF y descubrí que no se podía leer la lista de nombres en el encabezado de la sección. Es decir, el nombre del capítulo correspondiente no se puede encontrar en EShdr basado en e_shstrndx.

Sin embargo, en readelf -a lib.so, puede leer el nombre de la sección según el encabezado de la sección.

Los resultados son los siguientes:

Tanto shstrtab como strtab son de tipo STRTAB, pero shstrtab solo guarda el nombre del capítulo, mientras que strtab contiene otros nombres de variables, nombres de símbolos, etc.

Ejecute readelf -a lib.so.

Registro de ejecución:

Resultados después de la ejecución:

La dirección SHDR calculada por e_shoff excede la dirección cargada por So.

SHDR - Dirección de fin de página de libart.so = 7530b55520 - 7530a14000 = 141520.

Los enlaces dinámicos en tiempo de ejecución cargarán archivos en So según la segmentación, porque espera utilizar la menor cantidad de páginas de memoria posible y aumentar la velocidad de carga.

Entonces, cuando miro el encabezado del programa, veo que solo la tabla de cadenas .dynstr está cargada en la memoria en el segmento de tipo LOAD.

En otras palabras:

Cuando So está vinculado dinámicamente a la memoria, las tablas .shstrtab y .strtab no se cargan en la memoria. ld solo carga la tabla .dynstr y eso es suficiente.

Y desde una perspectiva de implementación, ELF no necesariamente tiene una tabla de títulos de capítulos.

Y un capítulo puede pertenecer a varias secciones:

Del título del capítulo:

Puedes ver que strtab va seguido de shstrtab:

395ac + 170c = 3acb8

Abra IDA Pro, puede ver que 395ac en el archivo es la tabla de cadenas de strtab:

Y 3acb8 en el archivo es el nombre del encabezado de sección es una cadena:

El nombre del encabezado de la sección es una cadena:

Las tablas shstrtab y strtab solo se guardan en el archivo So después de la vinculación, pero no se guardan después de la vinculación. Cargado en la memoria de la capa de vista de ejecución.

En readelf, el programa buscará el nombre de la sección en el archivo según el desplazamiento de la tabla shstrtab y luego generará el texto.

Además, en la vista de ejecución, es posible que no haya SHDR, por lo que puede buscar el nombre de la sección en el archivo vinculado por el desplazamiento en el SHDR, pero después de cargarlo en la memoria, puede no se puede ejecutar SHDR busca el nombre de la sección en la vista.

En el artículo Android GOT Hook, la tabla GOT está enganchada. El método para encontrar la tabla GOT es usar el encabezado de sección y shstr para encontrar el desplazamiento de la tabla Got correspondiente.

En mis pruebas, descubrí que esta solución no es factible en tiempo de ejecución y es posible que no sea posible cargar los encabezados de las secciones después del enlace dinámico, porque la carga de los encabezados de las secciones es opcional, posiblemente se carguen algunas ROM. encabezados de sección, otros no.

En el artículo " Regiones en ELF que se pueden modificar sin afectar la ejecución ", estoy de acuerdo con este punto de vista. Debido a que el encabezado del programa ya determina las partes que deben cargarse, el encabezado parcial existe solo para leer archivos ELF, lo cual es una forma conveniente de leer archivos ELF. Reducir la carga también reduce las pérdidas de memoria y asignación de archivos.

Entonces, para el desplazamiento de la tabla Got, puede leer el desplazamiento de la tabla Got a través de readelf en tiempo estático y obtener la dirección de la tabla Got en tiempo de ejecución sumando la dirección base más el desplazamiento. . Implementación de ganchos de tabla GOT en Android Este artículo presenta 3 métodos de implementación de ganchos de tabla Got.

er>