summaryrefslogtreecommitdiff
path: root/src/format
diff options
context:
space:
mode:
Diffstat (limited to 'src/format')
-rw-r--r--src/format/elf/e_elf.c36
-rw-r--r--src/format/elf/e_elf.h2
-rw-r--r--src/format/exe_format-int.h3
-rw-r--r--src/format/exe_format.c45
-rw-r--r--src/format/exe_format.h9
5 files changed, 95 insertions, 0 deletions
diff --git a/src/format/elf/e_elf.c b/src/format/elf/e_elf.c
index a69be68..91e0403 100644
--- a/src/format/elf/e_elf.c
+++ b/src/format/elf/e_elf.c
@@ -106,6 +106,7 @@ elf_format *load_elf(const uint8_t *content, off_t length)
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;
+ EXE_FORMAT(result)->get_all_routines = (get_all_routines_fc)get_all_elf_routines;
memcpy(&result->header, content, sizeof(Elf32_Ehdr));
@@ -394,3 +395,38 @@ bool resolve_elf_symbol(const elf_format *format, char **label, SymbolType *type
return result;
}
+
+
+/******************************************************************************
+* *
+* Paramètres : format = informations chargées à consulter. *
+* count = taille du tableau créé. [OUT] *
+* *
+* Description : Fournit le prototype de toutes les routines détectées. *
+* *
+* Retour : Tableau créé ou NULL si aucun symbole de routine trouvé. *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+bin_routine **get_all_elf_routines(const elf_format *format, size_t *count)
+{
+ bin_routine **result; /* Tableau à retourner */
+ size_t i; /* Boucle de parcours */
+
+ result = (bin_routine **)calloc(format->sym_count, sizeof(bin_routine *));
+ *count = format->sym_count;
+
+ for (i = 0; i < format->sym_count; i++)
+ {
+ result[i] = create_binary_routine();
+
+ set_binary_routine_offset(result[i], format->symbols[i].address);
+ set_binary_routine_name(result[i], strdup(format->symbols[i].name));
+
+ }
+
+ return result;
+
+}
diff --git a/src/format/elf/e_elf.h b/src/format/elf/e_elf.h
index fffeff2..f0c2c12 100644
--- a/src/format/elf/e_elf.h
+++ b/src/format/elf/e_elf.h
@@ -55,6 +55,8 @@ size_t get_elf_symbols(const elf_format *, char ***, SymbolType **, uint64_t **)
/* Recherche le symbole correspondant à une adresse. */
bool resolve_elf_symbol(const elf_format *, char **, SymbolType *, uint64_t *);
+/* Fournit le prototype de toutes les routines détectées. */
+bin_routine **get_all_elf_routines(const elf_format *, size_t *);
diff --git a/src/format/exe_format-int.h b/src/format/exe_format-int.h
index 2fdb673..a882891 100644
--- a/src/format/exe_format-int.h
+++ b/src/format/exe_format-int.h
@@ -63,6 +63,8 @@ typedef size_t (* get_resolved_fc) (const exe_format *, char ***, ResolvedType *
/* Recherche le symbole correspondant à une adresse. */
typedef bool (* resolve_symbol_fc) (const exe_format *, char **, SymbolType *, uint64_t *);
+/* Fournit le prototype de toutes les routines détectées. */
+typedef bin_routine ** (* get_all_routines_fc) (const exe_format *, size_t *);
/* Support générique d'un format d'exécutable */
@@ -76,6 +78,7 @@ struct _exe_format
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 */
+ get_all_routines_fc get_all_routines; /* Liste de routines détectées */
};
diff --git a/src/format/exe_format.c b/src/format/exe_format.c
index 8a03243..be0e1f1 100644
--- a/src/format/exe_format.c
+++ b/src/format/exe_format.c
@@ -178,6 +178,31 @@ void delete_bin_part(bin_part *part)
}
+/******************************************************************************
+* *
+* Paramètres : a = premières informations à consulter. *
+* b = secondes informations à consulter. *
+* *
+* Description : Etablit la comparaison entre deux blocs binaires. *
+* *
+* Retour : Bilan : -1 (a < b), 0 (a == b) ou 1 (a > b). *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+int compare_bin_parts(const bin_part **a, const bin_part **b)
+{
+ int result; /* Bilan à renvoyer */
+
+ if ((*a)->offset < (*b)->offset) result = -1;
+ else if((*a)->offset > (*b)->offset) result = 1;
+ else result = 0;
+
+ return result;
+
+}
+
@@ -378,3 +403,23 @@ bool resolve_exe_symbol(const exe_format *format, char **label, SymbolType *type
return format->resolve_symbol(format, label, type, offset);
}
+
+
+/******************************************************************************
+* *
+* Paramètres : format = informations chargées à consulter. *
+* count = taille du tableau créé. [OUT] *
+* *
+* Description : Fournit le prototype de toutes les routines détectées. *
+* *
+* Retour : Tableau créé ou NULL si aucun symbole de routine trouvé. *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+bin_routine **get_all_exe_routines(const exe_format *format, size_t *count)
+{
+ return format->get_all_routines(format, count);
+
+}
diff --git a/src/format/exe_format.h b/src/format/exe_format.h
index 4fedf13..48cb989 100644
--- a/src/format/exe_format.h
+++ b/src/format/exe_format.h
@@ -30,6 +30,9 @@
#include <sys/types.h>
+#include "../analysis/prototype.h"
+
+
/* ------------------------ MANIPULATION DES PARTIES DE CODE ------------------------ */
@@ -53,6 +56,9 @@ void get_bin_part_values(const bin_part *, off_t *, off_t *, uint64_t *);
/* Supprime de la mémoire une description de partie de code. */
void delete_bin_part(bin_part *);
+/* Etablit la comparaison entre deux blocs binaires. */
+int compare_bin_parts(const bin_part **, const bin_part **);
+
@@ -117,6 +123,9 @@ size_t get_exe_resolved_items(const exe_format *, char ***, ResolvedType **, uin
/* Recherche le symbole correspondant à une adresse. */
bool resolve_exe_symbol(const exe_format *, char **, SymbolType *, uint64_t *);
+/* Fournit le prototype de toutes les routines détectées. */
+bin_routine **get_all_exe_routines(const exe_format *, size_t *);
+
#endif /* _FORMAT_EXE_FORMAT_H */