Un breve análisis de los archivos ELF
Prólogo: En el flujo de trabajo inverso, entraremos en contacto con archivos so y, bajo determinadas circunstancias, procesaremos archivos so. Desde la perspectiva del archivo, también pertenece al archivo ELF. Analicemos el archivo so desde la perspectiva de los archivos ELF.
Los archivos ELF se dividen aproximadamente en 3 partes principales
1. ELF HEAD --Parte del encabezado del archivo ELF
2. Tabla de encabezados del programa --Tabla de encabezados del programa
3. Tabla de encabezados de sección: tabla de encabezados de sección
Esta parte se llama "encabezado" y describe aproximadamente la organización de este archivo. Tales como: archivo mágico, sistema de arquitectura de destino (como ARM, X86...), información de versión, tamaño de cada parte, dirección inicial desplazada de cada parte, etc.
Las posiciones que se describen a continuación son todas fijas y las posiciones siguen inmediatamente a la siguiente parte. (Señale cualquier error)
Aquí estoy usando el archivo android_server de IDA como demostración para ver brevemente parte del contenido.
Información de identificación del archivo (e_ident): primeros 16 bytes (incluida la parte mágica: primeros 4 bytes como .ELF)
Tipo de archivo (e_type): 2 bytes
p >Arquitectura de destino (e_machine): 2 bytes
Versión (e_version): 4 bytes
Dirección virtual de entrada del programa (e_entry): 4 bytes
Dirección de desplazamiento de la tabla de encabezado del programa (e_phoff): 4 bytes
Dirección de desplazamiento de la tabla de encabezado de sección (e_shoff): 4 bytes
Guardar y archivar Indicadores relacionados específicos del procesador (e_flags): 4 bytes
Tamaño del encabezado ELF (e_ehsize): 2 bytes
Tamaño de cada tabla de encabezado del programa (e_phentsize): 2 bytes
Número de tablas de encabezado del programa (e_phnum): 2 bytes
Tamaño de cada tabla de encabezado de sección (e_shentsize): 2 bytes
Número de tablas de encabezado de sección (e_shnum): 2 bytes
Posición de la tabla de cadenas de sección (e_shstrndx): 2 bytes
... ...
La tabla de encabezado del programa describe la información de cada segmento del programa.
Veamos un ejemplo aquí
Por ejemplo, el encabezado del programa, la primera parte, esta parte describe la información del encabezado del programa, como tipo, tamaño, desplazamiento. , etc.; esta parte describe la información del encabezado del programa.
El número de secciones de información que hay en un programa depende de esta parte, la tabla de encabezados de secciones.
La más clásica es la información de función exportada aquí.