diff options
Diffstat (limited to 'src/format')
-rw-r--r-- | src/format/elf/e_elf.c | 59 | ||||
-rw-r--r-- | src/format/exe_format-int.h | 4 | ||||
-rw-r--r-- | src/format/exe_format.c | 22 | ||||
-rw-r--r-- | src/format/exe_format.h | 12 |
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 *); |