summaryrefslogtreecommitdiff
path: root/src/format/elf
diff options
context:
space:
mode:
Diffstat (limited to 'src/format/elf')
-rw-r--r--src/format/elf/elf.c135
-rw-r--r--src/format/elf/elf_def.h25
-rw-r--r--src/format/elf/program.c51
-rw-r--r--src/format/elf/program.h5
-rw-r--r--src/format/elf/symbols.c6
5 files changed, 213 insertions, 9 deletions
diff --git a/src/format/elf/elf.c b/src/format/elf/elf.c
index 158a6b6..6807e36 100644
--- a/src/format/elf/elf.c
+++ b/src/format/elf/elf.c
@@ -26,9 +26,13 @@
#include <malloc.h>
#include <stddef.h>
+#include <stdio.h>
#include <string.h>
+#include <i18n.h>
+
+
#include "elf-int.h"
#include "program.h"
#include "section.h"
@@ -39,11 +43,11 @@
-#ifndef _
-# define _(str) (str)
-#endif
+/* Taille maximale d'une description */
+#define MAX_PORTION_DESC 256
+
/* Initialise la classe des formats d'exécutables ELF. */
@@ -58,6 +62,9 @@ static FormatTargetMachine g_elf_format_get_target_machine(const GElfFormat *);
/* Fournit l'adresse mémoire du point d'entrée du programme. */
static vmpa_t g_elf_format_get_entry_point(const GElfFormat *);
+/* Etend la définition des portions au sein d'un binaire. */
+static void g_elf_format_refine_portions(const GElfFormat *, GBinPortion *);
+
/* Fournit les références aux zones binaires à analyser. */
static GBinPart **g_elf_format_get_parts(const GElfFormat *, size_t *);
@@ -139,6 +146,7 @@ static void g_elf_format_init(GElfFormat *format)
exe_format->get_machine = (get_target_machine_fc)g_elf_format_get_target_machine;
exe_format->get_entry_point = (get_entry_point_fc)g_elf_format_get_entry_point;
+ exe_format->refine_portions = (refine_portions_fc)g_elf_format_refine_portions;
exe_format->get_parts = (get_parts_fc)g_elf_format_get_parts;
exe_format->translate_addr = (translate_addr_fc)g_elf_format_translate_address_into_offset;
@@ -291,6 +299,127 @@ static vmpa_t g_elf_format_get_entry_point(const GElfFormat *format)
/******************************************************************************
* *
* Paramètres : format = informations chargées à consulter. *
+* raw = portion de binaire brut à raffiner. *
+* *
+* Description : Etend la définition des portions au sein d'un binaire. *
+* *
+* Retour : - *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+static void g_elf_format_refine_portions(const GElfFormat *format, GBinPortion *raw)
+{
+ uint16_t i; /* Boucle de parcours */
+ off_t offset; /* Début de part de programme */
+ elf_phdr phdr; /* En-tête de programme ELF */
+ uint32_t p_flags; /* Droits associés à une partie*/
+ const char *background; /* Fond signigicatif */
+ GBinPortion *new; /* Nouvelle portion définie */
+ char desc[MAX_PORTION_DESC]; /* Description d'une portion */
+ PortionAccessRights rights; /* Droits d'une portion */
+ elf_shdr strings; /* Section des descriptions */
+ bool has_strings; /* Section trouvée ? */
+ elf_shdr section; /* En-tête de section ELF */
+ uint64_t sh_flags; /* Droits associés à une partie*/
+ const char *name; /* Nom trouvé ou NULL */
+
+ /* Côté segments basiques */
+
+#if 0
+ for (i = 0; i < ELF_HDR(format, format->header, e_phnum); i++)
+ {
+ offset = ELF_HDR(format, format->header, e_phoff)
+ + ELF_HDR(format, format->header, e_phentsize) * i;
+
+ if (!read_elf_program_header(format, &offset, &phdr))
+ continue;
+
+ p_flags = ELF_PHDR(format, phdr, p_flags);
+
+ if (p_flags & PF_X) background = BPC_CODE;
+ else if (p_flags & PF_W) background = BPC_DATA;
+ else background = BPC_DATA_RO;
+
+ new = g_binary_portion_new(background);
+
+ sprintf(desc, "%s %s",
+ _("Segment"),
+ get_elf_program_type_desc(ELF_PHDR(format, phdr, p_type)));
+
+ g_binary_portion_set_desc(new, desc);
+
+ g_binary_portion_set_values(new,
+ ELF_PHDR(format, phdr, p_offset),
+ ELF_PHDR(format, phdr, p_filesz),
+ ELF_PHDR(format, phdr, p_vaddr));
+
+ rights = PAC_NONE;
+ if (p_flags & PF_R) rights |= PAC_READ;
+ if (p_flags & PF_W) rights |= PAC_WRITE;
+ if (p_flags & PF_X) rights |= PAC_EXEC;
+
+ g_binary_portion_set_rights(new, rights);
+
+ g_binary_portion_include(raw, new);
+
+ }
+#endif
+
+ /* Inclusion des sections, si possible... */
+
+ has_strings = find_elf_section_by_index(format,
+ ELF_HDR(format, format->header, e_shstrndx),
+ &strings);
+
+ for (i = 0; i < ELF_HDR(format, format->header, e_shnum); i++)
+ {
+ if (!find_elf_section_by_index(format, i, &section))
+ continue;
+
+ sh_flags = ELF_SHDR(format, section, sh_flags);
+
+ if (sh_flags & SHF_EXECINSTR) background = BPC_CODE;
+ else if (sh_flags & SHF_WRITE) background = BPC_DATA;
+ else background = BPC_DATA_RO;
+
+ new = g_binary_portion_new(background);
+
+ if (has_strings)
+ name = extract_name_from_elf_string_section(format, &strings,
+ ELF_SHDR(format, section, sh_name));
+ else name = NULL;
+
+ if (name != NULL)
+ sprintf(desc, "%s %s", _("Section"), name);
+ else
+ sprintf(desc, "%s ???", _("Section"));
+
+ g_binary_portion_set_desc(new, desc);
+
+ rights = PAC_NONE;
+ if (sh_flags & SHF_ALLOC) rights |= PAC_READ;
+ if (sh_flags & SHF_WRITE) rights |= PAC_WRITE;
+ if (sh_flags & SHF_EXECINSTR) rights |= PAC_EXEC;
+
+ g_binary_portion_set_rights(new, rights);
+
+ g_binary_portion_set_values(new,
+ ELF_SHDR(format, section, sh_offset),
+ ELF_SHDR(format, section, sh_size),
+ ELF_SHDR(format, section, sh_addr));
+
+ g_binary_portion_include(raw, new);
+
+ }
+
+}
+
+
+/******************************************************************************
+* *
+* Paramètres : format = informations chargées à consulter. *
* count = quantité de zones listées. [OUT] *
* *
* Description : Fournit les références aux zones binaires à analyser. *
diff --git a/src/format/elf/elf_def.h b/src/format/elf/elf_def.h
index dda1b1c..831e4ff 100644
--- a/src/format/elf/elf_def.h
+++ b/src/format/elf/elf_def.h
@@ -2,7 +2,7 @@
/* OpenIDA - Outil d'analyse de fichiers binaires
* elf_def.h - liste des structures et constantes utilisées par le format ELF
*
- * Copyright (C) 2009-2010 Cyrille Bagard
+ * Copyright (C) 2009-2013 Cyrille Bagard
*
* This file is part of OpenIDA.
*
@@ -178,6 +178,28 @@ typedef union _elf_phdr
#define ELF_SIZEOF_PHDR(fmt) (fmt->is_32b ? sizeof(elf32_phdr) : sizeof(elf64_phdr))
+/* Valeurs possibles pour p_type */
+
+#define PT_NULL 0 /* Program header table entry unused */
+#define PT_LOAD 1 /* Loadable program segment */
+#define PT_DYNAMIC 2 /* Dynamic linking information */
+#define PT_INTERP 3 /* Program interpreter */
+#define PT_NOTE 4 /* Auxiliary information */
+#define PT_SHLIB 5 /* Reserved */
+#define PT_PHDR 6 /* Entry for header table itself */
+#define PT_TLS 7 /* Thread-local storage segment */
+#define PT_NUM 8 /* Number of defined types */
+#define PT_LOOS 0x60000000 /* Start of OS-specific */
+#define PT_GNU_EH_FRAME 0x6474e550 /* GCC .eh_frame_hdr segment */
+#define PT_GNU_STACK 0x6474e551 /* Indicates stack executability */
+#define PT_GNU_RELRO 0x6474e552 /* Read-only after relocation */
+#define PT_LOSUNW 0x6ffffffa
+#define PT_SUNWBSS 0x6ffffffa /* Sun Specific segment */
+#define PT_SUNWSTACK 0x6ffffffb /* Stack segment */
+#define PT_HISUNW 0x6fffffff
+#define PT_HIOS 0x6fffffff /* End of OS-specific */
+#define PT_LOPROC 0x70000000 /* Start of processor-specific */
+#define PT_HIPROC 0x7fffffff /* End of processor-specific */
/* Valeurs possibles pour p_flags */
@@ -246,6 +268,7 @@ typedef union _elf_shdr
/* Valeurs possibles pour sh_flags */
+#define SHF_WRITE (1 << 0) /* Accessible en écriture */
#define SHF_ALLOC (1 << 1) /* Copie en mémoire pdt l'exec.*/
#define SHF_EXECINSTR (1 << 2) /* Section exécutable */
#define SHF_STRINGS (1 << 5) /* Contient des chaînes ('\0') */
diff --git a/src/format/elf/program.c b/src/format/elf/program.c
index f55b7c7..48d6d19 100644
--- a/src/format/elf/program.c
+++ b/src/format/elf/program.c
@@ -2,7 +2,7 @@
/* OpenIDA - Outil d'analyse de fichiers binaires
* program.c - gestion des en-têtes de programme d'un ELF
*
- * Copyright (C) 2010 Cyrille Bagard
+ * Copyright (C) 2010-2013 Cyrille Bagard
*
* This file is part of OpenIDA.
*
@@ -30,6 +30,55 @@
/******************************************************************************
* *
+* Paramètres : p_type = type associé à un en-tête de programme. *
+* *
+* Description : Fournit la description humaine d'un type de segment ELF. *
+* *
+* Retour : Désignation prête à emploi. *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+const char *get_elf_program_type_desc(uint32_t p_type)
+{
+ const char *result; /* Description à renvoyer */
+
+#define MAKE_STRING_FROM_PT(pt) case pt: result = #pt; break;
+
+ switch(p_type)
+ {
+ MAKE_STRING_FROM_PT(PT_NULL);
+ MAKE_STRING_FROM_PT(PT_LOAD);
+ MAKE_STRING_FROM_PT(PT_DYNAMIC);
+ MAKE_STRING_FROM_PT(PT_INTERP);
+ MAKE_STRING_FROM_PT(PT_NOTE);
+ MAKE_STRING_FROM_PT(PT_SHLIB);
+ MAKE_STRING_FROM_PT(PT_PHDR);
+ MAKE_STRING_FROM_PT(PT_TLS);
+ MAKE_STRING_FROM_PT(PT_NUM);
+ MAKE_STRING_FROM_PT(PT_LOOS);
+ MAKE_STRING_FROM_PT(PT_GNU_EH_FRAME);
+ MAKE_STRING_FROM_PT(PT_GNU_STACK);
+ MAKE_STRING_FROM_PT(PT_GNU_RELRO);
+ MAKE_STRING_FROM_PT(PT_LOSUNW);
+ MAKE_STRING_FROM_PT(PT_SUNWSTACK);
+ MAKE_STRING_FROM_PT(PT_HIOS);
+ MAKE_STRING_FROM_PT(PT_LOPROC);
+ MAKE_STRING_FROM_PT(PT_HIPROC);
+
+ default:
+ result = "PT_???";
+ break;
+ }
+
+ return result;
+
+}
+
+
+/******************************************************************************
+* *
* Paramètres : format = description de l'exécutable à consulter. *
* index = indice de la section recherchée. *
* program = ensemble d'informations à faire remonter. [OUT] *
diff --git a/src/format/elf/program.h b/src/format/elf/program.h
index 1718ca7..276e720 100644
--- a/src/format/elf/program.h
+++ b/src/format/elf/program.h
@@ -2,7 +2,7 @@
/* OpenIDA - Outil d'analyse de fichiers binaires
* program.h - prototypes pour la gestion des en-têtes de programme d'un ELF
*
- * Copyright (C) 2010 Cyrille Bagard
+ * Copyright (C) 2010-2013 Cyrille Bagard
*
* This file is part of OpenIDA.
*
@@ -30,6 +30,9 @@
+/* Fournit la description humaine d'un type de segment ELF. */
+const char *get_elf_program_type_desc(uint32_t);
+
/* Recherche un programme donné au sein de binaire par indice. */
bool find_elf_program_by_index(const GElfFormat *, uint16_t, elf_phdr *);
diff --git a/src/format/elf/symbols.c b/src/format/elf/symbols.c
index df1b613..50750ae 100644
--- a/src/format/elf/symbols.c
+++ b/src/format/elf/symbols.c
@@ -28,6 +28,9 @@
#include <string.h>
+#include <i18n.h>
+
+
#include "elf-int.h"
#include "helper_x86.h"
#include "section.h"
@@ -38,9 +41,6 @@
-#define _(str) str
-
-
/* Récupère la désignation d'un symbole donné. */