diff options
Diffstat (limited to 'src/format')
-rw-r--r-- | src/format/elf/e_elf.c | 36 | ||||
-rw-r--r-- | src/format/elf/e_elf.h | 2 | ||||
-rw-r--r-- | src/format/exe_format-int.h | 3 | ||||
-rw-r--r-- | src/format/exe_format.c | 45 | ||||
-rw-r--r-- | src/format/exe_format.h | 9 |
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 */ |