summaryrefslogtreecommitdiff
path: root/src/format
diff options
context:
space:
mode:
Diffstat (limited to 'src/format')
-rw-r--r--src/format/elf/e_elf.c59
-rw-r--r--src/format/exe_format-int.h4
-rw-r--r--src/format/exe_format.c22
-rw-r--r--src/format/exe_format.h12
4 files changed, 97 insertions, 0 deletions
diff --git a/src/format/elf/e_elf.c b/src/format/elf/e_elf.c
index a9eacea..48b4455 100644
--- a/src/format/elf/e_elf.c
+++ b/src/format/elf/e_elf.c
@@ -35,6 +35,13 @@
+/* S'assure qu'une chaîne de caractère tient sur une ligne. */
+extern char *escape_crlf_bin_string(char *);
+
+
+/* Récupère tous les éléments identifiées dans le binaire. */
+size_t get_elf_resolved_items(const elf_format *, char ***, ResolvedType **, uint64_t **);
+
@@ -73,6 +80,7 @@ elf_format *load_elf(const uint8_t *content, off_t length)
EXE_FORMAT(result)->get_def_parts = (get_def_parts_fc)get_elf_default_code_parts;
EXE_FORMAT(result)->find_section = (find_section_fc)find_elf_section_content_by_name;
EXE_FORMAT(result)->get_symbols = (get_symbols_fc)get_elf_symbols;
+ EXE_FORMAT(result)->get_resolved = (get_resolved_fc)get_elf_resolved_items;
EXE_FORMAT(result)->resolve_symbol = (resolve_symbol_fc)resolve_elf_symbol;
memcpy(&result->header, content, sizeof(Elf32_Ehdr));
@@ -264,6 +272,57 @@ size_t get_elf_symbols(const elf_format *format, char ***labels, SymbolType **ty
/******************************************************************************
* *
+* Paramètres : format = informations chargées à consulter. *
+* labels = liste des commentaires à insérer. [OUT] *
+* types = type des symboles listés. [OUT] *
+* offsets = liste des indices des commentaires. [OUT] *
+* *
+* Description : Récupère tous les éléments identifiées dans le binaire. *
+* *
+* Retour : Nombre d'éléments mis en place. *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+size_t get_elf_resolved_items(const elf_format *format, char ***labels, ResolvedType **types, uint64_t **offsets)
+{
+ size_t result; /* Quantité à retourner */
+ size_t i; /* Boucle de parcours */
+ size_t start; /* Point de départ du tour */
+
+ result = format->sym_count + format->str_count;
+
+ *labels = (char **)calloc(result, sizeof(char *));
+ *types = (SymbolType *)calloc(result, sizeof(SymbolType));
+ *offsets = (uint64_t *)calloc(result, sizeof(uint64_t));
+
+ for (i = 0; i < format->sym_count; i++)
+ {
+ (*labels)[i] = strdup(format->symbols[i].name);
+ (*types)[i] = RTP_SECTION;
+ (*offsets)[i] = format->symbols[i].address;
+ }
+
+ start = format->sym_count;
+
+ for (i = 0; i < format->str_count; i++)
+ {
+ (*labels)[start + i] = strndup(format->strings[i].value, format->strings[i].len);
+ (*types)[start + i] = RTP_STRING;
+ (*offsets)[start + i] = format->strings[i].vaddress;
+
+ (*labels)[start + i] = escape_crlf_bin_string((*labels)[start + i]);
+
+ }
+
+ return result;
+
+}
+
+
+/******************************************************************************
+* *
* Paramètres : format = informations chargées à consulter. *
* label = étiquette du symbole si trouvé. [OUT] *
* type = type du symbole trouvé. [OUT] *
diff --git a/src/format/exe_format-int.h b/src/format/exe_format-int.h
index 4dcf1c4..2fdb673 100644
--- a/src/format/exe_format-int.h
+++ b/src/format/exe_format-int.h
@@ -57,6 +57,9 @@ typedef bool (* find_section_fc) (const exe_format *, const char *, off_t *, off
/* Récupère tous les symboles présents dans le contenu binaire. */
typedef size_t (* get_symbols_fc) (const exe_format *, char ***, SymbolType **, uint64_t **);
+/* Récupère tous les symboles présents dans le contenu binaire. */
+typedef size_t (* get_resolved_fc) (const exe_format *, char ***, ResolvedType **, uint64_t **);
+
/* Recherche le symbole correspondant à une adresse. */
typedef bool (* resolve_symbol_fc) (const exe_format *, char **, SymbolType *, uint64_t *);
@@ -71,6 +74,7 @@ struct _exe_format
get_def_parts_fc get_def_parts; /* Liste des parties de code */
find_section_fc find_section; /* Recherche d'une section */
get_symbols_fc get_symbols; /* Liste des symboles présents */
+ get_resolved_fc get_resolved; /* Liste des éléments présents */
resolve_symbol_fc resolve_symbol; /* Recherche de symboles */
};
diff --git a/src/format/exe_format.c b/src/format/exe_format.c
index bc6cfff..30976f1 100644
--- a/src/format/exe_format.c
+++ b/src/format/exe_format.c
@@ -213,6 +213,28 @@ size_t get_exe_symbols(const exe_format *format, char ***labels, SymbolType **ty
/******************************************************************************
* *
+* Paramètres : format = informations chargées à consulter. *
+* labels = liste des commentaires à insérer. [OUT] *
+* types = type des symboles listés. [OUT] *
+* offsets = liste des indices des commentaires. [OUT] *
+* *
+* Description : Récupère tous les éléments identifiées dans le binaire. *
+* *
+* Retour : Nombre d'éléments mis en place. *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+size_t get_exe_resolved_items(const exe_format *format, char ***labels, ResolvedType **types, uint64_t **offsets)
+{
+ return format->get_resolved(format, labels, types, offsets);
+
+}
+
+
+/******************************************************************************
+* *
* Paramètres : format = informations chargées à consulter. *
* label = étiquette du symbole si trouvé. [OUT] *
* type = type du symbole trouvé. [OUT] *
diff --git a/src/format/exe_format.h b/src/format/exe_format.h
index 53257fb..9be91fb 100644
--- a/src/format/exe_format.h
+++ b/src/format/exe_format.h
@@ -69,6 +69,15 @@ typedef enum _SymbolType
} SymbolType;
+/* Types de symbole */
+typedef enum _ResolvedType
+{
+ RTP_SECTION, /* Simple morceau de code */
+ RTP_STRING /* Chaîne de caractères */
+
+} ResolvedType;
+
+
/* Recherche une section donnée au sein de binaire. */
bool find_exe_section(const exe_format *, const char *, off_t *, off_t *, uint64_t *);
@@ -76,6 +85,9 @@ bool find_exe_section(const exe_format *, const char *, off_t *, off_t *, uint64
/* Récupère tous les symboles présents dans le contenu binaire. */
size_t get_exe_symbols(const exe_format *, char ***, SymbolType **, uint64_t **);
+/* Récupère tous les éléments identifiées dans le binaire. */
+size_t get_exe_resolved_items(const exe_format *, char ***, ResolvedType **, uint64_t **);
+
/* Recherche le symbole correspondant à une adresse. */
bool resolve_exe_symbol(const exe_format *, char **, SymbolType *, uint64_t *);